All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3][BUGFIX] tracing/kprobe: memory barrier related bugfixes
@ 2013-05-13 11:58 Masami Hiramatsu
  2013-05-13 11:58 ` [PATCH 1/3] [BUGFIX] tracing/kprobes: Use rcu_dereference_raw for tp->files Masami Hiramatsu
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Masami Hiramatsu @ 2013-05-13 11:58 UTC (permalink / raw)
  To: linux-kernel, Steven Rostedt
  Cc: Srikar Dronamraju, Frederic Weisbecker, yrl.pp-manager.tt,
	Oleg Nesterov, Ingo Molnar, Tom Zanussi

Hi,

Here are three patches for fixing rcu memory barrier related issue
and sparse warnings, which I was made on previous series.

---

Masami Hiramatsu (3):
      [BUGFIX] tracing/kprobes: Use rcu_dereference_raw for tp->files
      [CLEANUP/SPARSE] tracing/kprobes: Fix a sparse warning for incorrect type in assignment
      [CLEANUP/SPARSE] tracing/kprobes: Make print_*probe_event static


 kernel/trace/trace_kprobe.c |   53 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 40 insertions(+), 13 deletions(-)

-- 
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
IT Management Research Dept. and Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/3] [BUGFIX] tracing/kprobes: Use rcu_dereference_raw for tp->files
  2013-05-13 11:58 [PATCH 0/3][BUGFIX] tracing/kprobe: memory barrier related bugfixes Masami Hiramatsu
@ 2013-05-13 11:58 ` Masami Hiramatsu
  2013-05-13 11:58 ` [PATCH 2/3] [CLEANUP/SPARSE] tracing/kprobes: Fix a sparse warning for incorrect type in assignment Masami Hiramatsu
  2013-05-13 11:58 ` [PATCH 3/3] [CLEANUP/SPARSE] tracing/kprobes: Make print_*probe_event static Masami Hiramatsu
  2 siblings, 0 replies; 4+ messages in thread
From: Masami Hiramatsu @ 2013-05-13 11:58 UTC (permalink / raw)
  To: linux-kernel, Steven Rostedt
  Cc: Srikar Dronamraju, Frederic Weisbecker, yrl.pp-manager.tt,
	Oleg Nesterov, Ingo Molnar, Tom Zanussi

Use rcu_dereference_raw() for accessing tp->files. Because the
write-side uses rcu_assign_pointer() for memory barrier,
the read-side also has to use rcu_dereference_raw() with
read memory barrier.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
---
 kernel/trace/trace_kprobe.c |   47 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 37 insertions(+), 10 deletions(-)

diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 636d45f..0a3d8d5 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -185,9 +185,14 @@ static struct trace_probe *find_trace_probe(const char *event,
 
 static int trace_probe_nr_files(struct trace_probe *tp)
 {
-	struct ftrace_event_file **file = tp->files;
+	struct ftrace_event_file **file;
 	int ret = 0;
 
+	/*
+	 * Since all tp->files updater is protected by probe_enable_lock,
+	 * we don't need to lock an rcu_read_lock.
+	 */
+	file = rcu_dereference_raw(tp->files);
 	if (file)
 		while (*(file++))
 			ret++;
@@ -209,9 +214,10 @@ enable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file)
 	mutex_lock(&probe_enable_lock);
 
 	if (file) {
-		struct ftrace_event_file **new, **old = tp->files;
+		struct ftrace_event_file **new, **old;
 		int n = trace_probe_nr_files(tp);
 
+		old = rcu_dereference_raw(tp->files);
 		/* 1 is for new one and 1 is for stopper */
 		new = kzalloc((n + 2) * sizeof(struct ftrace_event_file *),
 			      GFP_KERNEL);
@@ -251,11 +257,17 @@ enable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file)
 static int
 trace_probe_file_index(struct trace_probe *tp, struct ftrace_event_file *file)
 {
+	struct ftrace_event_file **files;
 	int i;
 
-	if (tp->files) {
-		for (i = 0; tp->files[i]; i++)
-			if (tp->files[i] == file)
+	/*
+	 * Since all tp->files updater is protected by probe_enable_lock,
+	 * we don't need to lock an rcu_read_lock.
+	 */
+	files = rcu_dereference_raw(tp->files);
+	if (files) {
+		for (i = 0; files[i]; i++)
+			if (files[i] == file)
 				return i;
 	}
 
@@ -274,10 +286,11 @@ disable_trace_probe(struct trace_probe *tp, struct ftrace_event_file *file)
 	mutex_lock(&probe_enable_lock);
 
 	if (file) {
-		struct ftrace_event_file **new, **old = tp->files;
+		struct ftrace_event_file **new, **old;
 		int n = trace_probe_nr_files(tp);
 		int i, j;
 
+		old = rcu_dereference_raw(tp->files);
 		if (n == 0 || trace_probe_file_index(tp, file) < 0) {
 			ret = -EINVAL;
 			goto out_unlock;
@@ -872,9 +885,16 @@ __kprobe_trace_func(struct trace_probe *tp, struct pt_regs *regs,
 static __kprobes void
 kprobe_trace_func(struct trace_probe *tp, struct pt_regs *regs)
 {
-	struct ftrace_event_file **file = tp->files;
+	/*
+	 * Note: preempt is already disabled around the kprobe handler.
+	 * However, we still need an smp_read_barrier_depends() corresponding
+	 * to smp_wmb() in rcu_assign_pointer() to access the pointer.
+	 */
+	struct ftrace_event_file **file = rcu_dereference_raw(tp->files);
+
+	if (unlikely(!file))
+		return;
 
-	/* Note: preempt is already disabled around the kprobe handler */
 	while (*file) {
 		__kprobe_trace_func(tp, regs, *file);
 		file++;
@@ -925,9 +945,16 @@ static __kprobes void
 kretprobe_trace_func(struct trace_probe *tp, struct kretprobe_instance *ri,
 		     struct pt_regs *regs)
 {
-	struct ftrace_event_file **file = tp->files;
+	/*
+	 * Note: preempt is already disabled around the kprobe handler.
+	 * However, we still need an smp_read_barrier_depends() corresponding
+	 * to smp_wmb() in rcu_assign_pointer() to access the pointer.
+	 */
+	struct ftrace_event_file **file = rcu_dereference_raw(tp->files);
+
+	if (unlikely(!file))
+		return;
 
-	/* Note: preempt is already disabled around the kprobe handler */
 	while (*file) {
 		__kretprobe_trace_func(tp, ri, regs, *file);
 		file++;


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] [CLEANUP/SPARSE] tracing/kprobes: Fix a sparse warning for incorrect type in assignment
  2013-05-13 11:58 [PATCH 0/3][BUGFIX] tracing/kprobe: memory barrier related bugfixes Masami Hiramatsu
  2013-05-13 11:58 ` [PATCH 1/3] [BUGFIX] tracing/kprobes: Use rcu_dereference_raw for tp->files Masami Hiramatsu
@ 2013-05-13 11:58 ` Masami Hiramatsu
  2013-05-13 11:58 ` [PATCH 3/3] [CLEANUP/SPARSE] tracing/kprobes: Make print_*probe_event static Masami Hiramatsu
  2 siblings, 0 replies; 4+ messages in thread
From: Masami Hiramatsu @ 2013-05-13 11:58 UTC (permalink / raw)
  To: linux-kernel, Steven Rostedt
  Cc: Srikar Dronamraju, Frederic Weisbecker, yrl.pp-manager.tt,
	Oleg Nesterov, Ingo Molnar, Tom Zanussi

Fix a sparse warning about the rcu operated pointer is
defined without __rcu address space.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
---
 kernel/trace/trace_kprobe.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 0a3d8d5..81c5109 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -35,7 +35,7 @@ struct trace_probe {
 	const char		*symbol;	/* symbol name */
 	struct ftrace_event_class	class;
 	struct ftrace_event_call	call;
-	struct ftrace_event_file	**files;
+	struct ftrace_event_file * __rcu *files;
 	ssize_t			size;		/* trace entry size */
 	unsigned int		nr_args;
 	struct probe_arg	args[];


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] [CLEANUP/SPARSE] tracing/kprobes: Make print_*probe_event static
  2013-05-13 11:58 [PATCH 0/3][BUGFIX] tracing/kprobe: memory barrier related bugfixes Masami Hiramatsu
  2013-05-13 11:58 ` [PATCH 1/3] [BUGFIX] tracing/kprobes: Use rcu_dereference_raw for tp->files Masami Hiramatsu
  2013-05-13 11:58 ` [PATCH 2/3] [CLEANUP/SPARSE] tracing/kprobes: Fix a sparse warning for incorrect type in assignment Masami Hiramatsu
@ 2013-05-13 11:58 ` Masami Hiramatsu
  2 siblings, 0 replies; 4+ messages in thread
From: Masami Hiramatsu @ 2013-05-13 11:58 UTC (permalink / raw)
  To: linux-kernel, Steven Rostedt
  Cc: Srikar Dronamraju, Frederic Weisbecker, yrl.pp-manager.tt,
	Oleg Nesterov, Ingo Molnar, Tom Zanussi

According to sparse warning, print_*probe_event static because
those functions are not directly called from outside.

Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
---
 kernel/trace/trace_kprobe.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 81c5109..9f46e98 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -962,7 +962,7 @@ kretprobe_trace_func(struct trace_probe *tp, struct kretprobe_instance *ri,
 }
 
 /* Event entry printers */
-enum print_line_t
+static enum print_line_t
 print_kprobe_event(struct trace_iterator *iter, int flags,
 		   struct trace_event *event)
 {
@@ -998,7 +998,7 @@ partial:
 	return TRACE_TYPE_PARTIAL_LINE;
 }
 
-enum print_line_t
+static enum print_line_t
 print_kretprobe_event(struct trace_iterator *iter, int flags,
 		      struct trace_event *event)
 {


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-05-13 12:02 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-13 11:58 [PATCH 0/3][BUGFIX] tracing/kprobe: memory barrier related bugfixes Masami Hiramatsu
2013-05-13 11:58 ` [PATCH 1/3] [BUGFIX] tracing/kprobes: Use rcu_dereference_raw for tp->files Masami Hiramatsu
2013-05-13 11:58 ` [PATCH 2/3] [CLEANUP/SPARSE] tracing/kprobes: Fix a sparse warning for incorrect type in assignment Masami Hiramatsu
2013-05-13 11:58 ` [PATCH 3/3] [CLEANUP/SPARSE] tracing/kprobes: Make print_*probe_event static Masami Hiramatsu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.