summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2017-12-04 15:18:08 +0000
committerLuiz Souza <luiz@netgate.com>2018-02-21 15:15:26 -0300
commit4fdf0fa3bcd504bb021d3d74993bae954a87fc11 (patch)
treeaded43cfc99f283265455c9f77a3c8c5006b3d00 /sys/vm
parent6cbea300f4983466a260ce85583bf5eaf702780c (diff)
downloadFreeBSD-src-4fdf0fa3bcd504bb021d3d74993bae954a87fc11.zip
FreeBSD-src-4fdf0fa3bcd504bb021d3d74993bae954a87fc11.tar.gz
MFC r326234, r326235, r326284:
vm_page_array initialization improvements. (cherry picked from commit 15927ea545dd5119e164043a24026155250f8a2b)
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_page.c28
-rw-r--r--sys/vm/vm_phys.c44
-rw-r--r--sys/vm/vm_phys.h1
3 files changed, 26 insertions, 47 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 982d55e..16dc868 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -408,6 +408,29 @@ vm_page_domain_init(struct vm_domain *vmd)
}
/*
+ * Initialize a physical page in preparation for adding it to the free
+ * lists.
+ */
+static void
+vm_page_init_page(vm_page_t m, vm_paddr_t pa, int segind)
+{
+
+ m->object = NULL;
+ m->wire_count = 0;
+ m->busy_lock = VPB_UNBUSIED;
+ m->hold_count = 0;
+ m->flags = 0;
+ m->phys_addr = pa;
+ m->queue = PQ_NONE;
+ m->psind = 0;
+ m->segind = segind;
+ m->order = VM_NFREEORDER;
+ m->pool = VM_FREEPOOL_DEFAULT;
+ m->valid = m->dirty = 0;
+ pmap_page_init(m);
+}
+
+/*
* vm_page_startup:
*
* Initializes the resident memory module. Allocates physical memory for
@@ -654,8 +677,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_phys_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
diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c
index e784bca..60b452f 100644
--- a/sys/vm/vm_phys.c
+++ b/sys/vm/vm_phys.c
@@ -175,7 +175,6 @@ static vm_page_t vm_phys_alloc_seg_contig(struct vm_phys_seg *seg,
vm_paddr_t boundary);
static void _vm_phys_create_seg(vm_paddr_t start, vm_paddr_t end, int domain);
static void vm_phys_create_seg(vm_paddr_t start, vm_paddr_t end);
-static int vm_phys_paddr_to_segind(vm_paddr_t pa);
static void vm_phys_split_pages(vm_page_t m, int oind, struct vm_freelist *fl,
int order);
@@ -731,31 +730,6 @@ vm_phys_split_pages(vm_page_t m, int oind, struct vm_freelist *fl, int order)
}
/*
- * Initialize a physical page in preparation for adding it to the free
- * lists.
- */
-void
-vm_phys_init_page(vm_paddr_t pa)
-{
- vm_page_t m;
-
- m = vm_phys_paddr_to_vm_page(pa);
- m->object = NULL;
- m->wire_count = 0;
- m->busy_lock = VPB_UNBUSIED;
- m->hold_count = 0;
- m->flags = m->aflags = m->oflags = 0;
- m->phys_addr = pa;
- m->queue = PQ_NONE;
- m->psind = 0;
- m->segind = vm_phys_paddr_to_segind(pa);
- m->order = VM_NFREEORDER;
- m->pool = VM_FREEPOOL_DEFAULT;
- m->valid = m->dirty = 0;
- pmap_page_init(m);
-}
-
-/*
* Allocate a contiguous, power of two-sized set of physical pages
* from the free lists.
*
@@ -1064,24 +1038,6 @@ vm_phys_fictitious_unreg_range(vm_paddr_t start, vm_paddr_t end)
}
/*
- * Find the segment containing the given physical address.
- */
-static 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.
diff --git a/sys/vm/vm_phys.h b/sys/vm/vm_phys.h
index 5d100ba..c5dd58d 100644
--- a/sys/vm/vm_phys.h
+++ b/sys/vm/vm_phys.h
@@ -82,7 +82,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);
-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);
OpenPOWER on IntegriCloud