Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 3765

kernel-2.6.18-194.11.1.el5.src.rpm

From: Jason Baron <jbaron@redhat.com>
Date: Thu, 26 Mar 2009 22:10:15 -0400
Subject: [trace] tracepoints fix reentrancy
Message-id: 200903270210.n2R2AFaH029644@ns3.rdu.redhat.com
O-Subject: [RHEL 5.4 PATCH 05/10] - tracepoints fix reentrancy
Bugzilla: 465543

    commit be19b047df594af125965e79ff280b36da485248

    tracepoint-fix-reentrancy

    Tracepoints fix reentrancy

    The tracepoints had the same problem markers did have wrt reentrancy. Apply a
    similar fix using a rcu_barrier after each tracepoint mutex lock.

    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
    CC: Ingo Molnar <mingo@elte.hu>
    CC: "Frank Ch. Eigler" <fche@redhat.com>
    CC: Lai Jiangshan <laijs@cn.fujitsu.com>

diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index db39961..f2b7c28 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -356,6 +356,8 @@ int tracepoint_probe_register(const char *name, void *probe)
 	mutex_lock(&tracepoints_mutex);
 	entry = get_tracepoint(name);
 	WARN_ON(!entry);
+	if (entry->rcu_pending)
+		rcu_barrier_sched();
 	tracepoint_entry_free_old(entry, old);
 end:
 	mutex_unlock(&tracepoints_mutex);
@@ -392,6 +394,8 @@ int tracepoint_probe_unregister(const char *name, void *probe)
 	entry = get_tracepoint(name);
 	if (!entry)
 		goto end;
+	if (entry->rcu_pending)
+		rcu_barrier_sched();
 	tracepoint_entry_free_old(entry, old);
 	remove_tracepoint(name);	/* Ignore busy error message */
 	ret = 0;