git: fb738982b514 - stable/15 - vnode: add VIRF_KNOTE flag
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 21 Jun 2026 10:15:57 UTC
The branch stable/15 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=fb738982b51414ebfc878eda24564a18e3f2590e
commit fb738982b51414ebfc878eda24564a18e3f2590e
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-04-24 01:31:27 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-06-21 10:05:28 +0000
vnode: add VIRF_KNOTE flag
(cherry picked from commit 1d5e4020e36e1cc9e906200c9c3c784ef43d977e)
---
sys/kern/vfs_subr.c | 14 ++++++++++----
sys/sys/mount.h | 12 ++++++++++--
sys/sys/vnode.h | 29 ++++++++++++-----------------
3 files changed, 32 insertions(+), 23 deletions(-)
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 01387b66392f..b252b4cc1556 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -6083,7 +6083,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);
}
@@ -6237,7 +6237,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);
}
@@ -6505,7 +6505,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);
}
@@ -6652,6 +6652,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);
}
@@ -6699,7 +6701,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 <sys/vnode.h>
+
#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 <sys/module.h>
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 0975b65799d6..f3ab68d1a4c9 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -224,18 +224,14 @@ _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.
@@ -260,6 +256,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 */
@@ -1062,7 +1059,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); \
@@ -1073,10 +1070,8 @@ 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)) { \
- VFS_KNOTE_LOCKED((ap)->a_vp, NOTE_WRITE | \
- (noffset > osize ? NOTE_EXTEND : 0)); \
- } \
+ VFS_KNOTE_LOCKED((ap)->a_vp, NOTE_WRITE | \
+ (noffset > osize ? NOTE_EXTEND : 0)); \
INOTIFY((ap)->a_vp, IN_MODIFY); \
}