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);