Module Name: src Committed By: hannken Date: Fri Mar 1 09:02:03 UTC 2019
Modified Files: src/sys/kern: kern_exit.c kern_lwp.c vfs_trans.c src/sys/sys: fstrans.h lwp.h Log Message: Move pointer to fstrans private data into "struct lwp". Ride NetBSD 8.99.35 To generate a diff of this commit: cvs rdiff -u -r1.273 -r1.274 src/sys/kern/kern_exit.c cvs rdiff -u -r1.195 -r1.196 src/sys/kern/kern_lwp.c cvs rdiff -u -r1.56 -r1.57 src/sys/kern/vfs_trans.c cvs rdiff -u -r1.12 -r1.13 src/sys/sys/fstrans.h cvs rdiff -u -r1.180 -r1.181 src/sys/sys/lwp.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/kern/kern_exit.c diff -u src/sys/kern/kern_exit.c:1.273 src/sys/kern/kern_exit.c:1.274 --- src/sys/kern/kern_exit.c:1.273 Thu Nov 29 12:37:22 2018 +++ src/sys/kern/kern_exit.c Fri Mar 1 09:02:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_exit.c,v 1.273 2018/11/29 12:37:22 maxv Exp $ */ +/* $NetBSD: kern_exit.c,v 1.274 2019/03/01 09:02:03 hannken Exp $ */ /*- * Copyright (c) 1998, 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.273 2018/11/29 12:37:22 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.274 2019/03/01 09:02:03 hannken Exp $"); #include "opt_ktrace.h" #include "opt_dtrace.h" @@ -84,6 +84,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_exit.c, #include <sys/buf.h> #include <sys/wait.h> #include <sys/file.h> +#include <sys/fstrans.h> #include <sys/vnode.h> #include <sys/syslog.h> #include <sys/pool.h> @@ -400,6 +401,9 @@ exit1(struct lwp *l, int exitcode, int s } fixjobc(p, p->p_pgrp, 0); + /* Release fstrans private data. */ + fstrans_lwp_dtor(l); + /* * Finalize the last LWP's specificdata, as well as the * specificdata for the proc itself. Index: src/sys/kern/kern_lwp.c diff -u src/sys/kern/kern_lwp.c:1.195 src/sys/kern/kern_lwp.c:1.196 --- src/sys/kern/kern_lwp.c:1.195 Mon Nov 26 17:18:01 2018 +++ src/sys/kern/kern_lwp.c Fri Mar 1 09:02:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_lwp.c,v 1.195 2018/11/26 17:18:01 skrll Exp $ */ +/* $NetBSD: kern_lwp.c,v 1.196 2019/03/01 09:02:03 hannken Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -211,7 +211,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.195 2018/11/26 17:18:01 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.196 2019/03/01 09:02:03 hannken Exp $"); #include "opt_ddb.h" #include "opt_lockdebug.h" @@ -236,6 +236,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v #include <sys/lwpctl.h> #include <sys/atomic.h> #include <sys/filedesc.h> +#include <sys/fstrans.h> #include <sys/dtrace_bsd.h> #include <sys/sdt.h> #include <sys/xcall.h> @@ -1093,6 +1094,9 @@ lwp_exit(struct lwp *l) /* Drop filedesc reference. */ fd_free(); + /* Release fstrans private data. */ + fstrans_lwp_dtor(l); + /* Delete the specificdata while it's still safe to sleep. */ lwp_finispecific(l); Index: src/sys/kern/vfs_trans.c diff -u src/sys/kern/vfs_trans.c:1.56 src/sys/kern/vfs_trans.c:1.57 --- src/sys/kern/vfs_trans.c:1.56 Sun Feb 24 16:11:24 2019 +++ src/sys/kern/vfs_trans.c Fri Mar 1 09:02:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_trans.c,v 1.56 2019/02/24 16:11:24 hannken Exp $ */ +/* $NetBSD: vfs_trans.c,v 1.57 2019/03/01 09:02:03 hannken Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_trans.c,v 1.56 2019/02/24 16:11:24 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_trans.c,v 1.57 2019/03/01 09:02:03 hannken Exp $"); /* * File system transaction operations. @@ -84,7 +84,6 @@ struct fstrans_mount_info { struct mount *fmi_mount; }; -static specificdata_key_t lwp_data_key; /* Our specific data key. */ static kmutex_t vfs_suspend_lock; /* Serialize suspensions. */ static kmutex_t fstrans_lock; /* Fstrans big lock. */ static kmutex_t fstrans_mount_lock; /* Fstrans mount big lock. */ @@ -95,7 +94,6 @@ static LIST_HEAD(fstrans_lwp_head, fstra /* List of all fstrans_lwp_info. */ static int fstrans_gone_count; /* Number of fstrans_mount_info gone. */ -static void fstrans_lwp_dtor(void *); static void fstrans_mount_dtor(struct fstrans_mount_info *); static void fstrans_clear_lwp_info(void); static inline struct fstrans_lwp_info * @@ -180,10 +178,6 @@ fstrans_debug_validate_mount(struct moun void fstrans_init(void) { - int error __diagused; - - error = lwp_specific_key_create(&lwp_data_key, fstrans_lwp_dtor); - KASSERT(error == 0); mutex_init(&vfs_suspend_lock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&fstrans_lock, MUTEX_DEFAULT, IPL_NONE); @@ -197,14 +191,15 @@ fstrans_init(void) /* * Deallocate lwp state. */ -static void -fstrans_lwp_dtor(void *arg) +void +fstrans_lwp_dtor(lwp_t *l) { struct fstrans_lwp_info *fli, *fli_next; - for (fli = arg; fli; fli = fli_next) { + for (fli = l->l_fstrans; fli; fli = fli_next) { KASSERT(fli->fli_trans_cnt == 0); KASSERT(fli->fli_cow_cnt == 0); + KASSERT(fli->fli_self == l); if (fli->fli_mount != NULL) fstrans_mount_dtor(fli->fli_mountinfo); fli_next = fli->fli_succ; @@ -214,6 +209,8 @@ fstrans_lwp_dtor(void *arg) membar_sync(); fli->fli_self = NULL; } + + l->l_fstrans = NULL; } /* @@ -294,13 +291,12 @@ fstrans_unmount(struct mount *mp) static void fstrans_clear_lwp_info(void) { - struct fstrans_lwp_info *head, **p, *fli; + struct fstrans_lwp_info **p, *fli; /* * Scan our list clearing entries whose mount is gone. */ - head = lwp_getspecific(lwp_data_key); - for (p = &head; *p; p = &(*p)->fli_succ) { + for (p = &curlwp->l_fstrans; *p; p = &(*p)->fli_succ) { fli = *p; if (fli->fli_mount != NULL && fli->fli_mountinfo->fmi_gone && @@ -317,7 +313,6 @@ fstrans_clear_lwp_info(void) break; } } - lwp_setspecific(lwp_data_key, head); } /* @@ -329,7 +324,7 @@ fstrans_alloc_lwp_info(struct mount *mp) struct fstrans_lwp_info *fli, *fli2; struct fstrans_mount_info *fmi; - for (fli = lwp_getspecific(lwp_data_key); fli; fli = fli->fli_succ) { + for (fli = curlwp->l_fstrans; fli; fli = fli->fli_succ) { if (fli->fli_mount == mp) return fli; } @@ -345,8 +340,8 @@ fstrans_alloc_lwp_info(struct mount *mp) KASSERT(fli->fli_trans_cnt == 0); KASSERT(fli->fli_cow_cnt == 0); fli->fli_self = curlwp; - fli->fli_succ = lwp_getspecific(lwp_data_key); - lwp_setspecific(lwp_data_key, fli); + fli->fli_succ = curlwp->l_fstrans; + curlwp->l_fstrans = fli; break; } } @@ -359,8 +354,8 @@ fstrans_alloc_lwp_info(struct mount *mp) fli->fli_self = curlwp; LIST_INSERT_HEAD(&fstrans_fli_head, fli, fli_list); mutex_exit(&fstrans_lock); - fli->fli_succ = lwp_getspecific(lwp_data_key); - lwp_setspecific(lwp_data_key, fli); + fli->fli_succ = curlwp->l_fstrans; + curlwp->l_fstrans = fli; } /* @@ -393,17 +388,16 @@ fstrans_alloc_lwp_info(struct mount *mp) static inline struct fstrans_lwp_info * fstrans_get_lwp_info(struct mount *mp, bool do_alloc) { - struct fstrans_lwp_info *head, *fli, *fli2; - - head = lwp_getspecific(lwp_data_key); + struct fstrans_lwp_info *fli, *fli2; /* * Scan our list for a match. */ - for (fli = head; fli; fli = fli->fli_succ) { + for (fli = curlwp->l_fstrans; fli; fli = fli->fli_succ) { if (fli->fli_mount == mp) { if (fli->fli_alias != NULL) { - for (fli2 = head; fli2; fli2 = fli2->fli_succ) { + for (fli2 = curlwp->l_fstrans; fli2; + fli2 = fli2->fli_succ) { if (fli2->fli_mount == fli->fli_alias) break; } Index: src/sys/sys/fstrans.h diff -u src/sys/sys/fstrans.h:1.12 src/sys/sys/fstrans.h:1.13 --- src/sys/sys/fstrans.h:1.12 Fri Oct 5 09:51:56 2018 +++ src/sys/sys/fstrans.h Fri Mar 1 09:02:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: fstrans.h,v 1.12 2018/10/05 09:51:56 hannken Exp $ */ +/* $NetBSD: fstrans.h,v 1.13 2019/03/01 09:02:03 hannken Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -48,6 +48,7 @@ enum fstrans_state { }; void fstrans_init(void); +void fstrans_lwp_dtor(lwp_t *); void fstrans_start(struct mount *); int fstrans_start_nowait(struct mount *); void fstrans_start_lazy(struct mount *); Index: src/sys/sys/lwp.h diff -u src/sys/sys/lwp.h:1.180 src/sys/sys/lwp.h:1.181 --- src/sys/sys/lwp.h:1.180 Wed Nov 28 19:46:22 2018 +++ src/sys/sys/lwp.h Fri Mar 1 09:02:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: lwp.h,v 1.180 2018/11/28 19:46:22 mlelstv Exp $ */ +/* $NetBSD: lwp.h,v 1.181 2019/03/01 09:02:03 hannken Exp $ */ /* * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2010 @@ -180,6 +180,7 @@ struct lwp { struct kauth_cred *l_cred; /* !: cached credentials */ struct filedesc *l_fd; /* !: cached copy of proc::p_fd */ void *l_emuldata; /* !: kernel lwp-private data */ + struct fstrans_lwp_info *l_fstrans; /* (: fstrans private data */ u_int l_cv_signalled; /* c: restarted by cv_signal() */ u_short l_shlocks; /* !: lockdebug: shared locks held */ u_short l_exlocks; /* !: lockdebug: excl. locks held */