Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Aug 2017 03:09:11 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r322391 - head/sys/vm
Message-ID:  <201708110309.v7B39C7d044250@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Fri Aug 11 03:09:11 2017
New Revision: 322391
URL: https://svnweb.freebsd.org/changeset/base/322391

Log:
  Micro-optimize kmem_unback().
  
  We can remove some unnecessary object radix tree lookups by using the
  object memq to iterate over pages in the specified range. This does not,
  however, eliminate the lookup needed in vm_page_free_toq() to remove each
  tree entry.
  
  Reviewed by:	alc, kib (previous revision)
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D11945

Modified:
  head/sys/vm/vm_kern.c

Modified: head/sys/vm/vm_kern.c
==============================================================================
--- head/sys/vm/vm_kern.c	Fri Aug 11 00:43:50 2017	(r322390)
+++ head/sys/vm/vm_kern.c	Fri Aug 11 03:09:11 2017	(r322391)
@@ -386,17 +386,19 @@ retry:
 void
 kmem_unback(vm_object_t object, vm_offset_t addr, vm_size_t size)
 {
-	vm_page_t m;
-	vm_offset_t i, offset;
+	vm_page_t m, next;
+	vm_offset_t end, offset;
 
 	KASSERT(object == kmem_object || object == kernel_object,
 	    ("kmem_unback: only supports kernel objects."));
 
 	pmap_remove(kernel_pmap, addr, addr + size);
 	offset = addr - VM_MIN_KERNEL_ADDRESS;
+	end = offset + size;
 	VM_OBJECT_WLOCK(object);
-	for (i = 0; i < size; i += PAGE_SIZE) {
-		m = vm_page_lookup(object, atop(offset + i));
+	for (m = vm_page_lookup(object, atop(offset)); offset < end;
+	    offset += PAGE_SIZE, m = next) {
+		next = vm_page_next(m);
 		vm_page_unwire(m, PQ_NONE);
 		vm_page_free(m);
 	}



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