From: Oleg Nesterov <oleg@redhat.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: Anton Arapov <aarapov@redhat.com>,
David Smith <dsmith@redhat.com>,
"Frank Ch. Eigler" <fche@redhat.com>,
Martin Cermak <mcermak@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 6/5] uprobes: Teach uprobe_copy_process() to handle CLONE_VFORK
Date: Wed, 16 Oct 2013 19:39:37 +0200 [thread overview]
Message-ID: <20131016173937.GB31347@redhat.com> (raw)
In-Reply-To: <20131013191815.GA32466@redhat.com>
uprobe_copy_process() does nothing if the child shares ->mm with
the forking process, but there is a special case: CLONE_VFORK.
In this case it would be more correct to do dup_utask() but avoid
dup_xol(). This is not that important, the child should not unwind
its stack too much, this can corrupt the parent's stack, but at
least we need this to allow to ret-probe __vfork() itself.
Note: in theory, it would be better to check task_pt_regs(p)->sp
instead of CLONE_VFORK, we need to dup_utask() if and only if the
child can return from the function called by the parent. But this
needs the arch-dependant helper, and I think that nobody actually
does clone(same_stack, CLONE_VM).
Cc: stable@vger.kernel.org # 3.9+
Reported-by: Martin Cermak <mcermak@redhat.com>
Reported-by: David Smith <dsmith@redhat.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
include/linux/uprobes.h | 4 ++--
kernel/events/uprobes.c | 10 ++++++++--
kernel/fork.c | 2 +-
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h
index 06f28be..13a7f13 100644
--- a/include/linux/uprobes.h
+++ b/include/linux/uprobes.h
@@ -117,7 +117,7 @@ extern void uprobe_start_dup_mmap(void);
extern void uprobe_end_dup_mmap(void);
extern void uprobe_dup_mmap(struct mm_struct *oldmm, struct mm_struct *newmm);
extern void uprobe_free_utask(struct task_struct *t);
-extern void uprobe_copy_process(struct task_struct *t);
+extern void uprobe_copy_process(struct task_struct *t, unsigned long flags);
extern unsigned long __weak uprobe_get_swbp_addr(struct pt_regs *regs);
extern int uprobe_post_sstep_notifier(struct pt_regs *regs);
extern int uprobe_pre_sstep_notifier(struct pt_regs *regs);
@@ -174,7 +174,7 @@ static inline unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
static inline void uprobe_free_utask(struct task_struct *t)
{
}
-static inline void uprobe_copy_process(struct task_struct *t)
+static inline void uprobe_copy_process(struct task_struct *t, unsigned long flags)
{
}
static inline void uprobe_clear_state(struct mm_struct *mm)
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 0c5d9d4..a18dcb6 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -1415,7 +1415,7 @@ static void dup_xol_work(struct callback_head *work)
/*
* Called in context of a new clone/fork from copy_process.
*/
-void uprobe_copy_process(struct task_struct *t)
+void uprobe_copy_process(struct task_struct *t, unsigned long flags)
{
struct uprobe_task *utask = current->utask;
struct mm_struct *mm = current->mm;
@@ -1423,12 +1423,18 @@ void uprobe_copy_process(struct task_struct *t)
t->utask = NULL;
- if (mm == t->mm || !utask || !utask->return_instances)
+ if (!utask || !utask->return_instances)
+ return;
+
+ if (mm == t->mm && !(flags & CLONE_VFORK))
return;
if (dup_utask(t, utask))
return uprobe_warn(t, "dup ret instances");
+ if (mm == t->mm)
+ return;
+
/* TODO: move it into the union in uprobe_task */
work = kmalloc(sizeof(*work), GFP_KERNEL);
if (!work)
diff --git a/kernel/fork.c b/kernel/fork.c
index d3603b8..8531609 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1489,7 +1489,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
perf_event_fork(p);
trace_task_newtask(p, clone_flags);
- uprobe_copy_process(p);
+ uprobe_copy_process(p, clone_flags);
return p;
--
1.5.5.1
prev parent reply other threads:[~2013-10-16 17:46 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-13 19:18 [PATCH 0/5] uprobes: fix fork() with the pending ret-probe(s) Oleg Nesterov
2013-10-13 19:18 ` [PATCH 1/5] uprobes: Change the callsite of uprobe_copy_process() Oleg Nesterov
2013-10-16 12:37 ` Srikar Dronamraju
2013-10-13 19:18 ` [PATCH 2/5] uprobes: Introduce __create_xol_area() Oleg Nesterov
2013-10-16 12:41 ` Srikar Dronamraju
2013-10-16 12:50 ` Srikar Dronamraju
2013-10-13 19:18 ` [PATCH 3/5] uprobes: Teach __create_xol_area() to accept the predefined vaddr Oleg Nesterov
2013-10-16 12:43 ` Srikar Dronamraju
2013-10-13 19:18 ` [PATCH 4/5] uprobes: Change uprobe_copy_process() to dup return_instances Oleg Nesterov
2013-10-14 18:45 ` Peter Zijlstra
2013-10-14 19:00 ` Oleg Nesterov
2013-10-16 12:47 ` Srikar Dronamraju
2013-10-13 19:18 ` [PATCH 5/5] uprobes: Change uprobe_copy_process() to dup xol_area Oleg Nesterov
2013-10-14 14:09 ` Peter Zijlstra
2013-10-14 14:55 ` Oleg Nesterov
2013-10-14 15:47 ` Peter Zijlstra
2013-10-16 12:53 ` Srikar Dronamraju
2013-10-16 16:09 ` Oleg Nesterov
2013-10-18 15:49 ` Oleg Nesterov
2013-10-14 18:29 ` [PATCH 0/5] uprobes: fix fork() with the pending ret-probe(s) Oleg Nesterov
2013-10-16 17:38 ` Oleg Nesterov
2013-10-16 17:39 ` Oleg Nesterov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131016173937.GB31347@redhat.com \
--to=oleg@redhat.com \
--cc=aarapov@redhat.com \
--cc=dsmith@redhat.com \
--cc=fche@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mcermak@redhat.com \
--cc=mingo@elte.hu \
--cc=peterz@infradead.org \
--cc=srikar@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.