diff options
| author | Mark Johnston <markj@FreeBSD.org> | 2018-11-13 16:51:30 +0000 |
|---|---|---|
| committer | Mark Johnston <markj@FreeBSD.org> | 2018-11-13 16:51:30 +0000 |
| commit | 8d33352d0a3cdc4f25409a9760f8799110eb85c7 (patch) | |
| tree | c884d3cd97a14ca1dfba63b222f2dbeaf8dc041a /sys/vm | |
| parent | c2d6ce7fd23f4d41735edebe3621ff409042b8a1 (diff) | |
Notes
Diffstat (limited to 'sys/vm')
| -rw-r--r-- | sys/vm/uma_core.c | 13 | ||||
| -rw-r--r-- | sys/vm/vm_init.c | 8 | ||||
| -rw-r--r-- | sys/vm/vm_kern.c | 1 | ||||
| -rw-r--r-- | sys/vm/vm_page.c | 5 | ||||
| -rw-r--r-- | sys/vm/vm_pageout.c | 42 |
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); } /* |
