Module Name:    src
Committed By:   reinoud
Date:           Tue Jun 27 09:58:50 UTC 2023

Modified Files:
        src/sys/fs/udf: udf.h udf_strat_direct.c udf_strat_rmw.c
            udf_strat_sequential.c udf_vnops.c

Log Message:
Convert UDF file system code from the depricated tsleep(9)/wakeup(9) to the MP
friendly condvar(9). No functional change intended.


To generate a diff of this commit:
cvs rdiff -u -r1.54 -r1.55 src/sys/fs/udf/udf.h
cvs rdiff -u -r1.15 -r1.16 src/sys/fs/udf/udf_strat_direct.c
cvs rdiff -u -r1.30 -r1.31 src/sys/fs/udf/udf_strat_rmw.c
cvs rdiff -u -r1.19 -r1.20 src/sys/fs/udf/udf_strat_sequential.c
cvs rdiff -u -r1.126 -r1.127 src/sys/fs/udf/udf_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/fs/udf/udf.h
diff -u src/sys/fs/udf/udf.h:1.54 src/sys/fs/udf/udf.h:1.55
--- src/sys/fs/udf/udf.h:1.54	Sun Aug  7 11:06:19 2022
+++ src/sys/fs/udf/udf.h	Tue Jun 27 09:58:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: udf.h,v 1.54 2022/08/07 11:06:19 andvar Exp $ */
+/* $NetBSD: udf.h,v 1.55 2023/06/27 09:58:50 reinoud Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -76,7 +76,9 @@ extern int udf_verbose;
 #define UDF_DEBUG_RESERVE	0x1000000
 
 /* initial value of udf_verbose */
-#define UDF_DEBUGGING		(0)
+#define UDF_DEBUGGING		(0x0000000)
+//#define UDF_DEBUGGING		(0x02fffff)
+
 
 #ifdef UDF_DEBUG
 #define DPRINTF(name, arg) { \

Index: src/sys/fs/udf/udf_strat_direct.c
diff -u src/sys/fs/udf/udf_strat_direct.c:1.15 src/sys/fs/udf/udf_strat_direct.c:1.16
--- src/sys/fs/udf/udf_strat_direct.c:1.15	Sat Jan 15 10:55:53 2022
+++ src/sys/fs/udf/udf_strat_direct.c	Tue Jun 27 09:58:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_strat_direct.c,v 1.15 2022/01/15 10:55:53 msaitoh Exp $ */
+/* $NetBSD: udf_strat_direct.c,v 1.16 2023/06/27 09:58:50 reinoud Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_strat_direct.c,v 1.15 2022/01/15 10:55:53 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_strat_direct.c,v 1.16 2023/06/27 09:58:50 reinoud Exp $");
 #endif /* not lint */
 
 
