Module Name: src
Committed By: riastradh
Date: Sat Feb 1 02:23:04 UTC 2020
Modified Files:
src/sys/compat/netbsd32: netbsd32_ioctl.c
src/sys/ddb: db_xxx.c
src/sys/kern: kern_descrip.c kern_event.c kern_sig.c subr_exec_fd.c
sys_aio.c sys_descrip.c sys_select.c uipc_socket2.c uipc_usrreq.c
src/sys/miscfs/fdesc: fdesc_vnops.c
src/sys/miscfs/procfs: procfs_vnops.c
Log Message:
Load struct filedesc::fd_dt with atomic_load_consume.
Exceptions: when fd_refcnt <= 1, or when holding fd_lock.
While here:
- Restore KASSERT(mutex_owned(&fdp->fd_lock)) in fd_unused.
=> This is used only in fd_close and fd_abort, where it holds.
- Move bounds check assertion in fd_putfile to where it matters.
- Store fd_dt with atomic_store_release.
- Move load of fd_dt under lock in knote_fdclose.
- Omit membar_consumer in fdesc_readdir.
=> atomic_load_consume serves the same purpose now.
=> Was needed only on alpha anyway.
To generate a diff of this commit:
cvs rdiff -u -r1.106 -r1.107 src/sys/compat/netbsd32/netbsd32_ioctl.c
cvs rdiff -u -r1.71 -r1.72 src/sys/ddb/db_xxx.c
cvs rdiff -u -r1.243 -r1.244 src/sys/kern/kern_descrip.c
cvs rdiff -u -r1.105 -r1.106 src/sys/kern/kern_event.c
cvs rdiff -u -r1.382 -r1.383 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.8 -r1.9 src/sys/kern/subr_exec_fd.c
cvs rdiff -u -r1.45 -r1.46 src/sys/kern/sys_aio.c
cvs rdiff -u -r1.35 -r1.36 src/sys/kern/sys_descrip.c
cvs rdiff -u -r1.50 -r1.51 src/sys/kern/sys_select.c
cvs rdiff -u -r1.134 -r1.135 src/sys/kern/uipc_socket2.c
cvs rdiff -u -r1.194 -r1.195 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.131 -r1.132 src/sys/miscfs/fdesc/fdesc_vnops.c
cvs rdiff -u -r1.207 -r1.208 src/sys/miscfs/procfs/procfs_vnops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/compat/netbsd32/netbsd32_ioctl.c
diff -u src/sys/compat/netbsd32/netbsd32_ioctl.c:1.106 src/sys/compat/netbsd32/netbsd32_ioctl.c:1.107
--- src/sys/compat/netbsd32/netbsd32_ioctl.c:1.106 Mon Nov 18 04:17:08 2019
+++ src/sys/compat/netbsd32/netbsd32_ioctl.c Sat Feb 1 02:23:03 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_ioctl.c,v 1.106 2019/11/18 04:17:08 rin Exp $ */
+/* $NetBSD: netbsd32_ioctl.c,v 1.107 2020/02/01 02:23:03 riastradh Exp $ */
/*
* Copyright (c) 1998, 2001 Matthew R. Green
@@ -31,13 +31,14 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.106 2019/11/18 04:17:08 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.107 2020/02/01 02:23:03 riastradh Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ntp.h"
#endif
#include <sys/param.h>
+#include <sys/atomic.h>
#include <sys/systm.h>
#include <sys/filedesc.h>
#include <sys/ioctl.h>
@@ -1132,7 +1133,7 @@ netbsd32_ioctl(struct lwp *l,
goto out;
}
- ff = fdp->fd_dt->dt_ff[SCARG(uap, fd)];
+ ff = atomic_load_consume(&fdp->fd_dt)->dt_ff[SCARG(uap, fd)];
switch (com = SCARG(uap, com)) {
case FIOCLEX:
ff->ff_exclose = true;
Index: src/sys/ddb/db_xxx.c
diff -u src/sys/ddb/db_xxx.c:1.71 src/sys/ddb/db_xxx.c:1.72
--- src/sys/ddb/db_xxx.c:1.71 Fri Feb 27 00:47:30 2015
+++ src/sys/ddb/db_xxx.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: db_xxx.c,v 1.71 2015/02/27 00:47:30 ozaki-r Exp $ */
+/* $NetBSD: db_xxx.c,v 1.72 2020/02/01 02:23:04 riastradh Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1991, 1993
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_xxx.c,v 1.71 2015/02/27 00:47:30 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_xxx.c,v 1.72 2020/02/01 02:23:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_kgdb.h"
@@ -50,6 +50,7 @@ __KERNEL_RCSID(0, "$NetBSD: db_xxx.c,v 1
#endif
#include <sys/param.h>
+#include <sys/atomic.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/proc.h>
@@ -173,7 +174,7 @@ db_show_files_cmd(db_expr_t addr, bool h
p = (struct proc *) (uintptr_t) addr;
fdp = p->p_fd;
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
for (i = 0; i < dt->dt_nfiles; i++) {
if ((ff = dt->dt_ff[i]) == NULL)
continue;
Index: src/sys/kern/kern_descrip.c
diff -u src/sys/kern/kern_descrip.c:1.243 src/sys/kern/kern_descrip.c:1.244
--- src/sys/kern/kern_descrip.c:1.243 Wed Feb 20 19:42:14 2019
+++ src/sys/kern/kern_descrip.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_descrip.c,v 1.243 2019/02/20 19:42:14 christos Exp $ */
+/* $NetBSD: kern_descrip.c,v 1.244 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.243 2019/02/20 19:42:14 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.244 2020/02/01 02:23:04 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -186,7 +186,7 @@ fd_isused(filedesc_t *fdp, unsigned fd)
{
u_int off = fd >> NDENTRYSHIFT;
- KASSERT(fd < fdp->fd_dt->dt_nfiles);
+ KASSERT(fd < atomic_load_consume(&fdp->fd_dt)->dt_nfiles);
return (fdp->fd_lomap[off] & (1U << (fd & NDENTRYMASK))) != 0;
}
@@ -201,6 +201,8 @@ fd_checkmaps(filedesc_t *fdp)
fdtab_t *dt;
u_int fd;
+ KASSERT(fdp->fd_refcnt <= 1 || mutex_owned(&fdp->fd_lock));
+
dt = fdp->fd_dt;
if (fdp->fd_refcnt == -1) {
/*
@@ -324,13 +326,7 @@ fd_unused(filedesc_t *fdp, unsigned fd)
ff = fdp->fd_dt->dt_ff[fd];
- /*
- * Don't assert the lock is held here, as we may be copying
- * the table during exec() and it is not needed there.
- * procfs and sysctl are locked out by proc::p_reflock.
- *
- * KASSERT(mutex_owned(&fdp->fd_lock));
- */
+ KASSERT(mutex_owned(&fdp->fd_lock));
KASSERT(ff != NULL);
KASSERT(ff->ff_file == NULL);
KASSERT(ff->ff_allocated);
@@ -373,7 +369,7 @@ fd_getfile(unsigned fd)
* We are doing this unlocked. See fd_tryexpand().
*/
fdp = curlwp->l_fd;
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
if (__predict_false(fd >= dt->dt_nfiles)) {
return NULL;
}
@@ -426,9 +422,9 @@ fd_putfile(unsigned fd)
u_int u, v;
fdp = curlwp->l_fd;
- ff = fdp->fd_dt->dt_ff[fd];
+ KASSERT(fd < atomic_load_consume(&fdp->fd_dt)->dt_nfiles);
+ ff = atomic_load_consume(&fdp->fd_dt)->dt_ff[fd];
- KASSERT(fd < fdp->fd_dt->dt_nfiles);
KASSERT(ff != NULL);
KASSERT((ff->ff_refcnt & FR_MASK) > 0);
KASSERT(fd >= NDFDFILE || ff == (fdfile_t *)fdp->fd_dfdfile[fd]);
@@ -593,7 +589,7 @@ fd_close(unsigned fd)
l = curlwp;
p = l->l_proc;
fdp = l->l_fd;
- ff = fdp->fd_dt->dt_ff[fd];
+ ff = atomic_load_consume(&fdp->fd_dt)->dt_ff[fd];
KASSERT(fd >= NDFDFILE || ff == (fdfile_t *)fdp->fd_dfdfile[fd]);
@@ -726,6 +722,7 @@ int
fd_dup(file_t *fp, int minfd, int *newp, bool exclose)
{
proc_t *p = curproc;
+ fdtab_t *dt;
int error;
while ((error = fd_alloc(p, minfd, newp)) != 0) {
@@ -735,7 +732,8 @@ fd_dup(file_t *fp, int minfd, int *newp,
fd_tryexpand(p);
}
- curlwp->l_fd->fd_dt->dt_ff[*newp]->ff_exclose = exclose;
+ dt = atomic_load_consume(&curlwp->l_fd->fd_dt);
+ dt->dt_ff[*newp]->ff_exclose = exclose;
fd_affix(p, fp, *newp);
return 0;
}
@@ -756,7 +754,7 @@ fd_dup2(file_t *fp, unsigned newfd, int
* Ensure there are enough slots in the descriptor table,
* and allocate an fdfile_t up front in case we need it.
*/
- while (newfd >= fdp->fd_dt->dt_nfiles) {
+ while (newfd >= atomic_load_consume(&fdp->fd_dt)->dt_nfiles) {
fd_tryexpand(curproc);
}
ff = pool_cache_get(fdfile_cache, PR_WAITOK);
@@ -1003,7 +1001,7 @@ fd_tryexpand(proc_t *p)
fdp = p->p_fd;
newhimap = NULL;
newlomap = NULL;
- oldnfiles = fdp->fd_dt->dt_nfiles;
+ oldnfiles = atomic_load_consume(&fdp->fd_dt)->dt_nfiles;
if (oldnfiles < NDEXTENT)
numfiles = NDEXTENT;
@@ -1070,8 +1068,7 @@ fd_tryexpand(proc_t *p)
* All other modifications must become globally visible before
* the change to fd_dt. See fd_getfile().
*/
- membar_producer();
- fdp->fd_dt = newdt;
+ atomic_store_release(&fdp->fd_dt, newdt);
KASSERT(newdt->dt_ff[0] == (fdfile_t *)fdp->fd_dfdfile[0]);
fd_checkmaps(fdp);
mutex_exit(&fdp->fd_lock);
@@ -1138,6 +1135,7 @@ fd_affix(proc_t *p, file_t *fp, unsigned
{
fdfile_t *ff;
filedesc_t *fdp;
+ fdtab_t *dt;
KASSERT(p == curproc || p == &proc0);
@@ -1155,7 +1153,8 @@ fd_affix(proc_t *p, file_t *fp, unsigned
* current process.
*/
fdp = p->p_fd;
- ff = fdp->fd_dt->dt_ff[fd];
+ dt = atomic_load_consume(&fdp->fd_dt);
+ ff = dt->dt_ff[fd];
KASSERT(ff != NULL);
KASSERT(ff->ff_file == NULL);
@@ -1179,7 +1178,7 @@ fd_abort(proc_t *p, file_t *fp, unsigned
KASSERT(p == curproc || p == &proc0);
fdp = p->p_fd;
- ff = fdp->fd_dt->dt_ff[fd];
+ ff = atomic_load_consume(&fdp->fd_dt)->dt_ff[fd];
ff->ff_exclose = false;
KASSERT(fd >= NDFDFILE || ff == (fdfile_t *)fdp->fd_dfdfile[fd]);
@@ -1525,7 +1524,8 @@ fd_free(void)
filedesc_t * const fdp = l->l_fd;
const bool noadvlock = (l->l_proc->p_flag & PK_ADVLOCK) == 0;
- KASSERT(fdp->fd_dt->dt_ff[0] == (fdfile_t *)fdp->fd_dfdfile[0]);
+ KASSERT(atomic_load_consume(&fdp->fd_dt)->dt_ff[0] ==
+ (fdfile_t *)fdp->fd_dfdfile[0]);
KASSERT(fdp->fd_dtbuiltin.dt_nfiles == NDFILE);
KASSERT(fdp->fd_dtbuiltin.dt_link == NULL);
@@ -1657,7 +1657,7 @@ fd_dupopen(int old, int *newp, int mode,
return EBADF;
}
fdp = curlwp->l_fd;
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
ff = dt->dt_ff[old];
/*
@@ -1730,7 +1730,7 @@ fd_closeexec(void)
return;
}
fdp->fd_exclose = false;
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
for (fd = 0; fd <= fdp->fd_lastfile; fd++) {
if ((ff = dt->dt_ff[fd]) == NULL) {
@@ -1793,7 +1793,7 @@ void
fd_set_exclose(struct lwp *l, int fd, bool exclose)
{
filedesc_t *fdp = l->l_fd;
- fdfile_t *ff = fdp->fd_dt->dt_ff[fd];
+ fdfile_t *ff = atomic_load_consume(&fdp->fd_dt)->dt_ff[fd];
ff->ff_exclose = exclose;
if (exclose)
@@ -1868,7 +1868,7 @@ fd_clone(file_t *fp, unsigned fd, int fl
fp->f_flag = flag & FMASK;
fdp = curproc->p_fd;
- ff = fdp->fd_dt->dt_ff[fd];
+ ff = atomic_load_consume(&fdp->fd_dt)->dt_ff[fd];
KASSERT(ff != NULL);
ff->ff_exclose = (flag & O_CLOEXEC) != 0;
fp->f_type = DTYPE_MISC;
Index: src/sys/kern/kern_event.c
diff -u src/sys/kern/kern_event.c:1.105 src/sys/kern/kern_event.c:1.106
--- src/sys/kern/kern_event.c:1.105 Fri Oct 18 19:43:49 2019
+++ src/sys/kern/kern_event.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_event.c,v 1.105 2019/10/18 19:43:49 christos Exp $ */
+/* $NetBSD: kern_event.c,v 1.106 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.105 2019/10/18 19:43:49 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_event.c,v 1.106 2020/02/01 02:23:04 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1671,8 +1671,8 @@ knote_fdclose(int fd)
filedesc_t *fdp;
fdp = curlwp->l_fd;
- list = (struct klist *)&fdp->fd_dt->dt_ff[fd]->ff_knlist;
mutex_enter(&fdp->fd_lock);
+ list = (struct klist *)&fdp->fd_dt->dt_ff[fd]->ff_knlist;
while ((kn = SLIST_FIRST(list)) != NULL) {
knote_detach(kn, fdp, true);
mutex_enter(&fdp->fd_lock);
Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.382 src/sys/kern/kern_sig.c:1.383
--- src/sys/kern/kern_sig.c:1.382 Thu Jan 23 10:21:14 2020
+++ src/sys/kern/kern_sig.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_sig.c,v 1.382 2020/01/23 10:21:14 ad Exp $ */
+/* $NetBSD: kern_sig.c,v 1.383 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008, 2019 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.382 2020/01/23 10:21:14 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.383 2020/02/01 02:23:04 riastradh Exp $");
#include "opt_ptrace.h"
#include "opt_dtrace.h"
@@ -1068,7 +1068,7 @@ kpsignal(struct proc *p, ksiginfo_t *ksi
/* XXXSMP locking */
ksi->ksi_fd = -1;
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
for (fd = 0; fd < dt->dt_nfiles; fd++) {
if ((ff = dt->dt_ff[fd]) == NULL)
continue;
Index: src/sys/kern/subr_exec_fd.c
diff -u src/sys/kern/subr_exec_fd.c:1.8 src/sys/kern/subr_exec_fd.c:1.9
--- src/sys/kern/subr_exec_fd.c:1.8 Mon Apr 8 13:05:23 2019
+++ src/sys/kern/subr_exec_fd.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_exec_fd.c,v 1.8 2019/04/08 13:05:23 maya Exp $ */
+/* $NetBSD: subr_exec_fd.c,v 1.9 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -27,9 +27,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_exec_fd.c,v 1.8 2019/04/08 13:05:23 maya Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_exec_fd.c,v 1.9 2020/02/01 02:23:04 riastradh Exp $");
#include <sys/param.h>
+#include <sys/atomic.h>
#include <sys/file.h>
#include <sys/filedesc.h>
#include <sys/mutex.h>
@@ -51,7 +52,7 @@ fd_ktrexecfd(void)
l = curlwp;
p = l->l_proc;
fdp = p->p_fd;
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
for (fd = 0; fd <= fdp->fd_lastfile; fd++) {
if ((ff = dt->dt_ff[fd]) == NULL) {
@@ -91,7 +92,7 @@ fd_checkstd(void)
closed[0] = '\0';
if ((fdp = p->p_fd) == NULL)
return (0);
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
for (i = 0; i < CHECK_UPTO; i++) {
KASSERT(i >= NDFDFILE ||
dt->dt_ff[i] == (fdfile_t *)fdp->fd_dfdfile[i]);
Index: src/sys/kern/sys_aio.c
diff -u src/sys/kern/sys_aio.c:1.45 src/sys/kern/sys_aio.c:1.46
--- src/sys/kern/sys_aio.c:1.45 Sat Nov 23 19:42:52 2019
+++ src/sys/kern/sys_aio.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_aio.c,v 1.45 2019/11/23 19:42:52 ad Exp $ */
+/* $NetBSD: sys_aio.c,v 1.46 2020/02/01 02:23:04 riastradh Exp $ */
/*
* Copyright (c) 2007 Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_aio.c,v 1.45 2019/11/23 19:42:52 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_aio.c,v 1.46 2020/02/01 02:23:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -630,7 +630,7 @@ sys_aio_cancel(struct lwp *l, const stru
/* Check for invalid file descriptor */
fildes = (unsigned int)SCARG(uap, fildes);
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
if (fildes >= dt->dt_nfiles)
return EBADF;
if (dt->dt_ff[fildes] == NULL || dt->dt_ff[fildes]->ff_file == NULL)
Index: src/sys/kern/sys_descrip.c
diff -u src/sys/kern/sys_descrip.c:1.35 src/sys/kern/sys_descrip.c:1.36
--- src/sys/kern/sys_descrip.c:1.35 Sun Sep 15 16:25:57 2019
+++ src/sys/kern/sys_descrip.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_descrip.c,v 1.35 2019/09/15 16:25:57 christos Exp $ */
+/* $NetBSD: sys_descrip.c,v 1.36 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.35 2019/09/15 16:25:57 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_descrip.c,v 1.36 2020/02/01 02:23:04 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -345,6 +345,7 @@ sys_fcntl(struct lwp *l, const struct sy
} */
int fd, i, tmp, error, cmd, newmin;
filedesc_t *fdp;
+ fdtab_t *dt;
file_t *fp;
struct flock fl;
bool cloexec = false;
@@ -413,7 +414,8 @@ sys_fcntl(struct lwp *l, const struct sy
break;
case F_GETFD:
- *retval = fdp->fd_dt->dt_ff[fd]->ff_exclose;
+ dt = atomic_load_consume(&fdp->fd_dt);
+ *retval = dt->dt_ff[fd]->ff_exclose;
break;
case F_SETFD:
Index: src/sys/kern/sys_select.c
diff -u src/sys/kern/sys_select.c:1.50 src/sys/kern/sys_select.c:1.51
--- src/sys/kern/sys_select.c:1.50 Fri Nov 22 20:04:03 2019
+++ src/sys/kern/sys_select.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: sys_select.c,v 1.50 2019/11/22 20:04:03 ad Exp $ */
+/* $NetBSD: sys_select.c,v 1.51 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2007, 2008, 2009, 2010, 2019 The NetBSD Foundation, Inc.
@@ -84,7 +84,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_select.c,v 1.50 2019/11/22 20:04:03 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_select.c,v 1.51 2020/02/01 02:23:04 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -354,7 +354,7 @@ selcommon(register_t *retval, int nd, fd
if (nd < 0)
return (EINVAL);
- nf = curlwp->l_fd->fd_dt->dt_nfiles;
+ nf = atomic_load_consume(&curlwp->l_fd->fd_dt)->dt_nfiles;
if (nd > nf) {
/* forgiving; slightly wrong */
nd = nf;
Index: src/sys/kern/uipc_socket2.c
diff -u src/sys/kern/uipc_socket2.c:1.134 src/sys/kern/uipc_socket2.c:1.135
--- src/sys/kern/uipc_socket2.c:1.134 Thu Jul 11 17:30:44 2019
+++ src/sys/kern/uipc_socket2.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_socket2.c,v 1.134 2019/07/11 17:30:44 maxv Exp $ */
+/* $NetBSD: uipc_socket2.c,v 1.135 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.134 2019/07/11 17:30:44 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.135 2020/02/01 02:23:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_ddb.h"
@@ -1604,7 +1604,7 @@ sofindproc(struct socket *so, int all, v
pr("could not acquire fd_lock mutex\n");
continue;
}
- dt = fdp->fd_dt;
+ dt = atomic_load_consume(&fdp->fd_dt);
for (i = 0; i < dt->dt_nfiles; i++) {
ff = dt->dt_ff[i];
if (ff == NULL)
Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.194 src/sys/kern/uipc_usrreq.c:1.195
--- src/sys/kern/uipc_usrreq.c:1.194 Mon Jul 29 09:42:17 2019
+++ src/sys/kern/uipc_usrreq.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_usrreq.c,v 1.194 2019/07/29 09:42:17 maxv Exp $ */
+/* $NetBSD: uipc_usrreq.c,v 1.195 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.194 2019/07/29 09:42:17 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.195 2020/02/01 02:23:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -1523,6 +1523,7 @@ static int
unp_internalize(struct mbuf **controlp)
{
filedesc_t *fdescp = curlwp->l_fd;
+ fdtab_t *dt;
struct mbuf *control = *controlp;
struct cmsghdr *newcm, *cm = mtod(control, struct cmsghdr *);
file_t **rp, **files;
@@ -1585,7 +1586,8 @@ unp_internalize(struct mbuf **controlp)
fdp = (int *)CMSG_DATA(cm) + nfds;
rp = files + nfds;
for (i = 0; i < nfds; i++) {
- fp = fdescp->fd_dt->dt_ff[*--fdp]->ff_file;
+ dt = atomic_load_consume(&fdescp->fd_dt);
+ fp = dt->dt_ff[*--fdp]->ff_file;
KASSERT(fp != NULL);
mutex_enter(&fp->f_lock);
*--rp = fp;
Index: src/sys/miscfs/fdesc/fdesc_vnops.c
diff -u src/sys/miscfs/fdesc/fdesc_vnops.c:1.131 src/sys/miscfs/fdesc/fdesc_vnops.c:1.132
--- src/sys/miscfs/fdesc/fdesc_vnops.c:1.131 Thu Jan 2 15:42:27 2020
+++ src/sys/miscfs/fdesc/fdesc_vnops.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fdesc_vnops.c,v 1.131 2020/01/02 15:42:27 thorpej Exp $ */
+/* $NetBSD: fdesc_vnops.c,v 1.132 2020/02/01 02:23:04 riastradh Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdesc_vnops.c,v 1.131 2020/01/02 15:42:27 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdesc_vnops.c,v 1.132 2020/02/01 02:23:04 riastradh Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -206,7 +206,7 @@ fdesc_lookup(void *v)
int error, ix = -1;
fdtab_t *dt;
- dt = curlwp->l_fd->fd_dt;
+ dt = atomic_load_consume(&curlwp->l_fd->fd_dt);
if (cnp->cn_namelen == 1 && *pname == '.') {
*vpp = dvp;
@@ -567,7 +567,7 @@ fdesc_readdir(void *v)
break;
}
- dt = curlwp->l_fd->fd_dt;
+ dt = atomic_load_consume(&curlwp->l_fd->fd_dt);
if (uio->uio_resid < UIO_MX)
return EINVAL;
@@ -629,7 +629,6 @@ fdesc_readdir(void *v)
*cookies++ = i + 1;
}
} else {
- membar_consumer();
if (ap->a_ncookies) {
ncookies = uimin(ncookies, dt->dt_nfiles + 2);
cookies = malloc(ncookies * sizeof(off_t),
Index: src/sys/miscfs/procfs/procfs_vnops.c
diff -u src/sys/miscfs/procfs/procfs_vnops.c:1.207 src/sys/miscfs/procfs/procfs_vnops.c:1.208
--- src/sys/miscfs/procfs/procfs_vnops.c:1.207 Thu Aug 29 06:43:13 2019
+++ src/sys/miscfs/procfs/procfs_vnops.c Sat Feb 1 02:23:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_vnops.c,v 1.207 2019/08/29 06:43:13 hannken Exp $ */
+/* $NetBSD: procfs_vnops.c,v 1.208 2020/02/01 02:23:04 riastradh Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -105,9 +105,10 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.207 2019/08/29 06:43:13 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.208 2020/02/01 02:23:04 riastradh Exp $");
#include <sys/param.h>
+#include <sys/atomic.h>
#include <sys/systm.h>
#include <sys/time.h>
#include <sys/kernel.h>
@@ -1387,7 +1388,7 @@ procfs_readdir(void *v)
return ESRCH;
}
- nfd = p->p_fd->fd_dt->dt_nfiles;
+ nfd = atomic_load_consume(&p->p_fd->fd_dt)->dt_nfiles;
lim = uimin((int)p->p_rlimit[RLIMIT_NOFILE].rlim_cur, maxfiles);
if (i >= lim) {