Module Name: src Committed By: ad Date: Sun Dec 1 14:40:31 UTC 2019
Modified Files: src/sys/uvm: uvm.h uvm_anon.c uvm_aobj.c uvm_km.c uvm_loan.c uvm_pager.c uvm_pdaemon.c uvm_swap.c Log Message: - Adjust uvmexp.swpgonly with atomics, and make uvm_swap_data_lock static. - A bit more __cacheline_aligned on mutexes. To generate a diff of this commit: cvs rdiff -u -r1.68 -r1.69 src/sys/uvm/uvm.h cvs rdiff -u -r1.64 -r1.65 src/sys/uvm/uvm_anon.c cvs rdiff -u -r1.128 -r1.129 src/sys/uvm/uvm_aobj.c cvs rdiff -u -r1.147 -r1.148 src/sys/uvm/uvm_km.c cvs rdiff -u -r1.87 -r1.88 src/sys/uvm/uvm_loan.c cvs rdiff -u -r1.111 -r1.112 src/sys/uvm/uvm_pager.c \ src/sys/uvm/uvm_pdaemon.c cvs rdiff -u -r1.181 -r1.182 src/sys/uvm/uvm_swap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/uvm/uvm.h diff -u src/sys/uvm/uvm.h:1.68 src/sys/uvm/uvm.h:1.69 --- src/sys/uvm/uvm.h:1.68 Mon Jan 2 20:08:32 2017 +++ src/sys/uvm/uvm.h Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm.h,v 1.68 2017/01/02 20:08:32 cherry Exp $ */ +/* $NetBSD: uvm.h,v 1.69 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -126,7 +126,6 @@ extern struct uvm_object *uvm_kernel_obj extern kmutex_t uvm_pageqlock; /* lock for active/inactive page q */ extern kmutex_t uvm_fpageqlock; /* lock for free page q */ extern kmutex_t uvm_kentry_lock; -extern kmutex_t uvm_swap_data_lock; #endif /* _KERNEL */ Index: src/sys/uvm/uvm_anon.c diff -u src/sys/uvm/uvm_anon.c:1.64 src/sys/uvm/uvm_anon.c:1.65 --- src/sys/uvm/uvm_anon.c:1.64 Sat Oct 28 00:37:13 2017 +++ src/sys/uvm/uvm_anon.c Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_anon.c,v 1.64 2017/10/28 00:37:13 pgoyette Exp $ */ +/* $NetBSD: uvm_anon.c,v 1.65 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_anon.c,v 1.64 2017/10/28 00:37:13 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_anon.c,v 1.65 2019/12/01 14:40:31 ad Exp $"); #include "opt_uvmhist.h" @@ -172,10 +172,8 @@ uvm_anon_dispose(struct vm_anon *anon) #if defined(VMSWAP) if (pg == NULL && anon->an_swslot > 0) { /* This page is no longer only in swap. */ - mutex_enter(&uvm_swap_data_lock); KASSERT(uvmexp.swpgonly > 0); - uvmexp.swpgonly--; - mutex_exit(&uvm_swap_data_lock); + atomic_dec_uint(&uvmexp.swpgonly); } #endif Index: src/sys/uvm/uvm_aobj.c diff -u src/sys/uvm/uvm_aobj.c:1.128 src/sys/uvm/uvm_aobj.c:1.129 --- src/sys/uvm/uvm_aobj.c:1.128 Sun Jul 28 05:28:53 2019 +++ src/sys/uvm/uvm_aobj.c Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_aobj.c,v 1.128 2019/07/28 05:28:53 msaitoh Exp $ */ +/* $NetBSD: uvm_aobj.c,v 1.129 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1998 Chuck Silvers, Charles D. Cranor and @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.128 2019/07/28 05:28:53 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.129 2019/12/01 14:40:31 ad Exp $"); #ifdef _KERNEL_OPT #include "opt_uvmhist.h" @@ -1491,10 +1491,8 @@ uao_dropswap_range(struct uvm_object *uo */ if (swpgonlydelta > 0) { - mutex_enter(&uvm_swap_data_lock); KASSERT(uvmexp.swpgonly >= swpgonlydelta); - uvmexp.swpgonly -= swpgonlydelta; - mutex_exit(&uvm_swap_data_lock); + atomic_add_int(&uvmexp.swpgonly, -swpgonlydelta); } } Index: src/sys/uvm/uvm_km.c diff -u src/sys/uvm/uvm_km.c:1.147 src/sys/uvm/uvm_km.c:1.148 --- src/sys/uvm/uvm_km.c:1.147 Thu Nov 14 16:23:53 2019 +++ src/sys/uvm/uvm_km.c Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_km.c,v 1.147 2019/11/14 16:23:53 maxv Exp $ */ +/* $NetBSD: uvm_km.c,v 1.148 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -152,7 +152,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.147 2019/11/14 16:23:53 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.148 2019/12/01 14:40:31 ad Exp $"); #include "opt_uvmhist.h" @@ -481,10 +481,7 @@ uvm_km_pgremove(vaddr_t startva, vaddr_t mutex_exit(uobj->vmobjlock); if (swpgonlydelta > 0) { - mutex_enter(&uvm_swap_data_lock); - KASSERT(uvmexp.swpgonly >= swpgonlydelta); - uvmexp.swpgonly -= swpgonlydelta; - mutex_exit(&uvm_swap_data_lock); + atomic_add_int(&uvmexp.swpgonly, -swpgonlydelta); } } Index: src/sys/uvm/uvm_loan.c diff -u src/sys/uvm/uvm_loan.c:1.87 src/sys/uvm/uvm_loan.c:1.88 --- src/sys/uvm/uvm_loan.c:1.87 Fri May 25 20:11:03 2018 +++ src/sys/uvm/uvm_loan.c Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_loan.c,v 1.87 2018/05/25 20:11:03 jdolecek Exp $ */ +/* $NetBSD: uvm_loan.c,v 1.88 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_loan.c,v 1.87 2018/05/25 20:11:03 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_loan.c,v 1.88 2019/12/01 14:40:31 ad Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -837,7 +837,7 @@ fail: */ static struct uvm_object uvm_loanzero_object; -static kmutex_t uvm_loanzero_lock; +static kmutex_t uvm_loanzero_lock __cacheline_aligned; static int uvm_loanzero(struct uvm_faultinfo *ufi, void ***output, int flags) Index: src/sys/uvm/uvm_pager.c diff -u src/sys/uvm/uvm_pager.c:1.111 src/sys/uvm/uvm_pager.c:1.112 --- src/sys/uvm/uvm_pager.c:1.111 Sat Oct 28 00:37:13 2017 +++ src/sys/uvm/uvm_pager.c Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_pager.c,v 1.111 2017/10/28 00:37:13 pgoyette Exp $ */ +/* $NetBSD: uvm_pager.c,v 1.112 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.111 2017/10/28 00:37:13 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_pager.c,v 1.112 2019/12/01 14:40:31 ad Exp $"); #include "opt_uvmhist.h" #include "opt_readahead.h" @@ -77,7 +77,7 @@ const struct uvm_pagerops * const uvmpag */ struct vm_map *pager_map; /* XXX */ -kmutex_t pager_map_wanted_lock; +kmutex_t pager_map_wanted_lock __cacheline_aligned; bool pager_map_wanted; /* locked by pager map */ static vaddr_t emergva; static int emerg_ncolors; @@ -467,12 +467,10 @@ uvm_aio_aiodone_pages(struct vm_page **p KASSERT(write); /* these pages are now only in swap. */ - mutex_enter(&uvm_swap_data_lock); if (error != ENOMEM) { KASSERT(uvmexp.swpgonly + npages <= uvmexp.swpginuse); - uvmexp.swpgonly += npages; + atomic_add_int(&uvmexp.swpgonly, npages); } - mutex_exit(&uvm_swap_data_lock); if (error) { if (error != ENOMEM) uvm_swap_markbad(swslot, npages); Index: src/sys/uvm/uvm_pdaemon.c diff -u src/sys/uvm/uvm_pdaemon.c:1.111 src/sys/uvm/uvm_pdaemon.c:1.112 --- src/sys/uvm/uvm_pdaemon.c:1.111 Tue Oct 1 17:40:22 2019 +++ src/sys/uvm/uvm_pdaemon.c Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_pdaemon.c,v 1.111 2019/10/01 17:40:22 chs Exp $ */ +/* $NetBSD: uvm_pdaemon.c,v 1.112 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.111 2019/10/01 17:40:22 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.112 2019/12/01 14:40:31 ad Exp $"); #include "opt_uvmhist.h" #include "opt_readahead.h" @@ -825,15 +825,12 @@ uvmpd_scan_queue(void) } else { slot = uao_find_swslot(uobj, pageidx); } - mutex_exit(slock); - if (slot > 0) { /* this page is now only in swap. */ - mutex_enter(&uvm_swap_data_lock); KASSERT(uvmexp.swpgonly < uvmexp.swpginuse); - uvmexp.swpgonly++; - mutex_exit(&uvm_swap_data_lock); + atomic_inc_uint(&uvmexp.swpgonly); } + mutex_exit(slock); continue; } Index: src/sys/uvm/uvm_swap.c diff -u src/sys/uvm/uvm_swap.c:1.181 src/sys/uvm/uvm_swap.c:1.182 --- src/sys/uvm/uvm_swap.c:1.181 Sun Oct 6 05:48:00 2019 +++ src/sys/uvm/uvm_swap.c Sun Dec 1 14:40:31 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_swap.c,v 1.181 2019/10/06 05:48:00 mlelstv Exp $ */ +/* $NetBSD: uvm_swap.c,v 1.182 2019/12/01 14:40:31 ad Exp $ */ /* * Copyright (c) 1995, 1996, 1997, 2009 Matthew R. Green @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.181 2019/10/06 05:48:00 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.182 2019/12/01 14:40:31 ad Exp $"); #include "opt_uvmhist.h" #include "opt_compat_netbsd.h" @@ -190,6 +190,7 @@ LIST_HEAD(swap_priority, swappri); static struct swap_priority swap_priority; /* locks */ +static kmutex_t uvm_swap_data_lock __cacheline_aligned; static krwlock_t swap_syscall_lock; /* workqueue and use counter for swap to regular files */ @@ -1069,7 +1070,7 @@ uvm_swap_shutdown(struct lwp *l) struct vnode *vp; int error; - printf("turning of swap..."); + printf("turning off swap..."); rw_enter(&swap_syscall_lock, RW_WRITER); mutex_enter(&uvm_swap_data_lock); again: @@ -1663,7 +1664,7 @@ uvm_swap_markbad(int startslot, int nslo */ KASSERT(uvmexp.swpgonly >= nslots); - uvmexp.swpgonly -= nslots; + atomic_add_int(&uvmexp.swpgonly, -nslots); sdp->swd_npgbad += nslots; UVMHIST_LOG(pdhist, "now %jd bad", sdp->swd_npgbad, 0,0,0); mutex_exit(&uvm_swap_data_lock); @@ -1750,10 +1751,8 @@ uvm_swap_get(struct vm_page *page, int s * this page is no longer only in swap. */ - mutex_enter(&uvm_swap_data_lock); KASSERT(uvmexp.swpgonly > 0); - uvmexp.swpgonly--; - mutex_exit(&uvm_swap_data_lock); + atomic_dec_uint(&uvmexp.swpgonly); } return error; }