PERFORCE change 85709 for review

Alan Cox alc at FreeBSD.org
Sat Oct 22 12:05:12 PDT 2005


http://perforce.freebsd.org/chv.cgi?CH=85709

Change 85709 by alc at alc_home on 2005/10/22 19:04:57

	Rename buddy_alloc() to buddy_alloc_locked().  Introduce buddy_alloc();
	buddy_alloc() acquires and releases the free page queues lock.

Affected files ...

.. //depot/projects/superpages/src/sys/vm/vm_buddy.c#2 edit
.. //depot/projects/superpages/src/sys/vm/vm_buddy.h#2 edit
.. //depot/projects/superpages/src/sys/vm/vm_page.c#5 edit
.. //depot/projects/superpages/src/sys/vm/vm_reserve.c#2 edit

Differences ...

==== //depot/projects/superpages/src/sys/vm/vm_buddy.c#2 (text+ko) ====

@@ -153,11 +153,25 @@
 }
 
 /*
+ *
+ */
+vm_page_t
+buddy_alloc(int Q, boolean_t prefer_zero)
+{
+	vm_page_t m;
+
+	mtx_lock_spin(&vm_page_queue_free_mtx);
+	m = buddy_alloc_locked(Q, prefer_zero);
+	mtx_unlock_spin(&vm_page_queue_free_mtx);
+	return (m);
+}
+
+/*
  * Attempts to allocate a contiguous chunk of magn pages.
  * Return starting phys_addr of chunk.
  */
 vm_page_t
-buddy_alloc(int Q, boolean_t prefer_zero)
+buddy_alloc_locked(int Q, boolean_t prefer_zero)
 {
 	int q;
 	vm_page_t m;

==== //depot/projects/superpages/src/sys/vm/vm_buddy.h#2 (text+ko) ====

@@ -3,4 +3,5 @@
 void buddy_invariants(char *, int);
 
 vm_page_t buddy_alloc(int magn, boolean_t prefer_zero);
+vm_page_t buddy_alloc_locked(int magn, boolean_t prefer_zero);
 void buddy_free(vm_page_t m, int magn);

==== //depot/projects/superpages/src/sys/vm/vm_page.c#5 (text+ko) ====

@@ -829,7 +829,7 @@
 		 * Allocate from the free queue if the number of free pages
 		 * exceeds the minimum for the request class.
 		 */
-		m = buddy_alloc(0, (req & VM_ALLOC_ZERO) != 0);
+		m = buddy_alloc_locked(0, (req & VM_ALLOC_ZERO) != 0);
 	} else if (page_req != VM_ALLOC_INTERRUPT) {
 		mtx_unlock_spin(&vm_page_queue_free_mtx);
 		/*

==== //depot/projects/superpages/src/sys/vm/vm_reserve.c#2 (text+ko) ====

@@ -509,9 +509,7 @@
 retry:
 	if (free_pool) {
 		/* 1. try free pool at level level or higher */
-		mtx_lock_spin(&vm_page_queue_free_mtx);
 		m = buddy_alloc(SP_ORDER(lev), FALSE);
-		mtx_unlock_spin(&vm_page_queue_free_mtx);
 		if (m != NULL)
 			goto done;
 
@@ -527,9 +525,7 @@
 		while ( (sp = TAILQ_FIRST(&rres[l])) ) {
 			KASSERT(sp->rql==l && sp->rql<sp->level,("preempt_contig_alloc: rql invalid"));
 			preempt(sp, lev, NULL);
-			mtx_lock_spin(&vm_page_queue_free_mtx);
 			m = buddy_alloc(SP_ORDER(lev), FALSE);
-			mtx_unlock_spin(&vm_page_queue_free_mtx);
 			if (m != NULL)
 				goto done;
 		}
@@ -541,9 +537,7 @@
 
 		if (free_pool) {
 			/* 4, 6, 8... */
-			mtx_lock_spin(&vm_page_queue_free_mtx);
 			m = buddy_alloc(SP_ORDER(lev), FALSE);
-			mtx_unlock_spin(&vm_page_queue_free_mtx);
 			if (m != NULL)
 				goto done;
 		}
@@ -552,9 +546,7 @@
 		while ( (sp = TAILQ_FIRST(&rres[lev])) ) {
 			KASSERT(sp->rql==lev && sp->rql<sp->level,("preempt_alloc_contig"));
 			preempt(sp, lev, NULL);
-			mtx_lock_spin(&vm_page_queue_free_mtx);
 			m = buddy_alloc(SP_ORDER(lev), FALSE);
-			mtx_unlock_spin(&vm_page_queue_free_mtx);
 			if (m != NULL)
 				goto done;
 		}


More information about the p4-projects mailing list