Date: Mon, 29 Jan 2018 22:50:44 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r328568 - user/jeff/numa/sys/vm Message-ID: <201801292250.w0TMoieT035326@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jeff Date: Mon Jan 29 22:50:44 2018 New Revision: 328568 URL: https://svnweb.freebsd.org/changeset/base/328568 Log: Fix review feedback from markj. Modified: user/jeff/numa/sys/vm/vm_extern.h user/jeff/numa/sys/vm/vm_meter.c user/jeff/numa/sys/vm/vm_object.h user/jeff/numa/sys/vm/vm_page.c user/jeff/numa/sys/vm/vm_pageout.c user/jeff/numa/sys/vm/vm_pagequeue.h Modified: user/jeff/numa/sys/vm/vm_extern.h ============================================================================== --- user/jeff/numa/sys/vm/vm_extern.h Mon Jan 29 22:38:23 2018 (r328567) +++ user/jeff/numa/sys/vm/vm_extern.h Mon Jan 29 22:50:44 2018 (r328568) @@ -125,5 +125,6 @@ int vm_thread_new(struct thread *td, int pages); u_int vm_active_count(void); u_int vm_inactive_count(void); u_int vm_laundry_count(void); +u_int vm_wait_count(void); #endif /* _KERNEL */ #endif /* !_VM_EXTERN_H_ */ Modified: user/jeff/numa/sys/vm/vm_meter.c ============================================================================== --- user/jeff/numa/sys/vm/vm_meter.c Mon Jan 29 22:38:23 2018 (r328567) +++ user/jeff/numa/sys/vm/vm_meter.c Mon Jan 29 22:50:44 2018 (r328568) @@ -215,11 +215,6 @@ vmtotal(SYSCTL_HANDLER_ARGS) total.t_dw++; else total.t_sl++; -#if 0 /* XXX */ - if (td->td_wchan == - &vm_cnt.v_free_count) - total.t_pw++; -#endif } break; case TDS_CAN_RUN: @@ -287,6 +282,7 @@ vmtotal(SYSCTL_HANDLER_ARGS) } } mtx_unlock(&vm_object_list_mtx); + total.t_pw = vm_wait_count(); total.t_free = vm_free_count(); #if defined(COMPAT_FREEBSD11) /* sysctl(8) allocates twice as much memory as reported by sysctl(3) */ @@ -441,42 +437,38 @@ vm_free_count(void) return (v); } +static u_int -vm_active_count(void) +vm_pagequeue_count(int pq) { u_int v; int i; v = 0; for (i = 0; i < vm_ndomains; i++) - v += vm_dom[i].vmd_pagequeues[PQ_ACTIVE].pq_cnt; + v += vm_dom[i].vmd_pagequeues[pq].pq_cnt; return (v); } u_int -vm_inactive_count(void) +vm_active_count(void) { - u_int v; - int i; - v = 0; - for (i = 0; i < vm_ndomains; i++) - v += vm_dom[i].vmd_pagequeues[PQ_INACTIVE].pq_cnt; + return vm_pagequeue_count(PQ_ACTIVE); +} - return (v); +u_int +vm_inactive_count(void) +{ + + return vm_pagequeue_count(PQ_INACTIVE); } u_int vm_laundry_count(void) { - u_int v; - int i; - v = 0; - for (i = 0; i < vm_ndomains; i++) - v += vm_dom[i].vmd_pagequeues[PQ_LAUNDRY].pq_cnt; - - return (v); + return vm_pagequeue_count(PQ_LAUNDRY); } Modified: user/jeff/numa/sys/vm/vm_object.h ============================================================================== --- user/jeff/numa/sys/vm/vm_object.h Mon Jan 29 22:38:23 2018 (r328567) +++ user/jeff/numa/sys/vm/vm_object.h Mon Jan 29 22:50:44 2018 (r328568) @@ -297,6 +297,17 @@ vm_object_color(vm_object_t object, u_short color) } } +static __inline bool +vm_object_reserv(vm_object_t object) +{ + + if (object != NULL && + (object->flags & (OBJ_COLORED | OBJ_FICTITIOUS)) == OBJ_COLORED) { + return (true); + } + return (false); +} + void vm_object_clear_flag(vm_object_t object, u_short bits); void vm_object_pip_add(vm_object_t object, short i); void vm_object_pip_subtract(vm_object_t object, short i); Modified: user/jeff/numa/sys/vm/vm_page.c ============================================================================== --- user/jeff/numa/sys/vm/vm_page.c Mon Jan 29 22:38:23 2018 (r328567) +++ user/jeff/numa/sys/vm/vm_page.c Mon Jan 29 22:50:44 2018 (r328568) @@ -1683,13 +1683,7 @@ vm_page_alloc_domain_after(vm_object_t object, vm_pind vm_page_t m; int flags; u_int free_count; -#if VM_NRESERVLEVEL > 0 - int reserv; - reserv = object != NULL && - (object->flags & (OBJ_COLORED | OBJ_FICTITIOUS)) == OBJ_COLORED; -#endif - KASSERT((object != NULL) == ((req & VM_ALLOC_NOOBJ) == 0) && (object != NULL || (req & VM_ALLOC_SBUSY) == 0) && ((req & (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)) != @@ -1706,7 +1700,7 @@ vm_page_alloc_domain_after(vm_object_t object, vm_pind again: m = NULL; #if VM_NRESERVLEVEL > 0 - if (reserv && + if (vm_object_reserv(object) && (m = vm_reserv_extend(req, object, pindex, domain, mpred)) != NULL) { domain = vm_phys_domain(m); @@ -1721,7 +1715,8 @@ again: * Can we allocate the page from a reservation? */ #if VM_NRESERVLEVEL > 0 - if (!reserv || (m = vm_reserv_alloc_page(object, pindex, + if (!vm_object_reserv(object) || + (m = vm_reserv_alloc_page(object, pindex, domain, mpred)) == NULL) #endif { @@ -1892,12 +1887,7 @@ vm_page_alloc_contig_domain(vm_object_t object, vm_pin struct vm_domain *vmd; vm_page_t m, m_ret, mpred; u_int busy_lock, flags, oflags; -#if VM_NRESERVLEVEL > 0 - int reserv; - reserv = object != NULL && - (object->flags & (OBJ_COLORED | OBJ_FICTITIOUS)) == OBJ_COLORED; -#endif mpred = NULL; /* XXX: pacify gcc */ KASSERT((object != NULL) == ((req & VM_ALLOC_NOOBJ) == 0) && (object != NULL || (req & VM_ALLOC_SBUSY) == 0) && @@ -1927,7 +1917,7 @@ vm_page_alloc_contig_domain(vm_object_t object, vm_pin */ again: #if VM_NRESERVLEVEL > 0 - if (reserv && + if (vm_object_reserv(object) && (m_ret = vm_reserv_extend_contig(req, object, pindex, domain, npages, low, high, alignment, boundary, mpred)) != NULL) { domain = vm_phys_domain(m_ret); @@ -1944,7 +1934,7 @@ again: */ #if VM_NRESERVLEVEL > 0 retry: - if (!reserv || + if (!vm_object_reserv(object) || (m_ret = vm_reserv_alloc_contig(object, pindex, domain, npages, low, high, alignment, boundary, mpred)) == NULL) #endif @@ -2541,10 +2531,10 @@ unlock: if (m_mtx != NULL) mtx_unlock(m_mtx); if ((m = SLIST_FIRST(&free)) != NULL) { - MPASS(vm_phys_domain(m) == domain); vmd = VM_DOMAIN(domain); vm_domain_free_lock(vmd); do { + MPASS(vm_phys_domain(m) == domain); SLIST_REMOVE_HEAD(&free, plinks.s.ss); vm_page_free_phys(m); } while ((m = SLIST_FIRST(&free)) != NULL); @@ -2720,7 +2710,7 @@ vm_domain_clear(struct vm_domain *vmd) if (vmd->vmd_minset && !vm_paging_min(vmd)) { vmd->vmd_minset = 0; DOMAINSET_CLR(vmd->vmd_domain, &vm_min_domains); - if (!vm_page_count_min() && vm_min_waiters) { + if (vm_min_waiters != 0) { vm_min_waiters = 0; wakeup(&vm_min_domains); } @@ -2728,7 +2718,7 @@ vm_domain_clear(struct vm_domain *vmd) if (vmd->vmd_severeset && !vm_paging_severe(vmd)) { vmd->vmd_severeset = 0; DOMAINSET_CLR(vmd->vmd_domain, &vm_severe_domains); - if (!vm_page_count_severe() && vm_severe_waiters) { + if (vm_severe_waiters != 0) { vm_severe_waiters = 0; wakeup(&vm_severe_domains); } @@ -2759,13 +2749,27 @@ vm_wait_severe(void) { mtx_lock(&vm_domainset_lock); - while (vm_page_count_min()) { + while (vm_page_count_severe()) { vm_severe_waiters++; msleep(&vm_min_domains, &vm_domainset_lock, PVM, "vmwait", 0); } mtx_unlock(&vm_domainset_lock); } +u_int +vm_wait_count(void) +{ + u_int cnt; + int i; + + cnt = 0; + for (i = 0; i < vm_ndomains; i++) + cnt += VM_DOMAIN(i)->vmd_waiters; + cnt += vm_severe_waiters + vm_min_waiters; + + return (cnt); +} + /* * vm_wait_domain: * @@ -2815,13 +2819,20 @@ vm_wait(void) msleep(&vm_pageproc_waiters, &vm_domainset_lock, PVM, "pageprocwait", 1); mtx_unlock(&vm_domainset_lock); - } else + } else { /* * XXX Ideally we would wait only until the allocation could * be satisfied. This condition can cause new allocators to * consume all freed pages while old allocators wait. */ - vm_wait_min(); + mtx_lock(&vm_domainset_lock); + if (vm_page_count_min()) { + vm_min_waiters++; + msleep(&vm_min_domains, &vm_domainset_lock, PVM, + "vmwait", 0); + } + mtx_unlock(&vm_domainset_lock); + } } /* @@ -2872,7 +2883,7 @@ vm_waitpfault(void) { mtx_lock(&vm_domainset_lock); - while (vm_page_count_min()) { + if (vm_page_count_min()) { vm_min_waiters++; msleep(&vm_min_domains, &vm_domainset_lock, PUSER, "pfault", 0); } Modified: user/jeff/numa/sys/vm/vm_pageout.c ============================================================================== --- user/jeff/numa/sys/vm/vm_pageout.c Mon Jan 29 22:38:23 2018 (r328567) +++ user/jeff/numa/sys/vm/vm_pageout.c Mon Jan 29 22:50:44 2018 (r328568) @@ -185,11 +185,6 @@ SYSCTL_INT(_vm, OID_AUTO, act_scan_laundry_weight, CTL &act_scan_laundry_weight, 0, "weight given to clean vs. dirty pages in active queue scans"); -static u_int vm_background_launder_target; -SYSCTL_UINT(_vm, OID_AUTO, background_launder_target, CTLFLAG_RWTUN, - &vm_background_launder_target, 0, - "background laundering target, in pages"); - static u_int vm_background_launder_rate = 4096; SYSCTL_UINT(_vm, OID_AUTO, background_launder_rate, CTLFLAG_RWTUN, &vm_background_launder_rate, 0, @@ -1030,7 +1025,7 @@ trybackground: ndirty = vmd->vmd_pagequeues[PQ_LAUNDRY].pq_cnt; if (target == 0 && inactq_scans != last_launder && ndirty * isqrt(inactq_scans - last_launder) >= nclean) { - target = vm_background_launder_target; + target = vmd->vmd_background_launder_target; } /* @@ -1880,6 +1875,14 @@ vm_pageout_init_domain(int domain) * page limit. This keeps the steady state out of shortfall. */ vmd->vmd_pageout_wakeup_thresh = (vmd->vmd_free_min / 10) * 11; + + /* + * Target amount of memory to move out of the laundry queue during a + * background laundering. This is proportional to the amount of system + * memory. + */ + vmd->vmd_background_launder_target = (vmd->vmd_free_target - + vmd->vmd_free_min) / 10; } static void @@ -1920,14 +1923,6 @@ vm_pageout_init(void) if (vm_page_max_wired == 0) vm_page_max_wired = freecount / 3; - - /* - * Target amount of memory to move out of the laundry queue during a - * background laundering. This is proportional to the amount of system - * memory. - */ - vm_background_launder_target = (vm_cnt.v_free_target - - vm_cnt.v_free_min) / 10; } /* @@ -2006,6 +2001,8 @@ pagedaemon_wait(int domain, int pri, const char *wmesg wakeup(&vmd->vmd_pageout_wanted); } vmd->vmd_pages_needed = true; + vmd->vmd_waiters++; msleep(&vmd->vmd_free_count, vm_domain_free_lockptr(vmd), PDROP | pri, wmesg, 0); + vmd->vmd_waiters--; } Modified: user/jeff/numa/sys/vm/vm_pagequeue.h ============================================================================== --- user/jeff/numa/sys/vm/vm_pagequeue.h Mon Jan 29 22:38:23 2018 (r328567) +++ user/jeff/numa/sys/vm/vm_pagequeue.h Mon Jan 29 22:50:44 2018 (r328568) @@ -93,6 +93,7 @@ struct vm_domain { int vmd_pageout_pages_needed; /* page daemon waiting for pages? */ int vmd_pageout_deficit; /* Estimated number of pages deficit */ + int vmd_waiters; /* Pageout waiters. */ bool vmd_pages_needed; /* Are threads waiting for free pages? */ bool vmd_pageout_wanted; /* pageout daemon wait channel */ bool vmd_minset; /* Are we in vm_min_domains? */ @@ -105,6 +106,7 @@ struct vm_domain { } vmd_laundry_request; /* Paging thresholds. */ + u_int vmd_background_launder_target; u_int vmd_free_reserved; /* (c) pages reserved for deadlock */ u_int vmd_free_target; /* (c) pages desired free */ u_int vmd_free_min; /* (c) pages desired free */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801292250.w0TMoieT035326>