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__)

Reply via email to