linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] clone/kprobe: Do not use do_fork() when not defined
@ 2015-09-23 11:59 Petr Mladek
  2015-09-23 11:59 ` [PATCH 1/2] clone: Declare do_fork() only when available Petr Mladek
  2015-09-23 11:59 ` [PATCH 2/2] kprobe: Use _do_fork() in samples to make them work again Petr Mladek
  0 siblings, 2 replies; 4+ messages in thread
From: Petr Mladek @ 2015-09-23 11:59 UTC (permalink / raw)
  To: Andrew Morton, Ingo Molnar, Masami Hiramatsu
  Cc: Andy Lutomirski, Peter Zijlstra, H. Peter Anvin, Thomas Gleixner,
	Thiago Macieira, Jiri Kosina, linux-kernel, Petr Mladek

The commit 3033f14ab78c32687 ("clone: support passing tls argument via C
rather than pt_regs magic") introduced _do_fork() that allowed to pass
@tls parameter.

The old do_fork() is defined only for architectures that are not ready
to use this way and do not define HAVE_COPY_THREAD_TLS.

1st patch fixes do_fork() declaration.

2nd patch fixes kprobe samples to work again.

BTW: I think about renaming _do_fork() to do_fork_tls(). Then it will
use the same naming scheme as copy_thread()/copy_thread_tls().

Petr Mladek (2):
  clone: Declare do_fork() only when available
  kprobe: Use _do_fork() in samples to make them work again

 include/linux/sched.h               |  2 ++
 samples/kprobes/jprobe_example.c    | 14 +++++++-------
 samples/kprobes/kprobe_example.c    |  6 +++---
 samples/kprobes/kretprobe_example.c |  4 ++--
 4 files changed, 14 insertions(+), 12 deletions(-)

-- 
1.8.5.6


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

* [PATCH 1/2] clone: Declare do_fork() only when available
  2015-09-23 11:59 [PATCH 0/2] clone/kprobe: Do not use do_fork() when not defined Petr Mladek
@ 2015-09-23 11:59 ` Petr Mladek
  2015-09-23 20:43   ` Andrew Morton
  2015-09-23 11:59 ` [PATCH 2/2] kprobe: Use _do_fork() in samples to make them work again Petr Mladek
  1 sibling, 1 reply; 4+ messages in thread
From: Petr Mladek @ 2015-09-23 11:59 UTC (permalink / raw)
  To: Andrew Morton, Ingo Molnar, Masami Hiramatsu
  Cc: Andy Lutomirski, Peter Zijlstra, H. Peter Anvin, Thomas Gleixner,
	Thiago Macieira, Jiri Kosina, linux-kernel, Petr Mladek

The commit 3033f14ab78c32687 ("clone: support passing tls argument via C
rather than pt_regs magic") introduced _do_fork() that allowed to pass
@tls parameter.

The old do_fork() is defined only for architectures that are not ready
to use this way and do not define HAVE_COPY_THREAD_TLS. But the function
is always declared in linux/sched.h.

This patch hides the declaration when the function is not defined.

Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 include/linux/sched.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index b7b9501b41af..f71f1f505923 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2618,7 +2618,9 @@ extern int do_execveat(int, struct filename *,
 		       const char __user * const __user *,
 		       int);
 extern long _do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *, unsigned long);
+#ifndef CONFIG_HAVE_COPY_THREAD_TLS
 extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *);
+#endif
 struct task_struct *fork_idle(int);
 extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
 
-- 
1.8.5.6


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

* [PATCH 2/2] kprobe: Use _do_fork() in samples to make them work again
  2015-09-23 11:59 [PATCH 0/2] clone/kprobe: Do not use do_fork() when not defined Petr Mladek
  2015-09-23 11:59 ` [PATCH 1/2] clone: Declare do_fork() only when available Petr Mladek
@ 2015-09-23 11:59 ` Petr Mladek
  1 sibling, 0 replies; 4+ messages in thread
From: Petr Mladek @ 2015-09-23 11:59 UTC (permalink / raw)
  To: Andrew Morton, Ingo Molnar, Masami Hiramatsu
  Cc: Andy Lutomirski, Peter Zijlstra, H. Peter Anvin, Thomas Gleixner,
	Thiago Macieira, Jiri Kosina, linux-kernel, Petr Mladek

The commit 3033f14ab78c32687 ("clone: support passing tls argument via C
rather than pt_regs magic") introduced _do_fork() that allowed to pass
@tls parameter.

The old do_fork() is defined only for architectures that are not ready
to use this way and do not define HAVE_COPY_THREAD_TLS.

Let's use _do_fork() in the kprobe examples to make them work again
on all architectures.

Signed-off-by: Petr Mladek <pmladek@suse.com>
---
 samples/kprobes/jprobe_example.c    | 14 +++++++-------
 samples/kprobes/kprobe_example.c    |  6 +++---
 samples/kprobes/kretprobe_example.c |  4 ++--
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/samples/kprobes/jprobe_example.c b/samples/kprobes/jprobe_example.c
index 9119ac6a8270..c285a3b8a9f1 100644
--- a/samples/kprobes/jprobe_example.c
+++ b/samples/kprobes/jprobe_example.c
@@ -1,13 +1,13 @@
 /*
  * Here's a sample kernel module showing the use of jprobes to dump
- * the arguments of do_fork().
+ * the arguments of _do_fork().
  *
  * For more information on theory of operation of jprobes, see
  * Documentation/kprobes.txt
  *
  * Build and insert the kernel module as done in the kprobe example.
  * You will see the trace data in /var/log/messages and on the
- * console whenever do_fork() is invoked to create a new process.
+ * console whenever _do_fork() is invoked to create a new process.
  * (Some messages may be suppressed if syslogd is configured to
  * eliminate duplicate messages.)
  */
@@ -17,13 +17,13 @@
 #include <linux/kprobes.h>
 
 /*
- * Jumper probe for do_fork.
+ * Jumper probe for _do_fork.
  * Mirror principle enables access to arguments of the probed routine
  * from the probe handler.
  */
 
-/* Proxy routine having the same arguments as actual do_fork() routine */
-static long jdo_fork(unsigned long clone_flags, unsigned long stack_start,
+/* Proxy routine having the same arguments as actual _do_fork() routine */
+static long j_do_fork(unsigned long clone_flags, unsigned long stack_start,
 	      unsigned long stack_size, int __user *parent_tidptr,
 	      int __user *child_tidptr)
 {
@@ -36,9 +36,9 @@ static long jdo_fork(unsigned long clone_flags, unsigned long stack_start,
 }
 
 static struct jprobe my_jprobe = {
-	.entry			= jdo_fork,
+	.entry			= j_do_fork,
 	.kp = {
-		.symbol_name	= "do_fork",
+		.symbol_name	= "_do_fork",
 	},
 };
 
diff --git a/samples/kprobes/kprobe_example.c b/samples/kprobes/kprobe_example.c
index 366db1a9fb65..727eb21c9c56 100644
--- a/samples/kprobes/kprobe_example.c
+++ b/samples/kprobes/kprobe_example.c
@@ -1,13 +1,13 @@
 /*
  * NOTE: This example is works on x86 and powerpc.
  * Here's a sample kernel module showing the use of kprobes to dump a
- * stack trace and selected registers when do_fork() is called.
+ * stack trace and selected registers when _do_fork() is called.
  *
  * For more information on theory of operation of kprobes, see
  * Documentation/kprobes.txt
  *
  * You will see the trace data in /var/log/messages and on the console
- * whenever do_fork() is invoked to create a new process.
+ * whenever _do_fork() is invoked to create a new process.
  */
 
 #include <linux/kernel.h>
@@ -16,7 +16,7 @@
 
 /* For each probe you need to allocate a kprobe structure */
 static struct kprobe kp = {
-	.symbol_name	= "do_fork",
+	.symbol_name	= "_do_fork",
 };
 
 /* kprobe pre_handler: called just before the probed instruction is executed */
diff --git a/samples/kprobes/kretprobe_example.c b/samples/kprobes/kretprobe_example.c
index 1041b6731598..ebb1d1aed547 100644
--- a/samples/kprobes/kretprobe_example.c
+++ b/samples/kprobes/kretprobe_example.c
@@ -7,7 +7,7 @@
  *
  * usage: insmod kretprobe_example.ko func=<func_name>
  *
- * If no func_name is specified, do_fork is instrumented
+ * If no func_name is specified, _do_fork is instrumented
  *
  * For more information on theory of operation of kretprobes, see
  * Documentation/kprobes.txt
@@ -25,7 +25,7 @@
 #include <linux/limits.h>
 #include <linux/sched.h>
 
-static char func_name[NAME_MAX] = "do_fork";
+static char func_name[NAME_MAX] = "_do_fork";
 module_param_string(func, func_name, NAME_MAX, S_IRUGO);
 MODULE_PARM_DESC(func, "Function to kretprobe; this module will report the"
 			" function's execution time");
-- 
1.8.5.6


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

* Re: [PATCH 1/2] clone: Declare do_fork() only when available
  2015-09-23 11:59 ` [PATCH 1/2] clone: Declare do_fork() only when available Petr Mladek
@ 2015-09-23 20:43   ` Andrew Morton
  0 siblings, 0 replies; 4+ messages in thread
From: Andrew Morton @ 2015-09-23 20:43 UTC (permalink / raw)
  To: Petr Mladek
  Cc: Ingo Molnar, Masami Hiramatsu, Andy Lutomirski, Peter Zijlstra,
	H. Peter Anvin, Thomas Gleixner, Thiago Macieira, Jiri Kosina,
	linux-kernel

On Wed, 23 Sep 2015 13:59:28 +0200 Petr Mladek <pmladek@suse.com> wrote:

> The commit 3033f14ab78c32687 ("clone: support passing tls argument via C
> rather than pt_regs magic") introduced _do_fork() that allowed to pass
> @tls parameter.
> 
> The old do_fork() is defined only for architectures that are not ready
> to use this way and do not define HAVE_COPY_THREAD_TLS. But the function
> is always declared in linux/sched.h.
> 
> This patch hides the declaration when the function is not defined.
> 
> ..
>
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -2618,7 +2618,9 @@ extern int do_execveat(int, struct filename *,
>  		       const char __user * const __user *,
>  		       int);
>  extern long _do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *, unsigned long);
> +#ifndef CONFIG_HAVE_COPY_THREAD_TLS
>  extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *);
> +#endif

Generally we avoid adding such ifdefs.

Downside: a compile-time error is turned into a link-time error.  This
inconveniences a small number of people a small number of times.

Upside: cleaner-looking header files.  This benefits a larger number of
people a larger number of times.

So it's a good tradeoff, I think.

Now there may be some special reason why do_fork() is special.  If so,
you owe us a new changelog ;)


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

end of thread, other threads:[~2015-09-23 20:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-23 11:59 [PATCH 0/2] clone/kprobe: Do not use do_fork() when not defined Petr Mladek
2015-09-23 11:59 ` [PATCH 1/2] clone: Declare do_fork() only when available Petr Mladek
2015-09-23 20:43   ` Andrew Morton
2015-09-23 11:59 ` [PATCH 2/2] kprobe: Use _do_fork() in samples to make them work again Petr Mladek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).