From owner-svn-src-all@freebsd.org Sat Oct 24 01:14:53 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id A3C0B42BA26; Sat, 24 Oct 2020 01:14:53 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4CJ36j3l4jz3Z0F; Sat, 24 Oct 2020 01:14:53 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 63C351036C; Sat, 24 Oct 2020 01:14:53 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 09O1ErMJ036568; Sat, 24 Oct 2020 01:14:53 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 09O1ErBm036567; Sat, 24 Oct 2020 01:14:53 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <202010240114.09O1ErBm036567@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Sat, 24 Oct 2020 01:14:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366988 - head/sys/kern X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: head/sys/kern X-SVN-Commit-Revision: 366988 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 24 Oct 2020 01:14:53 -0000 Author: mjg Date: Sat Oct 24 01:14:52 2020 New Revision: 366988 URL: https://svnweb.freebsd.org/changeset/base/366988 Log: cache: batch updates to numcache in case of mass removal Modified: head/sys/kern/vfs_cache.c Modified: head/sys/kern/vfs_cache.c ============================================================================== --- head/sys/kern/vfs_cache.c Sat Oct 24 01:14:17 2020 (r366987) +++ head/sys/kern/vfs_cache.c Sat Oct 24 01:14:52 2020 (r366988) @@ -110,6 +110,7 @@ SDT_PROBE_DEFINE2(vfs, namecache, removecnp, hit, "str SDT_PROBE_DEFINE2(vfs, namecache, removecnp, miss, "struct vnode *", "struct componentname *"); SDT_PROBE_DEFINE1(vfs, namecache, purge, done, "struct vnode *"); +SDT_PROBE_DEFINE1(vfs, namecache, purge, batch, "int"); SDT_PROBE_DEFINE1(vfs, namecache, purge_negative, done, "struct vnode *"); SDT_PROBE_DEFINE1(vfs, namecache, purgevfs, done, "struct mount *"); SDT_PROBE_DEFINE3(vfs, namecache, zap, done, "struct vnode *", "char *", @@ -166,6 +167,8 @@ struct namecache_ts { struct namecache nc_nc; }; +TAILQ_HEAD(cache_freebatch, namecache); + /* * At least mips n32 performs 64-bit accesses to timespec as found * in namecache_ts and requires them to be aligned. Since others @@ -626,6 +629,27 @@ cache_free(struct namecache *ncp) atomic_subtract_long(&numcache, 1); } +static void +cache_free_batch(struct cache_freebatch *batch) +{ + struct namecache *ncp, *nnp; + int i; + + i = 0; + if (TAILQ_EMPTY(batch)) + goto out; + TAILQ_FOREACH_SAFE(ncp, batch, nc_dst, nnp) { + if ((ncp->nc_flag & NCF_DVDROP) != 0) { + cache_drop_vnode(ncp->nc_dvp); + } + cache_free_uma(ncp); + i++; + } + atomic_subtract_long(&numcache, i); +out: + SDT_PROBE1(vfs, namecache, purge, batch, i); +} + /* * TODO: With the value stored we can do better than computing the hash based * on the address. The choice of FNV should also be revisited. @@ -2524,11 +2548,11 @@ cache_changesize(u_long newmaxvnodes) static void cache_purge_impl(struct vnode *vp) { - TAILQ_HEAD(, namecache) ncps; - struct namecache *ncp, *nnp; + struct cache_freebatch batch; + struct namecache *ncp; struct mtx *vlp, *vlp2; - TAILQ_INIT(&ncps); + TAILQ_INIT(&batch); vlp = VP2VNODELOCK(vp); vlp2 = NULL; mtx_lock(vlp); @@ -2537,13 +2561,13 @@ retry: ncp = LIST_FIRST(&vp->v_cache_src); if (!cache_zap_locked_vnode_kl2(ncp, vp, &vlp2)) goto retry; - TAILQ_INSERT_TAIL(&ncps, ncp, nc_dst); + TAILQ_INSERT_TAIL(&batch, ncp, nc_dst); } while (!TAILQ_EMPTY(&vp->v_cache_dst)) { ncp = TAILQ_FIRST(&vp->v_cache_dst); if (!cache_zap_locked_vnode_kl2(ncp, vp, &vlp2)) goto retry; - TAILQ_INSERT_TAIL(&ncps, ncp, nc_dst); + TAILQ_INSERT_TAIL(&batch, ncp, nc_dst); } ncp = vp->v_cache_dd; if (ncp != NULL) { @@ -2551,15 +2575,13 @@ retry: ("lost dotdot link")); if (!cache_zap_locked_vnode_kl2(ncp, vp, &vlp2)) goto retry; - TAILQ_INSERT_TAIL(&ncps, ncp, nc_dst); + TAILQ_INSERT_TAIL(&batch, ncp, nc_dst); } KASSERT(vp->v_cache_dd == NULL, ("incomplete purge")); mtx_unlock(vlp); if (vlp2 != NULL) mtx_unlock(vlp2); - TAILQ_FOREACH_SAFE(ncp, &ncps, nc_dst, nnp) { - cache_free(ncp); - } + cache_free_batch(&batch); } /* @@ -2617,26 +2639,24 @@ cache_purge_vgone(struct vnode *vp) void cache_purge_negative(struct vnode *vp) { - TAILQ_HEAD(, namecache) ncps; + struct cache_freebatch batch; struct namecache *ncp, *nnp; struct mtx *vlp; SDT_PROBE1(vfs, namecache, purge_negative, done, vp); if (LIST_EMPTY(&vp->v_cache_src)) return; - TAILQ_INIT(&ncps); + TAILQ_INIT(&batch); vlp = VP2VNODELOCK(vp); mtx_lock(vlp); LIST_FOREACH_SAFE(ncp, &vp->v_cache_src, nc_src, nnp) { if (!(ncp->nc_flag & NCF_NEGATIVE)) continue; cache_zap_negative_locked_vnode_kl(ncp, vp); - TAILQ_INSERT_TAIL(&ncps, ncp, nc_dst); + TAILQ_INSERT_TAIL(&batch, ncp, nc_dst); } mtx_unlock(vlp); - TAILQ_FOREACH_SAFE(ncp, &ncps, nc_dst, nnp) { - cache_free(ncp); - } + cache_free_batch(&batch); } void