From nobody Sat Mar 26 20:42:13 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 9C7061A41B75; Sat, 26 Mar 2022 20:42:14 +0000 (UTC) (envelope-from mhorne@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (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 "smtp.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KQrVZ45VNz3Qlb; Sat, 26 Mar 2022 20:42:14 +0000 (UTC) (envelope-from mhorne@freebsd.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1648327334; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vkDGH+p+V9D9tvr0jnz2AM5zQjOcv2gDVr6s3a19EfQ=; b=QvWNJD7a9XwYc87d+eUfUdAVNlFu7VKcR8ExwAGjcJV1MDCF19bQeSdowTn6wKDui6FaHe +XjllqTvehS83Qrh0fu9CItKHj9jlLznxxuiQY2B0YfbkM8IMqFR5A27eDZcR8Dd0qrw3q KuTLCJNi2GU95CrsIvx3xIbOLuOrnMWpyxBKS8OYP0WiNkL6G/CVWXkjZFLdilwOyX6+Th FzHphUCp5KAvzQFcgzniXYotcBLV9vVv89lg6WhVq3I39Okyh4Rh8H3vzN8Rsh6fOzhISC ld0E+9jrqrshGLVm8i3aFoGyvmWzwWUOs8aayrrkmUv56XZBxnPahNxJhAO3sQ== Received: from [192.168.1.106] (host-71-7-134-180.public.eastlink.ca [71.7.134.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: mhorne) by smtp.freebsd.org (Postfix) with ESMTPSA id 343512E6C2; Sat, 26 Mar 2022 20:42:14 +0000 (UTC) (envelope-from mhorne@freebsd.org) Message-ID: Date: Sat, 26 Mar 2022 17:42:13 -0300 List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0 Subject: Re: git: c35ec1efdcb2 - main - vfs: [1/2] fix stalls in vnode reclaim by not requeieing from vnlru Content-Language: en-CA To: Mateusz Guzik , src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org References: <202203100942.22A9gHMN095945@gitrepo.freebsd.org> From: Mitchell Horne In-Reply-To: <202203100942.22A9gHMN095945@gitrepo.freebsd.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1648327334; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vkDGH+p+V9D9tvr0jnz2AM5zQjOcv2gDVr6s3a19EfQ=; b=OgwO1bgyFN290QBdhrEBR/eOKqZF5oQSU2bgwiIy+21ltBKparPpvmCUTo7hPxaJ7F6XBp T/pYHET/koXfRVVX1E8pXqZMOmG+DxZYDbRlf8bWSu17Q2mxuesU4QgDTrp3mf/+3WwlQt d8QWYLx0+OpE6oIyqd0s+j/FzjjQGekml//fl/FVDeksoYwP4AACqN0aCaU2Euc5+6zugy hz5/o9rGnwKQqjpOQ50G3YLdC1lCj2yAEFtEHE6CU53RkBmU18NrrMG8xKOLMLTlBwwNtt 9ZayeomR/R4UE6AbgNJgMx1W1S43o07Asrsyc74xeI5crrK8uJz3pqHhxCQ2ow== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1648327334; a=rsa-sha256; cv=none; b=upwP18I1AJkB2+RzAOsZsWF4MU7dwd8ADgDdajYoYki9GsweOiODrpVZtisBwJrDGOJnM3 3H3gFCEXT+MRuJRvpjU1FvDCEMtkkZ7ob0L6U+qALxSSbsAzNzvGCZOlpXST1fIlh53ywm 7Ivixo9NRTKH+RD5NHX+3WU2cE7Un4E2MCku1GtkdgpzboULP0oanRciklJfwyYhEoH9oT bw9KmaWg3raDmxlJjrM5f7diJ/myzac2YmUibaONnRrQFRQ/jl+c3yhsdNoGTJIpW7+N/P R6kbZpMqq9eGhdB5qkvdHkzq9G78bdLgn7Lvxd9/bTKIlhY99ygB+WisDa4XxA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N On 3/10/22 05:42, Mateusz Guzik wrote: > The branch main has been updated by mjg: > > URL: https://cgit.FreeBSD.org/src/commit/?id=c35ec1efdcb2978bc3b6a0098c2b412be8d33e39 > > commit c35ec1efdcb2978bc3b6a0098c2b412be8d33e39 > Author: Mateusz Guzik > AuthorDate: 2022-03-07 10:33:59 +0000 > Commit: Mateusz Guzik > CommitDate: 2022-03-10 09:41:50 +0000 > > vfs: [1/2] fix stalls in vnode reclaim by not requeieing from vnlru > > Reported by: pho > --- > sys/kern/vfs_subr.c | 55 +++++++++++++++++++++++++++++++++++++++++++---------- > 1 file changed, 45 insertions(+), 10 deletions(-) > > diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c > index afafd02d92b9..436323873f7f 100644 > --- a/sys/kern/vfs_subr.c > +++ b/sys/kern/vfs_subr.c > @@ -113,6 +113,8 @@ static void vn_seqc_init(struct vnode *); > static void vn_seqc_write_end_free(struct vnode *vp); > static void vgonel(struct vnode *); > static bool vhold_recycle_free(struct vnode *); > +static void vdropl_recycle(struct vnode *vp); > +static void vdrop_recycle(struct vnode *vp); > static void vfs_knllock(void *arg); > static void vfs_knlunlock(void *arg); > static void vfs_knl_assert_lock(void *arg, int what); > @@ -1207,11 +1209,11 @@ restart: > mtx_unlock(&vnode_list_mtx); > > if (vn_start_write(vp, &mp, V_NOWAIT) != 0) { > - vdrop(vp); > + vdrop_recycle(vp); > goto next_iter_unlocked; > } > if (VOP_LOCK(vp, LK_EXCLUSIVE|LK_NOWAIT) != 0) { > - vdrop(vp); > + vdrop_recycle(vp); > vn_finished_write(mp); > goto next_iter_unlocked; > } > @@ -1222,14 +1224,14 @@ restart: > (vp->v_object != NULL && vp->v_object->handle == vp && > vp->v_object->resident_page_count > trigger)) { > VOP_UNLOCK(vp); > - vdropl(vp); > + vdropl_recycle(vp); > vn_finished_write(mp); > goto next_iter_unlocked; > } > counter_u64_add(recycles_count, 1); > vgonel(vp); > VOP_UNLOCK(vp); > - vdropl(vp); > + vdropl_recycle(vp); > vn_finished_write(mp); > done++; > next_iter_unlocked: > @@ -1613,7 +1615,7 @@ vtryrecycle(struct vnode *vp) > CTR2(KTR_VFS, > "%s: impossible to recycle, vp %p lock is already held", > __func__, vp); > - vdrop(vp); > + vdrop_recycle(vp); > return (EWOULDBLOCK); > } > /* > @@ -1624,7 +1626,7 @@ vtryrecycle(struct vnode *vp) > CTR2(KTR_VFS, > "%s: impossible to recycle, cannot start the write for %p", > __func__, vp); > - vdrop(vp); > + vdrop_recycle(vp); > return (EBUSY); > } > /* > @@ -1636,7 +1638,7 @@ vtryrecycle(struct vnode *vp) > VI_LOCK(vp); > if (vp->v_usecount) { > VOP_UNLOCK(vp); > - vdropl(vp); > + vdropl_recycle(vp); > vn_finished_write(vnmp); > CTR2(KTR_VFS, > "%s: impossible to recycle, %p is already referenced", > @@ -1648,7 +1650,7 @@ vtryrecycle(struct vnode *vp) > vgonel(vp); > } > VOP_UNLOCK(vp); > - vdropl(vp); > + vdropl_recycle(vp); > vn_finished_write(vnmp); > return (0); > } > @@ -3598,8 +3600,8 @@ vdrop(struct vnode *vp) > vdropl(vp); > } > > -void > -vdropl(struct vnode *vp) > +static void __always_inline > +vdropl_impl(struct vnode *vp, bool enqueue) > { Hi, It seems like enqueue is completely unused within the function. Was there a hunk missing from the final commit? Cheers, Mitchell > > ASSERT_VI_LOCKED(vp, __func__); > @@ -3627,6 +3629,39 @@ vdropl(struct vnode *vp) > vdbatch_enqueue(vp); > } > > +void > +vdropl(struct vnode *vp) > +{ > + > + vdropl_impl(vp, true); > +} > + > +/* > + * vdrop a vnode when recycling > + * > + * This is a special case routine only to be used when recycling, differs from > + * regular vdrop by not requeieing the vnode on LRU. > + * > + * Consider a case where vtryrecycle continuously fails with all vnodes (due to > + * e.g., frozen writes on the filesystem), filling the batch and causing it to > + * be requeued. Then vnlru will end up revisiting the same vnodes. This is a > + * loop which can last for as long as writes are frozen. > + */ > +static void > +vdropl_recycle(struct vnode *vp) > +{ > + > + vdropl_impl(vp, false); > +} > + > +static void > +vdrop_recycle(struct vnode *vp) > +{ > + > + VI_LOCK(vp); > + vdropl_recycle(vp); > +} > + > /* > * Call VOP_INACTIVE on the vnode and manage the DOINGINACT and OWEINACT > * flags. DOINGINACT prevents us from recursing in calls to vinactive.