Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Nov 2017 17:46:38 +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: r326284 - head/sys/vm
Message-ID:  <201711271746.vARHkcJQ073204@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Mon Nov 27 17:46:38 2017
New Revision: 326284
URL: https://svnweb.freebsd.org/changeset/base/326284

Log:
  Avoid unnecessary lookups when initializing the vm_page array.
  
  This gives a marginal improvement in the vm_page_array initialization
  time. Also garbage-collect the now-unused vm_phys_paddr_to_segind().
  
  Reviewed by:	alc, kib
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D13270

Modified:
  head/sys/vm/vm_page.c
  head/sys/vm/vm_phys.c
  head/sys/vm/vm_phys.h

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c	Mon Nov 27 17:18:31 2017	(r326283)
+++ head/sys/vm/vm_page.c	Mon Nov 27 17:46:38 2017	(r326284)
@@ -427,11 +427,9 @@ vm_page_domain_init(struct vm_domain *vmd)
  * lists.
  */
 static void
-vm_page_init_page(vm_paddr_t pa)
+vm_page_init_page(vm_page_t m, vm_paddr_t pa, int segind)
 {
-	vm_page_t m;
 
-	m = vm_phys_paddr_to_vm_page(pa);
 	m->object = NULL;
 	m->wire_count = 0;
 	m->busy_lock = VPB_UNBUSIED;
@@ -440,7 +438,7 @@ vm_page_init_page(vm_paddr_t pa)
 	m->phys_addr = pa;
 	m->queue = PQ_NONE;
 	m->psind = 0;
-	m->segind = vm_phys_paddr_to_segind(pa);
+	m->segind = segind;
 	m->order = VM_NFREEORDER;
 	m->pool = VM_FREEPOOL_DEFAULT;
 	m->valid = m->dirty = 0;
@@ -694,8 +692,9 @@ vm_page_startup(vm_offset_t vaddr)
 	vm_cnt.v_free_count = 0;
 	for (segind = 0; segind < vm_phys_nsegs; segind++) {
 		seg = &vm_phys_segs[segind];
-		for (pa = seg->start; pa < seg->end; pa += PAGE_SIZE)
-			vm_page_init_page(pa);
+		for (m = seg->first_page, pa = seg->start; pa < seg->end;
+		    m++, pa += PAGE_SIZE)
+			vm_page_init_page(m, pa, segind);
 
 		/*
 		 * Add the segment to the free lists only if it is covered by

Modified: head/sys/vm/vm_phys.c
==============================================================================
--- head/sys/vm/vm_phys.c	Mon Nov 27 17:18:31 2017	(r326283)
+++ head/sys/vm/vm_phys.c	Mon Nov 27 17:46:38 2017	(r326284)
@@ -1038,24 +1038,6 @@ vm_phys_fictitious_unreg_range(vm_paddr_t start, vm_pa
 }
 
 /*
- * Find the segment containing the given physical address.
- */
-int
-vm_phys_paddr_to_segind(vm_paddr_t pa)
-{
-	struct vm_phys_seg *seg;
-	int segind;
-
-	for (segind = 0; segind < vm_phys_nsegs; segind++) {
-		seg = &vm_phys_segs[segind];
-		if (pa >= seg->start && pa < seg->end)
-			return (segind);
-	}
-	panic("vm_phys_paddr_to_segind: paddr %#jx is not in any segment" ,
-	    (uintmax_t)pa);
-}
-
-/*
  * Free a contiguous, power of two-sized set of physical pages.
  *
  * The free page queues must be locked.

Modified: head/sys/vm/vm_phys.h
==============================================================================
--- head/sys/vm/vm_phys.h	Mon Nov 27 17:18:31 2017	(r326283)
+++ head/sys/vm/vm_phys.h	Mon Nov 27 17:46:38 2017	(r326284)
@@ -84,7 +84,6 @@ vm_page_t vm_phys_fictitious_to_vm_page(vm_paddr_t pa)
 void vm_phys_free_contig(vm_page_t m, u_long npages);
 void vm_phys_free_pages(vm_page_t m, int order);
 void vm_phys_init(void);
-int vm_phys_paddr_to_segind(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);



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