From nobody Sun May 3 19:59:11 2026 X-Original-To: dev-commits-src-all@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 4g7wb40Ycjz6c0w1 for ; Sun, 03 May 2026 19:59:12 +0000 (UTC) (envelope-from git@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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g7wb352W1z42V1 for ; Sun, 03 May 2026 19:59:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777838351; 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; bh=WIOFBr2veT13TnsOcHBMf5Ngy0ClXwdmZY5pC2TACt8=; b=cDj0jWFV5x1G1/gXvdKffmqcqvPzn9+X/c8YNv2odhYbQtAz8FzEhQLgVTRPqmU9fvinO5 aB5l4GTf50RqzxVm6Tgm8RWdecpROelDRIfoXlJuNKqQOlGWkip3Xv0huMUyspWCI+TWDu xQqvvQHeLn3wsAW07TCLJM6iza6TWufx9Jc+9XeMQzLeHTBR/jH0dfmd5i+idj19Fu+xs4 9+CzJ3oPyuveZMSrQiyUJLcR8iIX0l28QZX3whGK4KheAPGpMnWXo+t4OG1A6RpPs9W1Yt 2Mh3ZRT2mLccXzBNGLlp+AKzZs0OZhvnekCSV4hKm4u7EFdmFpgnMJ6ukRFeHw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777838351; a=rsa-sha256; cv=none; b=febVNZ6WJJDWcA0wF8JYUKnyscGGhCtdC30kCPxxGnfj5fyyd/9mIAIXkuHMcDLwIIGMyZ fXVWblV8osXrWEsrZNwHYFxNIdX+nzuLKmk0bGCrekbQIztzfVUBtj77EDZsKIDrXtSpTt 0JaJ+P0o5wA8OCUJCfuCoSwc5FDpI9HVlpk0BQ9NE5Urrm4khh2eg8JRjMA6m1SqGxh2/7 Fl7KB1y9j9j1K/IGhZ/pZyHUG7dg3cj0Sgr7zXDOdiyuMhEOhpo+bVS6iNoeElYGgX/amC /tPkl8srhpRADXYGbaLm/OAUZlx2csyYTbX7ka/wWE/+is6egIkE2OXZ9noF6g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777838351; 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; bh=WIOFBr2veT13TnsOcHBMf5Ngy0ClXwdmZY5pC2TACt8=; b=rijb3ZAHRqylwHU4B36W8TFjjl18qn1rvVMtuhWMK4C5S3PVUT1C7Wz4Sgpl9QReGTR2L9 YTJbiQvND4MgpsrYzir+1f0bB1gly875z8I1tbrwuPBNmLkqAqfvI3q01+95IO5LLTZz+z B5qHO2iIBU9Jbueb+CBj+VIUjiN/NAgYdJL5Fz2DXOpKOjsttRWCnPB+vfFrB/o3aDoFFY PRUMQq+uThXqFd5aF+4mBoRls0y5s5n/aSTbx2zORfW8TdB4+OHJSQjIWP0OslYFZlf6en XScA3J12eLG0T6vcvZNBrgzJ3CTLnBgnA7IzFPboLpZH/85cOg9J/E70AJXhyQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g7wb34XcQznK4 for ; Sun, 03 May 2026 19:59:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3f9b7 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 03 May 2026 19:59:11 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 7fe74a02764e - main - vnode: add VIRF_KNOTE flag List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7fe74a02764e5899b10cdc45ab34182b961d5d19 Auto-Submitted: auto-generated Date: Sun, 03 May 2026 19:59:11 +0000 Message-Id: <69f7a90f.3f9b7.6e65e909@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=7fe74a02764e5899b10cdc45ab34182b961d5d19 commit 7fe74a02764e5899b10cdc45ab34182b961d5d19 Author: Konstantin Belousov AuthorDate: 2026-04-24 01:31:27 +0000 Commit: Konstantin Belousov CommitDate: 2026-05-03 19:58:37 +0000 vnode: add VIRF_KNOTE flag to indicate non-empty vnode knote list. Use it instead of VN_KNLIST_EMPTY() and guard note activations with it. Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D56611 --- sys/kern/vfs_subr.c | 51 ++++++++++++++++++++++++++++++++++----------------- sys/sys/mount.h | 12 ++++++++++-- sys/sys/vnode.h | 26 ++++++++++++-------------- 3 files changed, 56 insertions(+), 33 deletions(-) diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index b008db45a8b7..57de07ffaa12 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -5817,6 +5817,15 @@ assert_vop_elocked(struct vnode *vp, const char *str) } #endif /* INVARIANTS */ +static bool +vop_check_pollinfo(struct vnode *vp, int rc) +{ + return (rc == 0 && + (vn_irflag_read(vp) & (VIRF_KNOTE | VIRF_INOTIFY)) != 0); +} +#define vop_check_pollinfo(vp, rc) \ + __predict_false((vop_check_pollinfo)((vp), (rc))) + void vop_rename_fail(struct vop_rename_args *ap) { @@ -6093,7 +6102,7 @@ vop_create_post(void *ap, int rc) a = ap; dvp = a->a_dvp; vn_seqc_write_end(dvp); - if (!rc) { + if (rc == 0) { VFS_KNOTE_LOCKED(dvp, NOTE_WRITE); INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE); } @@ -6151,7 +6160,7 @@ vop_deleteextattr_post(void *ap, int rc) a = ap; vp = a->a_vp; vn_seqc_write_end(vp); - if (!rc) { + if (vop_check_pollinfo(vp, rc)) { VFS_KNOTE_LOCKED(a->a_vp, NOTE_ATTRIB); INOTIFY(vp, IN_ATTRIB); } @@ -6181,7 +6190,7 @@ vop_link_post(void *ap, int rc) tdvp = a->a_tdvp; vn_seqc_write_end(vp); vn_seqc_write_end(tdvp); - if (!rc) { + if (rc == 0) { VFS_KNOTE_LOCKED(vp, NOTE_LINK); VFS_KNOTE_LOCKED(tdvp, NOTE_WRITE); INOTIFY_NAME(vp, tdvp, a->a_cnp, _IN_ATTRIB_LINKCOUNT); @@ -6209,7 +6218,7 @@ vop_mkdir_post(void *ap, int rc) a = ap; dvp = a->a_dvp; vn_seqc_write_end(dvp); - if (!rc) { + if (rc == 0) { VFS_KNOTE_LOCKED(dvp, NOTE_WRITE | NOTE_LINK); INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE); } @@ -6247,7 +6256,7 @@ vop_mknod_post(void *ap, int rc) a = ap; dvp = a->a_dvp; vn_seqc_write_end(dvp); - if (!rc) { + if (rc == 0) { VFS_KNOTE_LOCKED(dvp, NOTE_WRITE); INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE); } @@ -6262,7 +6271,8 @@ vop_reclaim_post(void *ap, int rc) a = ap; vp = a->a_vp; ASSERT_VOP_IN_SEQC(vp); - if (!rc) { + + if (vop_check_pollinfo(vp, rc)) { VFS_KNOTE_LOCKED(vp, NOTE_REVOKE); INOTIFY_REVOKE(vp); } @@ -6293,7 +6303,7 @@ vop_remove_post(void *ap, int rc) vp = a->a_vp; vn_seqc_write_end(dvp); vn_seqc_write_end(vp); - if (!rc) { + if (rc == 0) { VFS_KNOTE_LOCKED(dvp, NOTE_WRITE); VFS_KNOTE_LOCKED(vp, NOTE_DELETE); INOTIFY_NAME(vp, dvp, a->a_cnp, _IN_ATTRIB_LINKCOUNT); @@ -6366,7 +6376,7 @@ vop_rmdir_post(void *ap, int rc) vp = a->a_vp; vn_seqc_write_end(dvp); vn_seqc_write_end(vp); - if (!rc) { + if (rc == 0) { vp->v_vflag |= VV_UNLINKED; VFS_KNOTE_LOCKED(dvp, NOTE_WRITE | NOTE_LINK); VFS_KNOTE_LOCKED(vp, NOTE_DELETE); @@ -6394,7 +6404,7 @@ vop_setattr_post(void *ap, int rc) a = ap; vp = a->a_vp; vn_seqc_write_end(vp); - if (!rc) { + if (vop_check_pollinfo(vp, rc)) { VFS_KNOTE_LOCKED(vp, NOTE_ATTRIB); INOTIFY(vp, IN_ATTRIB); } @@ -6442,7 +6452,7 @@ vop_setextattr_post(void *ap, int rc) a = ap; vp = a->a_vp; vn_seqc_write_end(vp); - if (!rc) { + if (vop_check_pollinfo(vp, rc)) { VFS_KNOTE_LOCKED(vp, NOTE_ATTRIB); INOTIFY(vp, IN_ATTRIB); } @@ -6468,7 +6478,7 @@ vop_symlink_post(void *ap, int rc) a = ap; dvp = a->a_dvp; vn_seqc_write_end(dvp); - if (!rc) { + if (rc == 0) { VFS_KNOTE_LOCKED(dvp, NOTE_WRITE); INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE); } @@ -6479,7 +6489,7 @@ vop_open_post(void *ap, int rc) { struct vop_open_args *a = ap; - if (!rc) { + if (vop_check_pollinfo(a->a_vp, rc)) { VFS_KNOTE_LOCKED(a->a_vp, NOTE_OPEN); INOTIFY(a->a_vp, IN_OPEN); } @@ -6490,8 +6500,9 @@ vop_close_post(void *ap, int rc) { struct vop_close_args *a = ap; - if (!rc && (a->a_cred != NOCRED || /* filter out revokes */ - !VN_IS_DOOMED(a->a_vp))) { + if (rc == 0 && (a->a_cred != NOCRED || /* filter out revokes */ + !VN_IS_DOOMED(a->a_vp)) && + vop_check_pollinfo(a->a_vp, rc)) { VFS_KNOTE_LOCKED(a->a_vp, (a->a_fflag & FWRITE) != 0 ? NOTE_CLOSE_WRITE : NOTE_CLOSE); INOTIFY(a->a_vp, (a->a_fflag & FWRITE) != 0 ? @@ -6504,7 +6515,7 @@ vop_read_post(void *ap, int rc) { struct vop_read_args *a = ap; - if (!rc) { + if (vop_check_pollinfo(a->a_vp, rc)) { VFS_KNOTE_LOCKED(a->a_vp, NOTE_READ); INOTIFY(a->a_vp, IN_ACCESS); } @@ -6515,7 +6526,7 @@ vop_read_pgcache_post(void *ap, int rc) { struct vop_read_pgcache_args *a = ap; - if (!rc) + if (rc == 0) VFS_KNOTE_UNLOCKED(a->a_vp, NOTE_READ); } @@ -6662,6 +6673,8 @@ vfs_knlunlock(void *arg) { struct vnode *vp = arg; + if (KNLIST_EMPTY(&vp->v_pollinfo->vpi_selinfo.si_note)) + vn_irflag_unset(vp, VIRF_KNOTE); VOP_UNLOCK(vp); } @@ -6709,7 +6722,11 @@ vfs_kqfilter(struct vop_kqfilter_args *ap) return (ENOMEM); knl = &vp->v_pollinfo->vpi_selinfo.si_note; vhold(vp); - knlist_add(knl, kn, 0); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + knlist_add(knl, kn, 1); + if ((vn_irflag_read(vp) & VIRF_KNOTE) == 0) + vn_irflag_set(vp, VIRF_KNOTE); + VOP_UNLOCK(vp); return (0); } diff --git a/sys/sys/mount.h b/sys/sys/mount.h index 1564d2cc22c4..170201b82ac1 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -952,14 +952,22 @@ vfs_statfs_t __vfs_statfs; } \ } while (0) +#include + #define VFS_KNOTE_LOCKED(vp, hint) do \ { \ - VN_KNOTE((vp), (hint), KNF_LISTLOCKED); \ + if ((vn_irflag_read(vp) & VIRF_KNOTE) != 0) { \ + KNOTE_LOCKED(&vp->v_pollinfo->vpi_selinfo.si_note, \ + hint); \ + } \ } while (0) #define VFS_KNOTE_UNLOCKED(vp, hint) do \ { \ - VN_KNOTE((vp), (hint), 0); \ + if ((vn_irflag_read(vp) & VIRF_KNOTE) != 0) { \ + KNOTE_UNLOCKED(&vp->v_pollinfo->vpi_selinfo.si_note, \ + hint); \ + } \ } while (0) #include diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 7dde71834143..0ceaed3cf4b5 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -225,18 +225,15 @@ _Static_assert(sizeof(struct vnode) <= 448, "vnode size crosses 448 bytes"); /* XXX: These are temporary to avoid a source sweep at this time */ #define v_object v_bufobj.bo_object -/* We don't need to lock the knlist */ -#define VN_KNLIST_EMPTY(vp) ((vp)->v_pollinfo == NULL || \ - KNLIST_EMPTY(&(vp)->v_pollinfo->vpi_selinfo.si_note)) - -#define VN_KNOTE(vp, b, a) \ - do { \ - if (!VN_KNLIST_EMPTY(vp)) \ - KNOTE(&vp->v_pollinfo->vpi_selinfo.si_note, (b), \ - (a) | KNF_NOKQLOCK); \ - } while (0) -#define VN_KNOTE_LOCKED(vp, b) VN_KNOTE(vp, b, KNF_LISTLOCKED) -#define VN_KNOTE_UNLOCKED(vp, b) VN_KNOTE(vp, b, 0) +#define VN_KNOTE(vp, b, a) \ +do { \ + if ((vn_irflag_read(vp) & VIRF_KNOTE) != 0) { \ + KNOTE(&vp->v_pollinfo->vpi_selinfo.si_note, (b), \ + (a) | KNF_NOKQLOCK); \ + } \ +} while (0) +#define VN_KNOTE_LOCKED(vp, b) VN_KNOTE(vp, b, KNF_LISTLOCKED) +#define VN_KNOTE_UNLOCKED(vp, b) VN_KNOTE(vp, b, 0) /* * Vnode flags. @@ -261,6 +258,7 @@ _Static_assert(sizeof(struct vnode) <= 448, "vnode size crosses 448 bytes"); #define VIRF_INOTIFY 0x0080 /* This vnode is being watched */ #define VIRF_INOTIFY_PARENT 0x0100 /* A parent of this vnode may be being watched */ +#define VIRF_KNOTE 0x0200 /* Has knlist */ #define VI_UNUSED0 0x0001 /* unused */ #define VI_MOUNT 0x0002 /* Mount in progress */ @@ -1053,7 +1051,7 @@ void vop_rename_fail(struct vop_rename_args *ap); off_t osize, ooffset, noffset; \ \ osize = ooffset = noffset = 0; \ - if (!VN_KNLIST_EMPTY((ap)->a_vp)) { \ + if ((vn_irflag_read((ap)->a_vp) & VIRF_KNOTE) != 0) { \ error = VOP_GETATTR((ap)->a_vp, &va, (ap)->a_cred); \ if (error) \ return (error); \ @@ -1064,7 +1062,7 @@ void vop_rename_fail(struct vop_rename_args *ap); #define vop_write_post(ap, ret) \ noffset = (ap)->a_uio->uio_offset; \ if (noffset > ooffset) { \ - if (!VN_KNLIST_EMPTY((ap)->a_vp)) { \ + if ((vn_irflag_read((ap)->a_vp) & VIRF_KNOTE) != 0) { \ VFS_KNOTE_LOCKED((ap)->a_vp, NOTE_WRITE | \ (noffset > osize ? NOTE_EXTEND : 0)); \ } \