* [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).