[sheepdog] [PATCH v2 03/10] trace: guard strbuf with pthread_mutex_lock

MORITA Kazutaka morita.kazutaka at gmail.com
Fri Aug 9 05:21:57 CEST 2013


From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>

strbuf is not thread-safe and we have to guard a buffer with a mutex.
Using a different buffer for each cpuid is not enough because the cpu
can switch to another thread in strbuf functions.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/trace/trace.c |   10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/sheep/trace/trace.c b/sheep/trace/trace.c
index e4fcc0c..17a3aa3 100644
--- a/sheep/trace/trace.c
+++ b/sheep/trace/trace.c
@@ -21,6 +21,7 @@ static size_t nr_callers;
 static trace_func_t trace_func = trace_call;
 
 static struct strbuf *buffer;
+static pthread_mutex_t *buffer_lock;
 static int nr_cpu;
 
 union instruction {
@@ -131,7 +132,9 @@ notrace int trace_buffer_pop(void *buf, uint32_t len)
 	int i;
 
 	for (i = 0; i < nr_cpu; i++) {
+		pthread_mutex_lock(&buffer_lock[i]);
 		readin = strbuf_stripout(&buffer[i], buff, len);
+		pthread_mutex_unlock(&buffer_lock[i]);
 		count += readin;
 		if (count == requested)
 			return count;
@@ -147,7 +150,9 @@ notrace int trace_buffer_pop(void *buf, uint32_t len)
 
 notrace void trace_buffer_push(int cpuid, struct trace_graph_item *item)
 {
+	pthread_mutex_lock(&buffer_lock[cpuid]);
 	strbuf_add(&buffer[cpuid], item, sizeof(*item));
+	pthread_mutex_unlock(&buffer_lock[cpuid]);
 }
 
 /* assume that mcount call exists in the first FIND_MCOUNT_RANGE bytes */
@@ -273,8 +278,11 @@ notrace int trace_init(void)
 
 	nr_cpu = sysconf(_SC_NPROCESSORS_ONLN);
 	buffer = xzalloc(sizeof(*buffer) * nr_cpu);
-	for (i = 0; i < nr_cpu; i++)
+	buffer_lock = xzalloc(sizeof(*buffer_lock) * nr_cpu);
+	for (i = 0; i < nr_cpu; i++) {
 		strbuf_init(&buffer[i], 0);
+		pthread_mutex_init(&buffer_lock[i], NULL);
+	}
 
 	sd_iprintf("trace support enabled. cpu count %d.", nr_cpu);
 	return 0;
-- 
1.7.9.5




More information about the sheepdog mailing list