[ltt-dev] [PATCH] lttng-remove-unneeded-marker-mutex-which-cause-circ-dep
Mathieu Desnoyers
mathieu.desnoyers at polymtl.ca
Tue Apr 7 17:52:16 EDT 2009
Current lttng was having circular locking deps in ltt-trace-control. I
removed some locking around mkdir/rmdir/hotplug notfier handling.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at polymtl.ca>
Signed-off-by: Gui Jianfeng <guijianfeng at cn.fujitsu.com>
---
ltt/ltt-trace-control.c | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
Index: linux-2.6-lttng/ltt/ltt-trace-control.c
===================================================================
--- linux-2.6-lttng.orig/ltt/ltt-trace-control.c 2009-04-07 16:41:15.000000000 -0400
+++ linux-2.6-lttng/ltt/ltt-trace-control.c 2009-04-07 17:27:53.000000000 -0400
@@ -34,10 +34,23 @@ struct dentry *ltt_control_dir, *ltt_set
/*
* the traces_lock nests inside control_lock.
+ * control_lock protects the consistency of directories presented in ltt
+ * directory.
*/
static DEFINE_MUTEX(control_lock);
/*
+ * big note about locking for marker control files :
+ * If a marker control file is added/removed manually racing with module
+ * load/unload, there may be warning messages appearing, but those two
+ * operations should be able to execute concurrently without any lock
+ * synchronizing their operation one wrt another.
+ * Locking the marker mutex, module mutex and also keeping a mutex here
+ * from mkdir/rmdir _and_ from the notifier called from module load/unload makes
+ * life miserable and just asks for deadlocks.
+ */
+
+/*
* lookup a file/dir in parent dir.
* only designed to work well for debugfs.
* (although it maybe ok for other fs)
@@ -869,8 +882,10 @@ static ssize_t marker_info_read(struct f
!_is_marker_present(channel, marker)) {
len += snprintf(buf + len, PAGE_SIZE - len,
"Marker Pre-enabled\n");
+ unlock_markers();
goto out;
}
+ unlock_markers();
marker_iter_reset(&iter);
marker_iter_start(&iter);
@@ -899,7 +914,6 @@ static ssize_t marker_info_read(struct f
marker_iter_stop(&iter);
out:
- unlock_markers();
if (len >= PAGE_SIZE) {
len = PAGE_SIZE;
buf[PAGE_SIZE] = '\0';
@@ -1136,8 +1150,6 @@ static int build_marker_control_files(vo
if (!markers_control_dir)
return -EEXIST;
- lock_markers();
-
marker_iter_reset(&iter);
marker_iter_start(&iter);
for (; iter.marker != NULL; marker_iter_next(&iter)) {
@@ -1148,7 +1160,6 @@ static int build_marker_control_files(vo
marker_iter_stop(&iter);
out:
- unlock_markers();
return err;
}
@@ -1171,8 +1182,6 @@ static int remove_marker_control_dir(str
return -ENOENT;
name = marker_d->d_name.name;
- lock_markers();
-
marker_iter_reset(&iter);
marker_iter_start(&iter);
for (; iter.marker != NULL; marker_iter_next(&iter)) {
@@ -1190,7 +1199,6 @@ static int remove_marker_control_dir(str
end:
marker_iter_stop(&iter);
- unlock_markers();
return 0;
}
--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
More information about the lttng-dev
mailing list