diff options
| author | riastradh <riastradh@NetBSD.org> | 2020-02-01 02:23:03 +0000 |
|---|---|---|
| committer | riastradh <riastradh@NetBSD.org> | 2020-02-01 02:23:03 +0000 |
| commit | fcee5fe3ac44ab4e0eb6bc72b68b761c44cd1c1a (patch) | |
| tree | f3eb971f7ca56e68d49a763b1d4374195b9b26b4 | |
| parent | 1f6c4f3fb46a5e746b9ad2ad8c2dfc8a3216bdd9 (diff) | |
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.
| -rw-r--r-- | sys/compat/netbsd32/netbsd32_ioctl.c | 7 | ||||
| -rw-r--r-- | sys/ddb/db_xxx.c | 7 | ||||
| -rw-r--r-- | sys/kern/kern_descrip.c | 52 | ||||
| -rw-r--r-- | sys/kern/kern_event.c | 6 | ||||
| -rw-r--r-- | sys/kern/kern_sig.c | 6 | ||||
| -rw-r--r-- | sys/kern/subr_exec_fd.c | 9 | ||||
| -rw-r--r-- | sys/kern/sys_aio.c | 6 | ||||
| -rw-r--r-- | sys/kern/sys_descrip.c | 8 | ||||
| -rw-r--r-- | sys/kern/sys_select.c | 6 | ||||
| -rw-r--r-- | sys/kern/uipc_socket2.c | 6 | ||||
| -rw-r--r-- | sys/kern/uipc_usrreq.c | 8 | ||||
| -rw-r--r-- | sys/miscfs/fdesc/fdesc_vnops.c | 9 | ||||
| -rw-r--r-- | sys/miscfs/procfs/procfs_vnops.c | 7 |
13 files changed, 72 insertions, 65 deletions
diff --git a/sys/compat/netbsd32/netbsd32_ioctl.c b/sys/compat/netbsd32/netbsd32_ioctl.c index 412b69772dc..2667a525b1b 100644 --- a/sys/compat/netbsd32/netbsd32_ioctl.c +++ b/sys/compat/netbsd32/netbsd32_ioctl.c @@ -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; diff --git a/sys/ddb/db_xxx.c b/sys/ddb/db_xxx.c index cac0c8362e0..4d92f310528 100644 --- a/sys/ddb/db_xxx.c +++ b/sys/ddb/db_xxx.c @@ -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.71 2015/02/27 00:47:30 ozaki-r Exp $"); #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 haddr, 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; diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 6955b740e3d..68521faa439 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -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, bool exclose) 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 flags) * 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 fd) { 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 fd) * 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 fd) 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, int error) 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 flag, const struct fileops *fops, 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; diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index e36f437cc30..6d62458cdaa 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -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); diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 99844995836..efc34205a9e 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -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, void *data) /* 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; diff --git a/sys/kern/subr_exec_fd.c b/sys/kern/subr_exec_fd.c index bc96b42a963..024fc0a6061 100644 --- a/sys/kern/subr_exec_fd.c +++ b/sys/kern/subr_exec_fd.c @@ -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]); diff --git a/sys/kern/sys_aio.c b/sys/kern/sys_aio.c index 4a49d87ff01..a56ea5519b8 100644 --- a/sys/kern/sys_aio.c +++ b/sys/kern/sys_aio.c @@ -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 struct sys_aio_cancel_args *uap, /* 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) diff --git a/sys/kern/sys_descrip.c b/sys/kern/sys_descrip.c index 24b9b2e1fd8..09c18844077 100644 --- a/sys/kern/sys_descrip.c +++ b/sys/kern/sys_descrip.c @@ -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 sys_fcntl_args *uap, register_t *retval) } */ 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 sys_fcntl_args *uap, register_t *retval) 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: diff --git a/sys/kern/sys_select.c b/sys/kern/sys_select.c index 7303defd037..538fcdc598c 100644 --- a/sys/kern/sys_select.c +++ b/sys/kern/sys_select.c @@ -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_set *u_in, fd_set *u_ou, 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; diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 9cb53b02d48..e7a58aeb864 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -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, void (*pr)(const char *, ...)) 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) diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 40d20664a44..3a4c5244bdd 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -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; diff --git a/sys/miscfs/fdesc/fdesc_vnops.c b/sys/miscfs/fdesc/fdesc_vnops.c index dd4780057cd..fd590029e96 100644 --- a/sys/miscfs/fdesc/fdesc_vnops.c +++ b/sys/miscfs/fdesc/fdesc_vnops.c @@ -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), diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c index 31632ed078c..61c46ba4e5a 100644 --- a/sys/miscfs/procfs/procfs_vnops.c +++ b/sys/miscfs/procfs/procfs_vnops.c @@ -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) { |
