svn commit: r326081 - user/jeff/numa/sys/vm
Jeff Roberson
jeff at FreeBSD.org
Wed Nov 22 00:37:16 UTC 2017
Author: jeff
Date: Wed Nov 22 00:37:14 2017
New Revision: 326081
URL: https://svnweb.freebsd.org/changeset/base/326081
Log:
Update for r325992
Use the domain specific functions in kmem_alloc_*.
Modified:
user/jeff/numa/sys/vm/vm_kern.c
user/jeff/numa/sys/vm/vm_page.c
user/jeff/numa/sys/vm/vm_phys.c
user/jeff/numa/sys/vm/vm_phys.h
Modified: user/jeff/numa/sys/vm/vm_kern.c
==============================================================================
--- user/jeff/numa/sys/vm/vm_kern.c Tue Nov 21 23:25:22 2017 (r326080)
+++ user/jeff/numa/sys/vm/vm_kern.c Wed Nov 22 00:37:14 2017 (r326081)
@@ -185,13 +185,13 @@ kmem_alloc_attr_domain(int domain, vm_size_t size, int
for (i = 0; i < size; i += PAGE_SIZE) {
tries = 0;
retry:
- m = vm_page_alloc_contig(object, atop(offset + i),
- pflags, 1, low, high, PAGE_SIZE, 0, memattr);
+ m = vm_page_alloc_contig_domain(object, atop(offset + i),
+ domain, pflags, 1, low, high, PAGE_SIZE, 0, memattr);
if (m == NULL) {
VM_OBJECT_WUNLOCK(object);
if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) {
- if (!vm_page_reclaim_contig(pflags, 1,
- low, high, PAGE_SIZE, 0) &&
+ if (!vm_page_reclaim_contig_domain(pflags, 1,
+ domain, low, high, PAGE_SIZE, 0) &&
(flags & M_WAITOK) != 0)
VM_WAIT;
VM_OBJECT_WLOCK(object);
@@ -202,6 +202,9 @@ retry:
vmem_free(vmem, addr, size);
return (0);
}
+ KASSERT(vm_phys_domidx(m) == domain,
+ ("kmem_alloc_attr_domain: Domain mismatch %d != %d",
+ vm_phys_domidx(m), domain));
if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0)
pmap_zero_page(m);
m->valid = VM_PAGE_BITS_ALL;
@@ -274,13 +277,14 @@ kmem_alloc_contig_domain(int domain, vm_size_t size, i
VM_OBJECT_WLOCK(object);
tries = 0;
retry:
- m = vm_page_alloc_contig(object, atop(offset), pflags,
+ m = vm_page_alloc_contig_domain(object, atop(offset), domain, pflags,
npages, low, high, alignment, boundary, memattr);
if (m == NULL) {
VM_OBJECT_WUNLOCK(object);
if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) {
- if (!vm_page_reclaim_contig(pflags, npages, low, high,
- alignment, boundary) && (flags & M_WAITOK) != 0)
+ if (!vm_page_reclaim_contig_domain(pflags, npages,
+ domain, low, high, alignment, boundary) &&
+ (flags & M_WAITOK) != 0)
VM_WAIT;
VM_OBJECT_WLOCK(object);
tries++;
@@ -289,6 +293,9 @@ retry:
vmem_free(vmem, addr, size);
return (0);
}
+ KASSERT(vm_phys_domidx(m) == domain,
+ ("kmem_alloc_contig_domain: Domain mismatch %d != %d",
+ vm_phys_domidx(m), domain));
end_m = m + npages;
tmp = addr;
for (; m < end_m; m++) {
Modified: user/jeff/numa/sys/vm/vm_page.c
==============================================================================
--- user/jeff/numa/sys/vm/vm_page.c Tue Nov 21 23:25:22 2017 (r326080)
+++ user/jeff/numa/sys/vm/vm_page.c Wed Nov 22 00:37:14 2017 (r326081)
@@ -2540,8 +2540,8 @@ CTASSERT(powerof2(NRUNS));
* must be a power of two.
*/
bool
-vm_page_reclaim_contig(int req, u_long npages, vm_paddr_t low, vm_paddr_t high,
- u_long alignment, vm_paddr_t boundary)
+vm_page_reclaim_contig_domain(int req, u_long npages, int domain,
+ vm_paddr_t low, vm_paddr_t high, u_long alignment, vm_paddr_t boundary)
{
vm_paddr_t curr_low;
vm_page_t m_run, m_runs[NRUNS];
@@ -2581,8 +2581,8 @@ vm_page_reclaim_contig(int req, u_long npages, vm_padd
curr_low = low;
count = 0;
for (;;) {
- m_run = vm_phys_scan_contig(npages, curr_low, high,
- alignment, boundary, options);
+ m_run = vm_phys_scan_contig(domain, npages, curr_low,
+ high, alignment, boundary, options);
if (m_run == NULL)
break;
curr_low = VM_PAGE_TO_PHYS(m_run) + ptoa(npages);
@@ -2622,6 +2622,28 @@ vm_page_reclaim_contig(int req, u_long npages, vm_padd
return (reclaimed != 0);
}
}
+
+bool
+vm_page_reclaim_contig(int req, u_long npages, vm_paddr_t low, vm_paddr_t high,
+ u_long alignment, vm_paddr_t boundary)
+{
+ struct vm_domain_iterator vi;
+ int domain;
+ bool ret;
+
+ ret = false;
+ vm_policy_iterator_init(&vi);
+ while ((vm_domain_iterator_run(&vi, &domain)) == 0) {
+ ret = vm_page_reclaim_contig_domain(req, npages, domain, low,
+ high, alignment, boundary);
+ if (ret)
+ break;
+ }
+ vm_policy_iterator_finish(&vi);
+
+ return (ret);
+}
+
/*
* vm_wait: (also see VM_WAIT macro)
Modified: user/jeff/numa/sys/vm/vm_phys.c
==============================================================================
--- user/jeff/numa/sys/vm/vm_phys.c Tue Nov 21 23:25:22 2017 (r326080)
+++ user/jeff/numa/sys/vm/vm_phys.c Wed Nov 22 00:37:14 2017 (r326081)
@@ -1010,7 +1010,7 @@ vm_phys_free_contig(vm_page_t m, u_long npages)
* be a power of two.
*/
vm_page_t
-vm_phys_scan_contig(u_long npages, vm_paddr_t low, vm_paddr_t high,
+vm_phys_scan_contig(int domain, u_long npages, vm_paddr_t low, vm_paddr_t high,
u_long alignment, vm_paddr_t boundary, int options)
{
vm_paddr_t pa_end;
@@ -1025,6 +1025,8 @@ vm_phys_scan_contig(u_long npages, vm_paddr_t low, vm_
return (NULL);
for (segind = 0; segind < vm_phys_nsegs; segind++) {
seg = &vm_phys_segs[segind];
+ if (seg->domain != domain)
+ continue;
if (seg->start >= high)
break;
if (low >= seg->end)
Modified: user/jeff/numa/sys/vm/vm_phys.h
==============================================================================
--- user/jeff/numa/sys/vm/vm_phys.h Tue Nov 21 23:25:22 2017 (r326080)
+++ user/jeff/numa/sys/vm/vm_phys.h Wed Nov 22 00:37:14 2017 (r326081)
@@ -85,8 +85,8 @@ void vm_phys_free_pages(vm_page_t m, int order);
void vm_phys_init(void);
void vm_phys_init_page(vm_paddr_t pa);
vm_page_t vm_phys_paddr_to_vm_page(vm_paddr_t pa);
-vm_page_t vm_phys_scan_contig(u_long npages, vm_paddr_t low, vm_paddr_t high,
- u_long alignment, vm_paddr_t boundary, int options);
+vm_page_t vm_phys_scan_contig(int domain, u_long npages, vm_paddr_t low,
+ vm_paddr_t high, u_long alignment, vm_paddr_t boundary, int options);
void vm_phys_set_pool(int pool, vm_page_t m, int order);
boolean_t vm_phys_unfree_page(vm_page_t m);
int vm_phys_mem_affinity(int f, int t);
More information about the svn-src-user
mailing list