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 */

Reply via email to