All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>, Anton Arapov <aarapov@redhat.com>,
	David Smith <dsmith@redhat.com>,
	"Frank Ch. Eigler" <fche@redhat.com>,
	Martin Cermak <mcermak@redhat.com>,
	Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 5/5] uprobes: Change uprobe_copy_process() to dup xol_area
Date: Mon, 14 Oct 2013 16:09:42 +0200	[thread overview]
Message-ID: <20131014140942.GI28601@twins.programming.kicks-ass.net> (raw)
In-Reply-To: <20131013191844.GA32502@redhat.com>

On Sun, Oct 13, 2013 at 09:18:44PM +0200, Oleg Nesterov wrote:
> This finally fixes the serious bug in uretprobes: a forked child
> crashes if the parent called fork() with the pending ret probe.
> 
> Trivial test-case:
> 
> 	# perf probe -x /lib/libc.so.6 __fork%return
> 	# perf record -e probe_libc:__fork perl -le 'fork || print "OK"'
> 
> (the child doesn't print "OK", it is killed by SIGSEGV)
> 
> If the child returns from the probed function it actually returns
> to trampoline_vaddr, because it got the copy of parent's stack
> mangled by prepare_uretprobe() when the parent entered this func.
> 
> It crashes because a) this address is not mapped and b) until the
> previous change it doesn't have the proper->return_instances info.
> 
> This means that uprobe_copy_process() has to create xol_area which
> has the trampoline slot, and its vaddr should be equal to parent's
> xol_area->vaddr.
> 
> Unfortunately, uprobe_copy_process() can not simply do
> __create_xol_area(child, xol_area->vaddr). This could actually work
> but perf_event_mmap() doesn't expect the usage of foreign ->mm. So
> we offload this to task_work_run(), and pass the argument via not
> yet used utask->vaddr.
> 
> We know that this vaddr is fine for install_special_mapping(), the
> necessary hole was recently "created" by dup_mmap() which skips the
> parent's VM_DONTCOPY area, and nobody else could use the new mm.
> 
> Unfortunately, this also means that we can not handle the errors
> properly, we obviously can not abort the already completed fork().
> So we simply print the warning if GFP_KERNEL allocation (the only
> possible reason) fails.

Oh cute.. so we could actually ignore this perf_event_mmap() because we
got it for the parent when we inserted the probe, and the perf tools
assume the child mm layout is identical to the parent layout (it doesn't
actually see the VM_DONTCOPY bit).

So we could add: 'if (vma->vm_mm != current->mm) return;' to
perf_event_mmap() with a very big nasty comment.

That said; should we hide the XOL vma from perf altogether? That is; it
will greatly obfuscate the perf data to get hits from the XOL table as
we've got no means of mapping it back to an instruction.

We could transform the perf IP from XOL areas back to the original
instruction site. The only side effect that has is that since the XOL
code is far more expensive than the original single instruction the
instruction appears excessively more expensive than expected.

Thoughts?

  reply	other threads:[~2013-10-14 14:09 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 [this message]
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 ` [PATCH 6/5] uprobes: Teach uprobe_copy_process() to handle CLONE_VFORK Oleg Nesterov

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=20131014140942.GI28601@twins.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --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=oleg@redhat.com \
    --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.