svn commit: r250543 - user/attilio/jeff-numa/sys/vm
Attilio Rao
attilio at FreeBSD.org
Sun May 12 01:53:03 UTC 2013
Author: attilio
Date: Sun May 12 01:53:03 2013
New Revision: 250543
URL: http://svnweb.freebsd.org/changeset/base/250543
Log:
Scan all the domains when trying to allocate from freepages.
Some domains may be empty but others may still have some available pages
satisfying the allocations.
Sponsored by: EMC / Isilon storage division
Modified:
user/attilio/jeff-numa/sys/vm/vm_phys.c
Modified: user/attilio/jeff-numa/sys/vm/vm_phys.c
==============================================================================
--- user/attilio/jeff-numa/sys/vm/vm_phys.c Sun May 12 01:38:01 2013 (r250542)
+++ user/attilio/jeff-numa/sys/vm/vm_phys.c Sun May 12 01:53:03 2013 (r250543)
@@ -399,18 +399,21 @@ vm_page_t
vm_phys_alloc_pages(int pool, int order)
{
vm_page_t m;
- int domain, flind;
+ int dom, domain, flind;
KASSERT(pool < VM_NFREEPOOL,
("vm_phys_alloc_pages: pool %d is out of range", pool));
KASSERT(order < VM_NFREEORDER,
("vm_phys_alloc_pages: order %d is out of range", order));
- domain = vm_rr_selectdomain();
- for (flind = 0; flind < vm_nfreelists; flind++) {
- m = vm_phys_alloc_domain_pages(domain, flind, pool, order);
- if (m != NULL)
- return (m);
+ for (dom = 0; dom < vm_ndomains; dom++) {
+ domain = vm_rr_selectdomain();
+ for (flind = 0; flind < vm_nfreelists; flind++) {
+ m = vm_phys_alloc_domain_pages(domain, flind, pool,
+ order);
+ if (m != NULL)
+ return (m);
+ }
}
return (NULL);
}
@@ -422,11 +425,8 @@ vm_phys_alloc_pages(int pool, int order)
vm_page_t
vm_phys_alloc_freelist_pages(int flind, int pool, int order)
{
-#if MAXMEMDOM > 1
vm_page_t m;
- int i;
-#endif
- int domain;
+ int dom, domain;
KASSERT(flind < VM_NFREELIST,
("vm_phys_alloc_freelist_pages: freelist %d is out of range", flind));
@@ -435,29 +435,13 @@ vm_phys_alloc_freelist_pages(int flind,
KASSERT(order < VM_NFREEORDER,
("vm_phys_alloc_freelist_pages: order %d is out of range", order));
-#if MAXMEMDOM > 1
- /*
- * This routine expects to be called with a VM_FREELIST_* constant.
- * On a system with multiple domains we need to adjust the flind
- * appropriately. If it is for VM_FREELIST_DEFAULT we need to
- * iterate over the per-domain lists.
- */
- domain = vm_rr_selectdomain();
- if (flind == VM_FREELIST_DEFAULT) {
- m = NULL;
- for (i = 0; i < vm_ndomains; i++, flind++) {
- m = vm_phys_alloc_domain_pages(domain, flind, pool,
- order);
- if (m != NULL)
- break;
- }
- return (m);
- } else if (flind > VM_FREELIST_DEFAULT)
- flind += vm_ndomains - 1;
-#else
- domain = 0;
-#endif
- return (vm_phys_alloc_domain_pages(domain, flind, pool, order));
+ for (dom = 0; dom < vm_ndomains; dom++) {
+ domain = vm_rr_selectdomain();
+ m = vm_phys_alloc_domain_pages(domain, flind, pool, order);
+ if (m != NULL)
+ return (m);
+ }
+ return (NULL);
}
static vm_page_t
@@ -870,11 +854,10 @@ vm_phys_alloc_contig(u_long npages, vm_p
vm_paddr_t pa, pa_last, size;
vm_page_t m, m_ret;
u_long npages_end;
- int domain, flind, oind, order, pind;
+ int dom, domain, flind, oind, order, pind;
mtx_assert(&vm_page_queue_free_mtx, MA_OWNED);
size = npages << PAGE_SHIFT;
- domain = vm_rr_selectdomain();
KASSERT(size != 0,
("vm_phys_alloc_contig: size must not be 0"));
KASSERT((alignment & (alignment - 1)) == 0,
@@ -883,6 +866,9 @@ vm_phys_alloc_contig(u_long npages, vm_p
("vm_phys_alloc_contig: boundary must be a power of 2"));
/* Compute the queue that is the best fit for npages. */
for (order = 0; (1 << order) < npages; order++);
+ dom = 0;
+restartdom:
+ domain = vm_rr_selectdomain();
for (flind = 0; flind < vm_nfreelists; flind++) {
for (oind = min(order, VM_NFREEORDER - 1); oind < VM_NFREEORDER; oind++) {
for (pind = 0; pind < VM_NFREEPOOL; pind++) {
@@ -940,6 +926,8 @@ vm_phys_alloc_contig(u_long npages, vm_p
}
}
}
+ if (++dom < vm_ndomains)
+ goto restartdom;
return (NULL);
done:
for (m = m_ret; m < &m_ret[npages]; m = &m[1 << oind]) {
More information about the svn-src-user
mailing list