aboutsummaryrefslogtreecommitdiff
path: root/sys/vm
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2018-11-13 16:51:30 +0000
committerMark Johnston <markj@FreeBSD.org>2018-11-13 16:51:30 +0000
commit8d33352d0a3cdc4f25409a9760f8799110eb85c7 (patch)
treec884d3cd97a14ca1dfba63b222f2dbeaf8dc041a /sys/vm
parentc2d6ce7fd23f4d41735edebe3621ff409042b8a1 (diff)
Notes
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/uma_core.c13
-rw-r--r--sys/vm/vm_init.c8
-rw-r--r--sys/vm/vm_kern.c1
-rw-r--r--sys/vm/vm_page.c5
-rw-r--r--sys/vm/vm_pageout.c42
5 files changed, 35 insertions, 34 deletions
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 18eb4b57f9a0..8e0e0dc297ec 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -3608,29 +3608,30 @@ uma_zone_reserve_kva(uma_zone_t zone, int count)
void
uma_prealloc(uma_zone_t zone, int items)
{
+ struct vm_domainset_iter di;
uma_domain_t dom;
uma_slab_t slab;
uma_keg_t keg;
- int domain, slabs;
+ int domain, flags, slabs;
keg = zone_first_keg(zone);
if (keg == NULL)
return;
KEG_LOCK(keg);
slabs = items / keg->uk_ipers;
- domain = 0;
if (slabs * keg->uk_ipers < items)
slabs++;
+ flags = M_WAITOK;
+ vm_domainset_iter_policy_ref_init(&di, &keg->uk_dr, &domain, &flags);
while (slabs-- > 0) {
- slab = keg_alloc_slab(keg, zone, domain, M_WAITOK);
+ slab = keg_alloc_slab(keg, zone, domain, flags);
if (slab == NULL)
return;
MPASS(slab->us_keg == keg);
dom = &keg->uk_domain[slab->us_domain];
LIST_INSERT_HEAD(&dom->ud_free_slab, slab, us_link);
- do {
- domain = (domain + 1) % vm_ndomains;
- } while (VM_DOMAIN_EMPTY(domain));
+ if (vm_domainset_iter_policy(&di, &domain) != 0)
+ break;
}
KEG_UNLOCK(keg);
}
diff --git a/sys/vm/vm_init.c b/sys/vm/vm_init.c
index c62aae488247..2b15e53709c2 100644
--- a/sys/vm/vm_init.c
+++ b/sys/vm/vm_init.c
@@ -123,12 +123,18 @@ vm_mem_init(void *dummy)
domainset_init();
/*
- * Initializes resident memory structures. From here on, all physical
+ * Initialize resident memory structures. From here on, all physical
* memory is accounted for, and we use only virtual addresses.
*/
vm_set_page_size();
virtual_avail = vm_page_startup(virtual_avail);
+ /*
+ * Set an initial domain policy for thread0 so that allocations
+ * can work.
+ */
+ domainset_zero();
+
#ifdef UMA_MD_SMALL_ALLOC
/* Announce page availability to UMA. */
uma_startup1();
diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c
index e92faff0f371..f57a58383d6f 100644
--- a/sys/vm/vm_kern.c
+++ b/sys/vm/vm_kern.c
@@ -800,7 +800,6 @@ kmem_bootstrap_free(vm_offset_t start, vm_size_t size)
vmd = vm_pagequeue_domain(m);
vm_domain_free_lock(vmd);
vm_phys_free_pages(m, 0);
- vmd->vmd_page_count++;
vm_domain_free_unlock(vmd);
vm_domain_freecnt_inc(vmd, 1);
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index e7af2a363957..10b6f7b4a916 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -855,11 +855,6 @@ vm_page_startup(vm_offset_t vaddr)
*/
vm_reserv_init();
#endif
- /*
- * Set an initial domain policy for thread0 so that allocations
- * can work.
- */
- domainset_zero();
return (vaddr);
}
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index 5c309a04a402..9f592c38410a 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -2072,41 +2072,41 @@ vm_pageout_init(void)
static void
vm_pageout(void)
{
- int error;
- int i;
+ struct proc *p;
+ struct thread *td;
+ int error, first, i;
+
+ p = curproc;
+ td = curthread;
swap_pager_swap_init();
- snprintf(curthread->td_name, sizeof(curthread->td_name), "dom0");
- error = kthread_add(vm_pageout_laundry_worker, NULL, curproc, NULL,
- 0, 0, "laundry: dom0");
- if (error != 0)
- panic("starting laundry for domain 0, error %d", error);
- for (i = 1; i < vm_ndomains; i++) {
+ for (first = -1, i = 0; i < vm_ndomains; i++) {
if (VM_DOMAIN_EMPTY(i)) {
if (bootverbose)
printf("domain %d empty; skipping pageout\n",
i);
continue;
}
-
- error = kthread_add(vm_pageout_worker, (void *)(uintptr_t)i,
- curproc, NULL, 0, 0, "dom%d", i);
- if (error != 0) {
- panic("starting pageout for domain %d, error %d\n",
- i, error);
+ if (first == -1)
+ first = i;
+ else {
+ error = kthread_add(vm_pageout_worker,
+ (void *)(uintptr_t)i, p, NULL, 0, 0, "dom%d", i);
+ if (error != 0)
+ panic("starting pageout for domain %d: %d\n",
+ i, error);
}
error = kthread_add(vm_pageout_laundry_worker,
- (void *)(uintptr_t)i, curproc, NULL, 0, 0,
- "laundry: dom%d", i);
+ (void *)(uintptr_t)i, p, NULL, 0, 0, "laundry: dom%d", i);
if (error != 0)
- panic("starting laundry for domain %d, error %d",
- i, error);
+ panic("starting laundry for domain %d: %d", i, error);
}
- error = kthread_add(uma_reclaim_worker, NULL, curproc, NULL,
- 0, 0, "uma");
+ error = kthread_add(uma_reclaim_worker, NULL, p, NULL, 0, 0, "uma");
if (error != 0)
panic("starting uma_reclaim helper, error %d\n", error);
- vm_pageout_worker((void *)(uintptr_t)0);
+
+ snprintf(td->td_name, sizeof(td->td_name), "dom%d", first);
+ vm_pageout_worker((void *)(uintptr_t)first);
}
/*