Module Name: src Committed By: thorpej Date: Mon Oct 11 01:07:37 UTC 2021
Modified Files: src/sys/dev/pci: xmm7360.c src/sys/kern: kern_event.c sys_pipe.c tty_pty.c uipc_socket.c src/sys/miscfs/fifofs: fifo_vnops.c src/sys/miscfs/genfs: genfs_vnops.c src/sys/nfs: nfs_kq.c src/sys/sys: event.h param.h Log Message: Setting EV_EOF requires modifying kn->kn_flags. However, that relies on holding the kq_lock of that note's kq. Rather than exposing this directly, add new knote_set_eof() and knote_clear_eof() functions that handle the necessary locking and don't leak as many implementation details to modules. NetBSD 9.99.91 To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/dev/pci/xmm7360.c cvs rdiff -u -r1.130 -r1.131 src/sys/kern/kern_event.c cvs rdiff -u -r1.157 -r1.158 src/sys/kern/sys_pipe.c cvs rdiff -u -r1.148 -r1.149 src/sys/kern/tty_pty.c cvs rdiff -u -r1.298 -r1.299 src/sys/kern/uipc_socket.c cvs rdiff -u -r1.90 -r1.91 src/sys/miscfs/fifofs/fifo_vnops.c cvs rdiff -u -r1.213 -r1.214 src/sys/miscfs/genfs/genfs_vnops.c cvs rdiff -u -r1.29 -r1.30 src/sys/nfs/nfs_kq.c cvs rdiff -u -r1.45 -r1.46 src/sys/sys/event.h cvs rdiff -u -r1.703 -r1.704 src/sys/sys/param.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/xmm7360.c diff -u src/sys/dev/pci/xmm7360.c:1.10 src/sys/dev/pci/xmm7360.c:1.11 --- src/sys/dev/pci/xmm7360.c:1.10 Sun Sep 26 01:16:09 2021 +++ src/sys/dev/pci/xmm7360.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: xmm7360.c,v 1.10 2021/09/26 01:16:09 thorpej Exp $ */ +/* $NetBSD: xmm7360.c,v 1.11 2021/10/11 01:07:36 thorpej Exp $ */ /* * Device driver for Intel XMM7360 LTE modems, eg. Fibocom L850-GL. @@ -75,7 +75,7 @@ MODULE_DEVICE_TABLE(pci, xmm7360_ids); #include "opt_gateway.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xmm7360.c,v 1.10 2021/09/26 01:16:09 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xmm7360.c,v 1.11 2021/10/11 01:07:36 thorpej Exp $"); #endif #include <sys/param.h> @@ -166,6 +166,7 @@ typedef struct mutex spinlock_t; #define device_private(devt) (void *)devt; #define if_deferred_start_init(ifp, arg) /* nothing */ #define IF_OUTPUT_CONST /* nothing */ +#define knote_set_eof(kn, f) (kn)->kn_flags |= EV_EOF | (f) #define tty_lock() int s = spltty() #define tty_unlock() splx(s) #define tty_locked() /* nothing */ @@ -2762,7 +2763,7 @@ filt_wwancread(struct knote *kn, long hi kn->kn_data = 0; if (!qp->open) { - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); return (1); } else { kn->kn_data = xmm7360_qp_has_data(qp) ? 1 : 0; Index: src/sys/kern/kern_event.c diff -u src/sys/kern/kern_event.c:1.130 src/sys/kern/kern_event.c:1.131 --- src/sys/kern/kern_event.c:1.130 Sun Oct 10 19:11:56 2021 +++ src/sys/kern/kern_event.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_event.c,v 1.130 2021/10/10 19:11:56 thorpej Exp $ */ +/* $NetBSD: kern_event.c,v 1.131 2021/10/11 01:07:36 thorpej Exp $ */ /*- * Copyright (c) 2008, 2009, 2021 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ #endif /* _KERNEL_OPT */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.130 2021/10/10 19:11:56 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.131 2021/10/11 01:07:36 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -2578,3 +2578,30 @@ knote_activate(struct knote *kn) out: mutex_spin_exit(&kq->kq_lock); } + +/* + * Set EV_EOF on the specified knote. Also allows additional + * EV_* flags to be set (e.g. EV_ONESHOT). + */ +void +knote_set_eof(struct knote *kn, uint32_t flags) +{ + struct kqueue *kq = kn->kn_kq; + + mutex_spin_enter(&kq->kq_lock); + kn->kn_flags |= EV_EOF | flags; + mutex_spin_exit(&kq->kq_lock); +} + +/* + * Clear EV_EOF on the specified knote. + */ +void +knote_clear_eof(struct knote *kn) +{ + struct kqueue *kq = kn->kn_kq; + + mutex_spin_enter(&kq->kq_lock); + kn->kn_flags &= ~EV_EOF; + mutex_spin_exit(&kq->kq_lock); +} Index: src/sys/kern/sys_pipe.c diff -u src/sys/kern/sys_pipe.c:1.157 src/sys/kern/sys_pipe.c:1.158 --- src/sys/kern/sys_pipe.c:1.157 Sat Oct 2 07:35:40 2021 +++ src/sys/kern/sys_pipe.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_pipe.c,v 1.157 2021/10/02 07:35:40 hannken Exp $ */ +/* $NetBSD: sys_pipe.c,v 1.158 2021/10/11 01:07:36 thorpej Exp $ */ /*- * Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.157 2021/10/02 07:35:40 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_pipe.c,v 1.158 2021/10/11 01:07:36 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1056,7 +1056,7 @@ filt_piperead(struct knote *kn, long hin if ((rpipe->pipe_state & PIPE_EOF) || (wpipe == NULL) || (wpipe->pipe_state & PIPE_EOF)) { - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); rv = 1; } else { rv = kn->kn_data > 0; @@ -1082,7 +1082,7 @@ filt_pipewrite(struct knote *kn, long hi if ((wpipe == NULL) || (wpipe->pipe_state & PIPE_EOF)) { kn->kn_data = 0; - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); rv = 1; } else { kn->kn_data = wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt; Index: src/sys/kern/tty_pty.c diff -u src/sys/kern/tty_pty.c:1.148 src/sys/kern/tty_pty.c:1.149 --- src/sys/kern/tty_pty.c:1.148 Wed Sep 29 13:14:39 2021 +++ src/sys/kern/tty_pty.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: tty_pty.c,v 1.148 2021/09/29 13:14:39 thorpej Exp $ */ +/* $NetBSD: tty_pty.c,v 1.149 2021/10/11 01:07:36 thorpej Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.148 2021/09/29 13:14:39 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty_pty.c,v 1.149 2021/10/11 01:07:36 thorpej Exp $"); #include "opt_ptm.h" @@ -939,7 +939,7 @@ filt_ptcread(struct knote *kn, long hint kn->kn_data++; } if (!ISSET(tp->t_state, TS_CARR_ON)) { - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); canread = 1; } Index: src/sys/kern/uipc_socket.c diff -u src/sys/kern/uipc_socket.c:1.298 src/sys/kern/uipc_socket.c:1.299 --- src/sys/kern/uipc_socket.c:1.298 Wed Sep 29 13:15:45 2021 +++ src/sys/kern/uipc_socket.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.298 2021/09/29 13:15:45 thorpej Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.299 2021/10/11 01:07:36 thorpej Exp $ */ /* * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.298 2021/09/29 13:15:45 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.299 2021/10/11 01:07:36 thorpej Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -2242,7 +2242,7 @@ filt_soread(struct knote *kn, long hint) solock(so); kn->kn_data = so->so_rcv.sb_cc; if (so->so_state & SS_CANTRCVMORE) { - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); kn->kn_fflags = so->so_error; rv = 1; } else if (so->so_error || so->so_rerror) @@ -2280,7 +2280,7 @@ filt_sowrite(struct knote *kn, long hint solock(so); kn->kn_data = sbspace(&so->so_snd); if (so->so_state & SS_CANTSENDMORE) { - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); kn->kn_fflags = so->so_error; rv = 1; } else if (so->so_error) Index: src/sys/miscfs/fifofs/fifo_vnops.c diff -u src/sys/miscfs/fifofs/fifo_vnops.c:1.90 src/sys/miscfs/fifofs/fifo_vnops.c:1.91 --- src/sys/miscfs/fifofs/fifo_vnops.c:1.90 Sat Oct 2 18:39:15 2021 +++ src/sys/miscfs/fifofs/fifo_vnops.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: fifo_vnops.c,v 1.90 2021/10/02 18:39:15 thorpej Exp $ */ +/* $NetBSD: fifo_vnops.c,v 1.91 2021/10/11 01:07:36 thorpej Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.90 2021/10/02 18:39:15 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.91 2021/10/11 01:07:36 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -608,10 +608,10 @@ filt_fiforead(struct knote *kn, long hin solock(so); kn->kn_data = so->so_rcv.sb_cc; if (so->so_state & SS_CANTRCVMORE) { - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); rv = 1; } else { - kn->kn_flags &= ~EV_EOF; + knote_clear_eof(kn); rv = (kn->kn_data >= so->so_rcv.sb_lowat); } if (hint != NOTE_SUBMIT) @@ -642,10 +642,10 @@ filt_fifowrite(struct knote *kn, long hi solock(so); kn->kn_data = sbspace(&so->so_snd); if (so->so_state & SS_CANTSENDMORE) { - kn->kn_flags |= EV_EOF; + knote_set_eof(kn, 0); rv = 1; } else { - kn->kn_flags &= ~EV_EOF; + knote_clear_eof(kn); rv = (kn->kn_data >= so->so_snd.sb_lowat); } if (hint != NOTE_SUBMIT) Index: src/sys/miscfs/genfs/genfs_vnops.c diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.213 src/sys/miscfs/genfs/genfs_vnops.c:1.214 --- src/sys/miscfs/genfs/genfs_vnops.c:1.213 Sun Oct 10 23:46:23 2021 +++ src/sys/miscfs/genfs/genfs_vnops.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: genfs_vnops.c,v 1.213 2021/10/10 23:46:23 thorpej Exp $ */ +/* $NetBSD: genfs_vnops.c,v 1.214 2021/10/11 01:07:36 thorpej Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.213 2021/10/10 23:46:23 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.214 2021/10/11 01:07:36 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -68,7 +68,6 @@ __KERNEL_RCSID(0, "$NetBSD: genfs_vnops. #include <sys/namei.h> #include <sys/vnode_impl.h> #include <sys/fcntl.h> -#include <sys/eventvar.h> /* XXX for kq->kq_lock */ #include <sys/kmem.h> #include <sys/poll.h> #include <sys/mman.h> @@ -526,9 +525,7 @@ filt_genfsread(struct knote *kn, long hi switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); - mutex_spin_enter(&kn->kn_kq->kq_lock); - kn->kn_flags |= (EV_EOF | EV_ONESHOT); - mutex_spin_exit(&kn->kn_kq->kq_lock); + knote_set_eof(kn, EV_ONESHOT); return (1); case 0: mutex_enter(vp->v_interlock); @@ -555,9 +552,7 @@ filt_genfswrite(struct knote *kn, long h switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); - mutex_spin_enter(&kn->kn_kq->kq_lock); - kn->kn_flags |= (EV_EOF | EV_ONESHOT); - mutex_spin_exit(&kn->kn_kq->kq_lock); + knote_set_eof(kn, EV_ONESHOT); return (1); case 0: mutex_enter(vp->v_interlock); @@ -580,9 +575,7 @@ filt_genfsvnode(struct knote *kn, long h switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); - mutex_spin_enter(&kn->kn_kq->kq_lock); - kn->kn_flags |= EV_EOF; - mutex_spin_exit(&kn->kn_kq->kq_lock); + knote_set_eof(kn, 0); if ((kn->kn_sfflags & hint) != 0) kn->kn_fflags |= hint; return (1); Index: src/sys/nfs/nfs_kq.c diff -u src/sys/nfs/nfs_kq.c:1.29 src/sys/nfs/nfs_kq.c:1.30 --- src/sys/nfs/nfs_kq.c:1.29 Sun Oct 10 23:46:22 2021 +++ src/sys/nfs/nfs_kq.c Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_kq.c,v 1.29 2021/10/10 23:46:22 thorpej Exp $ */ +/* $NetBSD: nfs_kq.c,v 1.30 2021/10/11 01:07:36 thorpej Exp $ */ /*- * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_kq.c,v 1.29 2021/10/10 23:46:22 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_kq.c,v 1.30 2021/10/11 01:07:36 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -43,7 +43,6 @@ __KERNEL_RCSID(0, "$NetBSD: nfs_kq.c,v 1 #include <sys/vnode.h> #include <sys/unistd.h> #include <sys/file.h> -#include <sys/eventvar.h> /* XXX for kq->kq_lock */ #include <sys/kthread.h> #include <nfs/rpcv2.h> @@ -232,9 +231,7 @@ filt_nfsread(struct knote *kn, long hint switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); - mutex_spin_enter(&kn->kn_kq->kq_lock); - kn->kn_flags |= (EV_EOF | EV_ONESHOT); - mutex_spin_exit(&kn->kn_kq->kq_lock); + knote_set_eof(kn, EV_ONESHOT); return (1); case 0: mutex_enter(vp->v_interlock); @@ -258,9 +255,7 @@ filt_nfsvnode(struct knote *kn, long hin switch (hint) { case NOTE_REVOKE: KASSERT(mutex_owned(vp->v_interlock)); - mutex_spin_enter(&kn->kn_kq->kq_lock); - kn->kn_flags |= EV_EOF; - mutex_spin_exit(&kn->kn_kq->kq_lock); + knote_set_eof(kn, 0); if ((kn->kn_sfflags & hint) != 0) kn->kn_fflags |= hint; return (1); Index: src/sys/sys/event.h diff -u src/sys/sys/event.h:1.45 src/sys/sys/event.h:1.46 --- src/sys/sys/event.h:1.45 Sun Oct 10 23:30:44 2021 +++ src/sys/sys/event.h Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: event.h,v 1.45 2021/10/10 23:30:44 thorpej Exp $ */ +/* $NetBSD: event.h,v 1.46 2021/10/11 01:07:36 thorpej Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jle...@freebsd.org> @@ -282,6 +282,8 @@ struct timespec; void kqueue_init(void); void knote(struct klist *, long); void knote_fdclose(int); +void knote_set_eof(struct knote *, uint32_t); +void knote_clear_eof(struct knote *); typedef int (*kevent_fetch_changes_t)(void *, const struct kevent *, struct kevent *, size_t, int); Index: src/sys/sys/param.h diff -u src/sys/sys/param.h:1.703 src/sys/sys/param.h:1.704 --- src/sys/sys/param.h:1.703 Thu Sep 30 04:36:25 2021 +++ src/sys/sys/param.h Mon Oct 11 01:07:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.703 2021/09/30 04:36:25 yamaguchi Exp $ */ +/* $NetBSD: param.h,v 1.704 2021/10/11 01:07:36 thorpej Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -67,7 +67,7 @@ * 2.99.9 (299000900) */ -#define __NetBSD_Version__ 999009000 /* NetBSD 9.99.90 */ +#define __NetBSD_Version__ 999009100 /* NetBSD 9.99.91 */ #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)