@@ -116,7 +116,7 @@ udf_wr_nodedscr_callback(struct buf *buf
 	if (udf_node->outstanding_nodedscr == 0) {
 		/* unlock the node */
 		UDF_UNLOCK_NODE(udf_node, 0);
-		wakeup(&udf_node->outstanding_nodedscr);
+		cv_broadcast(&udf_node->node_lock);
 	}
 
 	putiobuf(buf);
@@ -223,7 +223,7 @@ out:
 	udf_node->outstanding_nodedscr--;
 	if (udf_node->outstanding_nodedscr == 0) {
 		UDF_UNLOCK_NODE(udf_node, 0);
-		wakeup(&udf_node->outstanding_nodedscr);
+		cv_broadcast(&udf_node->node_lock);
 	}
 
 	return error;

Index: src/sys/fs/udf/udf_strat_rmw.c
diff -u src/sys/fs/udf/udf_strat_rmw.c:1.30 src/sys/fs/udf/udf_strat_rmw.c:1.31
--- src/sys/fs/udf/udf_strat_rmw.c:1.30	Sat Jan 15 10:55:53 2022
+++ src/sys/fs/udf/udf_strat_rmw.c	Tue Jun 27 09:58:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_strat_rmw.c,v 1.30 2022/01/15 10:55:53 msaitoh Exp $ */
+/* $NetBSD: udf_strat_rmw.c,v 1.31 2023/06/27 09:58:50 reinoud Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_strat_rmw.c,v 1.30 2022/01/15 10:55:53 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_strat_rmw.c,v 1.31 2023/06/27 09:58:50 reinoud Exp $");
 #endif /* not lint */
 
 
@@ -756,7 +756,7 @@ udf_write_nodedscr_rmw(struct udf_strat_
 	if (udf_node->outstanding_nodedscr == 0) {
 		/* XXX still using wakeup! */
 		UDF_UNLOCK_NODE(udf_node, 0);
-		wakeup(&udf_node->outstanding_nodedscr);
+		cv_broadcast(&udf_node->node_lock);
 	}
 	udf_puteccline(eccline);
 
@@ -1205,6 +1205,8 @@ udf_discstrat_thread(void *arg)
 
 	work = 1;
 	priv->thread_running = 1;
+	cv_broadcast(&priv->discstrat_cv);
+
 	mutex_enter(&priv->discstrat_mutex);
 	priv->num_floating = 0;
 	while (priv->run_thread || work || priv->num_floating) {
@@ -1356,7 +1358,8 @@ udf_discstrat_thread(void *arg)
 
 	priv->thread_running  = 0;
 	priv->thread_finished = 1;
-	wakeup(&priv->run_thread);
+	cv_broadcast(&priv->discstrat_cv);
+
 	kthread_exit(0);
 	/* not reached */
 }
@@ -1459,9 +1462,11 @@ udf_discstrat_init_rmw(struct udf_strat_
 	}
 
 	/* wait for thread to spin up */
+	mutex_enter(&priv->discstrat_mutex);
 	while (!priv->thread_running) {
-		tsleep(&priv->thread_running, PRIBIO+1, "udfshedstart", hz);
+		cv_timedwait(&priv->discstrat_cv, &priv->discstrat_mutex, hz);
 	}
+	mutex_exit(&priv->discstrat_mutex);
 }
 
 
@@ -1477,20 +1482,23 @@ udf_discstrat_finish_rmw(struct udf_stra
 	/* stop our sheduling thread */
 	KASSERT(priv->run_thread == 1);
 	priv->run_thread = 0;
-	wakeup(priv->queue_lwp);
+
+	mutex_enter(&priv->discstrat_mutex);
 	while (!priv->thread_finished) {
-		tsleep(&priv->run_thread, PRIBIO + 1, "udfshedfin", hz);
+		cv_broadcast(&priv->discstrat_cv);
+		cv_timedwait(&priv->discstrat_cv, &priv->discstrat_mutex, hz);
 	}
+	mutex_exit(&priv->discstrat_mutex);
+
 	/* kthread should be finished now */
+	cv_destroy(&priv->discstrat_cv);
+	mutex_destroy(&priv->discstrat_mutex);
+	mutex_destroy(&priv->seqwrite_mutex);
 
 	/* cleanup our pools */
 	pool_destroy(&priv->eccline_pool);
 	pool_destroy(&priv->ecclineblob_pool);
 
-	cv_destroy(&priv->discstrat_cv);
-	mutex_destroy(&priv->discstrat_mutex);
-	mutex_destroy(&priv->seqwrite_mutex);
-
 	/* free our private space */
 	free(ump->strategy_private, M_UDFTEMP);
 	ump->strategy_private = NULL;

Index: src/sys/fs/udf/udf_strat_sequential.c
diff -u src/sys/fs/udf/udf_strat_sequential.c:1.19 src/sys/fs/udf/udf_strat_sequential.c:1.20
--- src/sys/fs/udf/udf_strat_sequential.c:1.19	Sat Aug 27 05:32:41 2022
+++ src/sys/fs/udf/udf_strat_sequential.c	Tue Jun 27 09:58:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_strat_sequential.c,v 1.19 2022/08/27 05:32:41 skrll Exp $ */
+/* $NetBSD: udf_strat_sequential.c,v 1.20 2023/06/27 09:58:50 reinoud Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_strat_sequential.c,v 1.19 2022/08/27 05:32:41 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_strat_sequential.c,v 1.20 2023/06/27 09:58:50 reinoud Exp $");
 #endif /* not lint */
 
 
@@ -85,7 +85,10 @@ struct strat_private {
 	kcondvar_t		 discstrat_cv;		/* to wait on       */
 	kmutex_t		 discstrat_mutex;	/* disc strategy    */
 
+	int			 thread_running;	/* thread control */
 	int			 run_thread;		/* thread control */
+	int			 thread_finished;	/* thread control */
+
 	int			 sync_req;		/* thread control */
 	int			 cur_queue;
 
@@ -127,7 +130,7 @@ udf_wr_nodedscr_callback(struct buf *buf
 	if (udf_node->outstanding_nodedscr == 0) {
 		/* first unlock the node */
 		UDF_UNLOCK_NODE(udf_node, 0);
-		wakeup(&udf_node->outstanding_nodedscr);
+		cv_broadcast(&udf_node->node_lock);
 	}
 
 	putiobuf(buf);
@@ -234,7 +237,7 @@ out:
 	udf_node->outstanding_nodedscr--;
 	if (udf_node->outstanding_nodedscr == 0) {
 		UDF_UNLOCK_NODE(udf_node, 0);
-		wakeup(&udf_node->outstanding_nodedscr);
+		cv_broadcast(&udf_node->node_lock);
 	}
 
 	return error;
@@ -565,6 +568,10 @@ udf_discstrat_thread(void *arg)
 	int empty;
 
 	empty = 1;
+
+	priv->thread_running = 1;
+	cv_broadcast(&priv->discstrat_cv);
+
 	mutex_enter(&priv->discstrat_mutex);
 	while (priv->run_thread || !empty || priv->sync_req) {
 		/* process the current selected queue */
@@ -587,7 +594,10 @@ udf_discstrat_thread(void *arg)
 	}
 	mutex_exit(&priv->discstrat_mutex);
 
-	wakeup(&priv->run_thread);
+	priv->thread_running  = 0;
+	priv->thread_finished = 1;
+	cv_broadcast(&priv->discstrat_cv);
+
 	kthread_exit(0);
 	/* not reached */
 }
@@ -654,13 +664,22 @@ udf_discstrat_init_seq(struct udf_strat_
 	vfs_timestamp(&priv->last_queued[UDF_SHED_SEQWRITING]);
 
 	/* create our disk strategy thread */
-	priv->run_thread = 1;
-	priv->sync_req   = 0;
+	priv->thread_finished = 0;
+	priv->thread_running  = 0;
+	priv->run_thread      = 1;
+	priv->sync_req        = 0;
 	if (kthread_create(PRI_NONE, 0 /* KTHREAD_MPSAFE*/, NULL /* cpu_info*/,
 		udf_discstrat_thread, ump, &priv->queue_lwp,
 		"%s", "udf_rw")) {
 		panic("fork udf_rw");
 	}
+
+	/* wait for thread to spin up */
+	mutex_enter(&priv->discstrat_mutex);
+	while (!priv->thread_running) {
+		cv_timedwait(&priv->discstrat_cv, &priv->discstrat_mutex, hz);
+	}
+	mutex_exit(&priv->discstrat_mutex);
 }
 
 
@@ -669,7 +688,6 @@ udf_discstrat_finish_seq(struct udf_stra
 {
 	struct udf_mount *ump = args->ump;
 	struct strat_private *priv = PRIV(ump);
-	int error;
 
 	if (ump == NULL)
 		return;
@@ -677,11 +695,14 @@ udf_discstrat_finish_seq(struct udf_stra
 	/* stop our scheduling thread */
 	KASSERT(priv->run_thread == 1);
 	priv->run_thread = 0;
-	wakeup(priv->queue_lwp);
-	do {
-		error = tsleep(&priv->run_thread, PRIBIO+1,
-			"udfshedfin", hz);
-	} while (error);
+
+	mutex_enter(&priv->discstrat_mutex);
+	while (!priv->thread_finished) {
+		cv_broadcast(&priv->discstrat_cv);
+		cv_timedwait(&priv->discstrat_cv, &priv->discstrat_mutex, hz);
+	}
+	mutex_exit(&priv->discstrat_mutex);
+
 	/* kthread should be finished now */
 
 	/* set back old device strategy method */

Index: src/sys/fs/udf/udf_vnops.c
diff -u src/sys/fs/udf/udf_vnops.c:1.126 src/sys/fs/udf/udf_vnops.c:1.127
--- src/sys/fs/udf/udf_vnops.c:1.126	Sat May 28 21:14:57 2022
+++ src/sys/fs/udf/udf_vnops.c	Tue Jun 27 09:58:50 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: udf_vnops.c,v 1.126 2022/05/28 21:14:57 andvar Exp $ */
+/* $NetBSD: udf_vnops.c,v 1.127 2023/06/27 09:58:50 reinoud Exp $ */
 
 /*
  * Copyright (c) 2006, 2008 Reinoud Zandijk
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.126 2022/05/28 21:14:57 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udf_vnops.c,v 1.127 2023/06/27 09:58:50 reinoud Exp $");
 #endif /* not lint */
 
 
@@ -163,10 +163,12 @@ udf_reclaim(void *v)
 	udf_update(vp, NULL, NULL, NULL, UPDATE_CLOSE);
 
 	/* async check to see if all node descriptors are written out */
+	mutex_enter(&udf_node->node_mutex);
 	while ((volatile int) udf_node->outstanding_nodedscr > 0) {
 		vprint("udf_reclaim(): waiting for writeout\n", vp);
-		tsleep(&udf_node->outstanding_nodedscr, PRIBIO, "recl wait", hz/8);
+		cv_timedwait(&udf_node->node_lock, &udf_node->node_mutex, hz/8);
 	}
+	mutex_exit(&udf_node->node_mutex);
 
 	/* dispose all node knowledge */
 	udf_dispose_node(udf_node);

Reply via email to