Module Name: src Committed By: riastradh Date: Sat Feb 1 02:23:23 UTC 2020
Modified Files: src/sys/ddb: db_xxx.c src/sys/kern: kern_descrip.c kern_sig.c subr_exec_fd.c uipc_socket2.c uipc_usrreq.c Log Message: Load struct fdfile::ff_file with atomic_load_consume. Exceptions: when we're only testing whether it's there, not about to dereference it. Note: We do not use atomic_store_release to set it because the preceding mutex_exit should be enough. (That said, it's not clear the mutex_enter/exit is needed unless refcnt > 0 already, in which case maybe it would be a win to switch from the membar implied by mutex_enter to the membar implied by atomic_store_release -- which I would generally expect to be much cheaper. And a little clearer without a long comment.) To generate a diff of this commit: cvs rdiff -u -r1.72 -r1.73 src/sys/ddb/db_xxx.c cvs rdiff -u -r1.244 -r1.245 src/sys/kern/kern_descrip.c cvs rdiff -u -r1.383 -r1.384 src/sys/kern/kern_sig.c cvs rdiff -u -r1.9 -r1.10 src/sys/kern/subr_exec_fd.c cvs rdiff -u -r1.135 -r1.136 src/sys/kern/uipc_socket2.c cvs rdiff -u -r1.195 -r1.196 src/sys/kern/uipc_usrreq.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/ddb/db_xxx.c diff -u src/sys/ddb/db_xxx.c:1.72 src/sys/ddb/db_xxx.c:1.73 --- src/sys/ddb/db_xxx.c:1.72 Sat Feb 1 02:23:04 2020 +++ src/sys/ddb/db_xxx.c Sat Feb 1 02:23:23 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: db_xxx.c,v 1.72 2020/02/01 02:23:04 riastradh Exp $ */ +/* $NetBSD: db_xxx.c,v 1.73 2020/02/01 02:23:23 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.72 2020/02/01 02:23:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_xxx.c,v 1.73 2020/02/01 02:23:23 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_kgdb.h" @@ -179,7 +179,7 @@ db_show_files_cmd(db_expr_t addr, bool h if ((ff = dt->dt_ff[i]) == NULL) continue; - fp = ff->ff_file; + fp = atomic_load_consume(&ff->ff_file); /* Only look at vnodes... */ if (fp != NULL && fp->f_type == DTYPE_VNODE Index: src/sys/kern/kern_descrip.c diff -u src/sys/kern/kern_descrip.c:1.244 src/sys/kern/kern_descrip.c:1.245 --- src/sys/kern/kern_descrip.c:1.244 Sat Feb 1 02:23:04 2020 +++ src/sys/kern/kern_descrip.c Sat Feb 1 02:23:23 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_descrip.c,v 1.244 2020/02/01 02:23:04 riastradh Exp $ */ +/* $NetBSD: kern_descrip.c,v 1.245 2020/02/01 02:23:23 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.244 2020/02/01 02:23:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.245 2020/02/01 02:23:23 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -403,7 +403,7 @@ fd_getfile(unsigned fd) * If the file is not open or is being closed then put the * reference back. */ - fp = ff->ff_file; + fp = atomic_load_consume(&ff->ff_file); if (__predict_true(fp != NULL)) { return fp; } @@ -557,7 +557,7 @@ fd_getfile2(proc_t *p, unsigned fd) mutex_exit(&fdp->fd_lock); return NULL; } - if ((fp = ff->ff_file) == NULL) { + if ((fp = atomic_load_consume(&ff->ff_file)) == NULL) { mutex_exit(&fdp->fd_lock); return NULL; } @@ -595,7 +595,8 @@ fd_close(unsigned fd) mutex_enter(&fdp->fd_lock); KASSERT((ff->ff_refcnt & FR_MASK) > 0); - if (__predict_false(ff->ff_file == NULL)) { + fp = atomic_load_consume(&ff->ff_file); + if (__predict_false(fp == NULL)) { /* * Another user of the file is already closing, and is * waiting for other users of the file to drain. Release @@ -620,7 +621,6 @@ fd_close(unsigned fd) * will prevent them from adding additional uses to this file * while we are closing it. */ - fp = ff->ff_file; ff->ff_file = NULL; ff->ff_exclose = false; @@ -1150,7 +1150,8 @@ fd_affix(proc_t *p, file_t *fp, unsigned * The memory barriers provided by lock activity in this routine * ensure that any updates to the file structure become globally * visible before the file becomes visible to other LWPs in the - * current process. + * current process; otherwise we would set ff->ff_file with + * atomic_store_release(&ff->ff_file, fp) at the bottom. */ fdp = p->p_fd; dt = atomic_load_consume(&fdp->fd_dt); @@ -1462,7 +1463,8 @@ fd_copy(void) KASSERT(i >= NDFDFILE || *nffp == (fdfile_t *)newfdp->fd_dfdfile[i]); ff = *ffp; - if (ff == NULL || (fp = ff->ff_file) == NULL) { + if (ff == NULL || + (fp = atomic_load_consume(&ff->ff_file)) == NULL) { /* Descriptor unused, or descriptor half open. */ KASSERT(!fd_isused(newfdp, i)); continue; @@ -1549,7 +1551,7 @@ fd_free(void) ff == (fdfile_t *)fdp->fd_dfdfile[fd]); if (ff == NULL) continue; - if ((fp = ff->ff_file) != NULL) { + if ((fp = atomic_load_consume(&ff->ff_file)) != NULL) { /* * Must use fd_close() here if there is * a reference from kqueue or we might have posix @@ -1977,7 +1979,7 @@ sysctl_file_marker_reset(void) if ((ff = dt->dt_ff[i]) == NULL) { continue; } - if ((fp = ff->ff_file) == NULL) { + if ((fp = atomic_load_consume(&ff->ff_file)) == NULL) { continue; } fp->f_marker = 0; @@ -2079,7 +2081,7 @@ sysctl_kern_file(SYSCTLFN_ARGS) if ((ff = dt->dt_ff[i]) == NULL) { continue; } - if ((fp = ff->ff_file) == NULL) { + if ((fp = atomic_load_consume(&ff->ff_file)) == NULL) { continue; } @@ -2234,7 +2236,8 @@ sysctl_kern_file2(SYSCTLFN_ARGS) if ((ff = dt->dt_ff[i]) == NULL) { continue; } - if ((fp = ff->ff_file) == NULL) { + if ((fp = atomic_load_consume(&ff->ff_file)) == + NULL) { continue; } Index: src/sys/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.383 src/sys/kern/kern_sig.c:1.384 --- src/sys/kern/kern_sig.c:1.383 Sat Feb 1 02:23:04 2020 +++ src/sys/kern/kern_sig.c Sat Feb 1 02:23:23 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.383 2020/02/01 02:23:04 riastradh Exp $ */ +/* $NetBSD: kern_sig.c,v 1.384 2020/02/01 02:23:23 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.383 2020/02/01 02:23:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.384 2020/02/01 02:23:23 riastradh Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -1072,7 +1072,7 @@ kpsignal(struct proc *p, ksiginfo_t *ksi for (fd = 0; fd < dt->dt_nfiles; fd++) { if ((ff = dt->dt_ff[fd]) == NULL) continue; - if ((fp = ff->ff_file) == NULL) + if ((fp = atomic_load_consume(&ff->ff_file)) == NULL) continue; if (fp->f_data == data) { ksi->ksi_fd = fd; Index: src/sys/kern/subr_exec_fd.c diff -u src/sys/kern/subr_exec_fd.c:1.9 src/sys/kern/subr_exec_fd.c:1.10 --- src/sys/kern/subr_exec_fd.c:1.9 Sat Feb 1 02:23:04 2020 +++ src/sys/kern/subr_exec_fd.c Sat Feb 1 02:23:23 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_exec_fd.c,v 1.9 2020/02/01 02:23:04 riastradh Exp $ */ +/* $NetBSD: subr_exec_fd.c,v 1.10 2020/02/01 02:23:23 riastradh Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_exec_fd.c,v 1.9 2020/02/01 02:23:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_exec_fd.c,v 1.10 2020/02/01 02:23:23 riastradh Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -47,6 +47,7 @@ fd_ktrexecfd(void) fdfile_t *ff; lwp_t *l; fdtab_t *dt; + file_t *fp; int fd; l = curlwp; @@ -61,9 +62,9 @@ fd_ktrexecfd(void) } KASSERT(fd >= NDFDFILE || ff == (fdfile_t *)fdp->fd_dfdfile[fd]); - if (ff->ff_file == NULL) + if ((fp = atomic_load_consume(&ff->ff_file)) == NULL) continue; - ktr_execfd(fd, ff->ff_file->f_type); + ktr_execfd(fd, fp->f_type); } } Index: src/sys/kern/uipc_socket2.c diff -u src/sys/kern/uipc_socket2.c:1.135 src/sys/kern/uipc_socket2.c:1.136 --- src/sys/kern/uipc_socket2.c:1.135 Sat Feb 1 02:23:04 2020 +++ src/sys/kern/uipc_socket2.c Sat Feb 1 02:23:23 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket2.c,v 1.135 2020/02/01 02:23:04 riastradh Exp $ */ +/* $NetBSD: uipc_socket2.c,v 1.136 2020/02/01 02:23:23 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.135 2020/02/01 02:23:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.136 2020/02/01 02:23:23 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -1610,7 +1610,7 @@ sofindproc(struct socket *so, int all, v if (ff == NULL) continue; - fp = ff->ff_file; + fp = atomic_load_consume(&ff->ff_file); if (fp == NULL) continue; Index: src/sys/kern/uipc_usrreq.c diff -u src/sys/kern/uipc_usrreq.c:1.195 src/sys/kern/uipc_usrreq.c:1.196 --- src/sys/kern/uipc_usrreq.c:1.195 Sat Feb 1 02:23:04 2020 +++ src/sys/kern/uipc_usrreq.c Sat Feb 1 02:23:23 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_usrreq.c,v 1.195 2020/02/01 02:23:04 riastradh Exp $ */ +/* $NetBSD: uipc_usrreq.c,v 1.196 2020/02/01 02:23:23 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.195 2020/02/01 02:23:04 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.196 2020/02/01 02:23:23 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -1587,7 +1587,7 @@ unp_internalize(struct mbuf **controlp) rp = files + nfds; for (i = 0; i < nfds; i++) { dt = atomic_load_consume(&fdescp->fd_dt); - fp = dt->dt_ff[*--fdp]->ff_file; + fp = atomic_load_consume(&dt->dt_ff[*--fdp]->ff_file); KASSERT(fp != NULL); mutex_enter(&fp->f_lock); *--rp = fp;