PERFORCE change 212958 for review

John Baldwin jhb at FreeBSD.org
Sat Jun 16 16:15:24 UTC 2012


http://p4web.freebsd.org/@@212958?ac=10

Change 212958 by jhb at jhb_jhbbsd on 2012/06/16 16:14:19

	Debugging and test hacks for the problem of write(2) buffers
	reclaiming cache pages instead of free pages.

Affected files ...

.. //depot/projects/fadvise/sys/vm/vm_phys.c#6 edit

Differences ...

==== //depot/projects/fadvise/sys/vm/vm_phys.c#6 (text+ko) ====

@@ -128,6 +128,15 @@
 static void vm_phys_split_pages(vm_page_t m, int oind, struct vm_freelist *fl,
     int order);
 
+static int vm_phys_uncached;
+SYSCTL_INT(_vm, OID_AUTO, phys_uncached, CTLFLAG_RD, &vm_phys_uncached, 0, "");
+static int vm_phys_uc_alloc_pages;
+SYSCTL_INT(_vm, OID_AUTO, phys_uc_alloc_pages, CTLFLAG_RD,
+    &vm_phys_uc_alloc_pages, 0, "");
+static int vm_phys_uc_free_pages;
+SYSCTL_INT(_vm, OID_AUTO, phys_uc_free_pages, CTLFLAG_RD,
+    &vm_phys_uc_free_pages, 0, "");
+
 /*
  * Outputs the state of the physical memory allocator, specifically,
  * the amount of physical memory in each free list.
@@ -495,12 +504,21 @@
 				TAILQ_REMOVE(&alt[oind].pl, m, pageq);
 				alt[oind].lcnt--;
 				m->order = VM_NFREEORDER;
+				if (m->pool == VM_FREEPOOL_CACHE &&
+				    pool != VM_FREEPOOL_CACHE)
+					vm_phys_uc_alloc_pages++;
 				vm_phys_set_pool(pool, m, oind);
 				vm_phys_split_pages(m, oind, fl, order);
 				return (m);
 			}
 		}
 	}
+
+	/*
+	 * XXX: If we get here, do deferred merging of cache pages
+	 * with pages from another pool to satisfy the request and
+	 * try again.  This may be quite hard to do.
+	 */
 	return (NULL);
 }
 
@@ -681,8 +699,30 @@
 			TAILQ_REMOVE(&fl[order].pl, m_buddy, pageq);
 			fl[order].lcnt--;
 			m_buddy->order = VM_NFREEORDER;
-			if (m_buddy->pool != m->pool)
+			if (m_buddy->pool != m->pool) {
+#if 1
+#if 1
+				if (m_buddy->pool == VM_FREEPOOL_CACHE ||
+				    m->pool == VM_FREEPOOL_CACHE)
+					break;
+#endif
+				if (m_buddy->pool == VM_FREEPOOL_CACHE)
+					vm_phys_uc_free_pages++;
 				vm_phys_set_pool(m->pool, m_buddy, order);
+#else
+				if (m_buddy->pool < m->pool) {
+					if (m_buddy->pool == VM_FREEPOOL_CACHE)
+						vm_phys_uc_free_pages++;
+					vm_phys_set_pool(m->pool, m_buddy,
+					    order);
+				} else {
+					if (m->pool == VM_FREEPOOL_CACHE)
+						vm_phys_uc_free_pages++;
+					vm_phys_set_pool(m_buddy->pool, m,
+					    order);
+				}
+#endif
+			}
 			order++;
 			pa &= ~(((vm_paddr_t)1 << (PAGE_SHIFT + order)) - 1);
 			m = &seg->first_page[atop(pa - seg->start)];
@@ -743,8 +783,12 @@
 {
 	vm_page_t m_tmp;
 
-	for (m_tmp = m; m_tmp < &m[1 << order]; m_tmp++)
+	for (m_tmp = m; m_tmp < &m[1 << order]; m_tmp++) {
+		if (m_tmp->pool == VM_FREEPOOL_CACHE &&
+		    pool != VM_FREEPOOL_CACHE)
+			vm_phys_uncached++;
 		m_tmp->pool = pool;
+	}
 }
 
 /*


More information about the p4-projects mailing list