Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Nov 2017 00:37:14 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r326081 - user/jeff/numa/sys/vm
Message-ID:  <201711220037.vAM0bEUj066626@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201711220037.vAM0bEUj066626>