* [PATCH 0/2] [GIT PULL] tracing: A couple of fixes to tracepoints
@ 2014-05-08 21:07 Steven Rostedt
2014-05-08 21:07 ` [PATCH 1/2] trace: module: Maintain a valid user count Steven Rostedt
2014-05-08 21:07 ` [PATCH 2/2] tracepoint: Fix use of tracepoint funcs after rcu free Steven Rostedt
0 siblings, 2 replies; 3+ messages in thread
From: Steven Rostedt @ 2014-05-08 21:07 UTC (permalink / raw)
To: linux-kernel
Cc: Linus Torvalds, Ingo Molnar, Andrew Morton, Mathieu Desnoyers
Linus,
This contains two fixes.
The first is a long standing bug that causes bogus data to show up
in the refcnt field of the module_refcnt tracepoint. It was
introduced by a merge conflict resolution back in 2.6.35-rc days.
The result should be refcnt = incs - decs, but instead it did
refcnt = incs + decs.
The second fix is to a bug that was introduced in this merge window
that allowed for a tracepoint funcs pointer to be used after it
was freed. Moving the location of where the probes are released
solved the problem.
Please pull the latest trace-fixes-v3.15-rc4-v2 tree, which can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
trace-fixes-v3.15-rc4-v2
Tag SHA1: 3c46db2195fb760afba9f01a495557e78ca8226e
Head SHA1: 8058bd0faad860e75547cc5cb5d4ade016247a79
Mathieu Desnoyers (1):
tracepoint: Fix use of tracepoint funcs after rcu free
Romain Izard (1):
trace: module: Maintain a valid user count
----
include/trace/events/module.h | 2 +-
kernel/tracepoint.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] trace: module: Maintain a valid user count
2014-05-08 21:07 [PATCH 0/2] [GIT PULL] tracing: A couple of fixes to tracepoints Steven Rostedt
@ 2014-05-08 21:07 ` Steven Rostedt
2014-05-08 21:07 ` [PATCH 2/2] tracepoint: Fix use of tracepoint funcs after rcu free Steven Rostedt
1 sibling, 0 replies; 3+ messages in thread
From: Steven Rostedt @ 2014-05-08 21:07 UTC (permalink / raw)
To: linux-kernel
Cc: Linus Torvalds, Ingo Molnar, Andrew Morton, Mathieu Desnoyers,
Rusty Russell, Frederic Weisbecker, stable, Romain Izard
[-- Attachment #1: 0001-trace-module-Maintain-a-valid-user-count.patch --]
[-- Type: text/plain, Size: 1485 bytes --]
From: Romain Izard <romain.izard.pro@gmail.com>
The replacement of the 'count' variable by two variables 'incs' and
'decs' to resolve some race conditions during module unloading was done
in parallel with some cleanup in the trace subsystem, and was integrated
as a merge.
Unfortunately, the formula for this replacement was wrong in the tracing
code, and the refcount in the traces was not usable as a result.
Use 'count = incs - decs' to compute the user count.
Link: http://lkml.kernel.org/p/1393924179-9147-1-git-send-email-romain.izard.pro@gmail.com
Acked-by: Ingo Molnar <mingo@kernel.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: stable@vger.kernel.org # 2.6.35
Fixes: c1ab9cab7509 "merge conflict resolution"
Signed-off-by: Romain Izard <romain.izard.pro@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
include/trace/events/module.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/trace/events/module.h b/include/trace/events/module.h
index 11fd51b..daa60c7 100644
--- a/include/trace/events/module.h
+++ b/include/trace/events/module.h
@@ -80,7 +80,7 @@ DECLARE_EVENT_CLASS(module_refcnt,
TP_fast_assign(
__entry->ip = ip;
- __entry->refcnt = __this_cpu_read(mod->refptr->incs) + __this_cpu_read(mod->refptr->decs);
+ __entry->refcnt = __this_cpu_read(mod->refptr->incs) - __this_cpu_read(mod->refptr->decs);
__assign_str(name, mod->name);
),
--
1.8.5.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] tracepoint: Fix use of tracepoint funcs after rcu free
2014-05-08 21:07 [PATCH 0/2] [GIT PULL] tracing: A couple of fixes to tracepoints Steven Rostedt
2014-05-08 21:07 ` [PATCH 1/2] trace: module: Maintain a valid user count Steven Rostedt
@ 2014-05-08 21:07 ` Steven Rostedt
1 sibling, 0 replies; 3+ messages in thread
From: Steven Rostedt @ 2014-05-08 21:07 UTC (permalink / raw)
To: linux-kernel
Cc: Linus Torvalds, Ingo Molnar, Andrew Morton, Mathieu Desnoyers,
Sasha Levin, Oleg Nesterov, Dave Jones
[-- Attachment #1: 0002-tracepoint-Fix-use-of-tracepoint-funcs-after-rcu-fre.patch --]
[-- Type: text/plain, Size: 2044 bytes --]
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Commit de7b2973903c "tracepoint: Use struct pointer instead of name hash
for reg/unreg tracepoints" introduces a use after free by calling
release_probes on the old struct tracepoint array before the newly
allocated array is published with rcu_assign_pointer. There is a race
window where tracepoints (RCU readers) can perform a
"use-after-grace-period-after-free", which shows up as a GPF in
stress-tests.
Link: http://lkml.kernel.org/r/53698021.5020108@oracle.com
Link: http://lkml.kernel.org/p/1399549669-25465-1-git-send-email-mathieu.desnoyers@efficios.com
Reported-by: Sasha Levin <sasha.levin@oracle.com>
CC: Oleg Nesterov <oleg@redhat.com>
CC: Dave Jones <davej@redhat.com>
Fixes: de7b2973903c "tracepoint: Use struct pointer instead of name hash for reg/unreg tracepoints"
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
kernel/tracepoint.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index ac5b23c..6620e58 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -188,7 +188,6 @@ static int tracepoint_add_func(struct tracepoint *tp,
WARN_ON_ONCE(1);
return PTR_ERR(old);
}
- release_probes(old);
/*
* rcu_assign_pointer has a smp_wmb() which makes sure that the new
@@ -200,6 +199,7 @@ static int tracepoint_add_func(struct tracepoint *tp,
rcu_assign_pointer(tp->funcs, tp_funcs);
if (!static_key_enabled(&tp->key))
static_key_slow_inc(&tp->key);
+ release_probes(old);
return 0;
}
@@ -221,7 +221,6 @@ static int tracepoint_remove_func(struct tracepoint *tp,
WARN_ON_ONCE(1);
return PTR_ERR(old);
}
- release_probes(old);
if (!tp_funcs) {
/* Removed last function */
@@ -232,6 +231,7 @@ static int tracepoint_remove_func(struct tracepoint *tp,
static_key_slow_dec(&tp->key);
}
rcu_assign_pointer(tp->funcs, tp_funcs);
+ release_probes(old);
return 0;
}
--
1.8.5.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-05-08 21:08 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-08 21:07 [PATCH 0/2] [GIT PULL] tracing: A couple of fixes to tracepoints Steven Rostedt
2014-05-08 21:07 ` [PATCH 1/2] trace: module: Maintain a valid user count Steven Rostedt
2014-05-08 21:07 ` [PATCH 2/2] tracepoint: Fix use of tracepoint funcs after rcu free Steven Rostedt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox