All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>,
	Namhyung Kim <namhyung.kim@lge.com>,
	Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
	Hyeoncheol Lee <cheol.lee@lge.com>,
	Hemant Kumar <hkshaw@linux.vnet.ibm.com>,
	LKML <linux-kernel@vger.kernel.org>,
	Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
	"zhangwei(Jovi)" <jovi.zhangwei@huawei.com>,
	Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Subject: Re: [PATCHSET 00/13] tracing/uprobes: Add support for more fetch methods (v6)
Date: Sat, 2 Nov 2013 16:54:58 +0100	[thread overview]
Message-ID: <20131102155458.GA6981@redhat.com> (raw)
In-Reply-To: <1383029621-7384-1-git-send-email-namhyung@kernel.org>

Hello,

Let me first apologize again if this was already discussed. And I also
need to mention that I know almost nothing about elf/randomization/etc.

However,

On 10/29, Namhyung Kim wrote:
>
>   # nm foo | grep -e glob$ -e str -e foo
>   00000000006008bc D foo
>   00000000006008a8 D glob
>   00000000006008ac D str
>
>   # perf probe -x /home/namhyung/tmp/foo -a 'foo=main+0x13 glob=@0x8a8:s32 \

This does not look right to me.

- get_user_vaddr() is costly, it does vma_interval_tree_foreach() under
  ->i_mmap_mutex.

- this only allows to read the data from the same binary.

- in particular, you can't read the data from bss

- get_user_vaddr() looks simply wrong. I blindly applied the whole series
  and did the test to ensure.

  Test-case:

	#include <stdio.h>
	#include <stdlib.h>
	#include <unistd.h>

	unsigned int global = 0x1234;

	void func(void)
	{
	}

	int main(void)
	{
		char cmd[64];

		global = 0x4321;
		func();

		printf("addr = %p\n", &global);

		sprintf(cmd, "cat /proc/%d/maps", getpid());
		system(cmd);

		return 0;
	}

	# nm foo | grep -w global
	0000000000600a04 D global

	# perf probe -x ./foo -a "func var=@0xa04:u32"
	# perf record -e probe_foo:func ./foo
	addr = 0x600a04
	00400000-00401000 r-xp 00000000 fe:01 20958                              /root/foo
	00600000-00601000 rw-p 00000000 fe:01 20958                              /root/foo
	...

	# perf script | tail -1
		foo   555 [000]  1302.345642: probe_foo:func: (40059c) var=1234

	Note that it reports "1234", not "4321". This is because
	get_user_vaddr() finds another (1st) read-only mapping, and
	prints the initial value of "global".

	IOW, it reads the memory from 0x400a04, not from 0x600a04.

-------------------------------------------------------------------------------
Can't we simply implement get_user_vaddr() as

	static void __user *get_user_vaddr(unsigned long addr, struct trace_uprobe *tu)
	{
		void __user *vaddr = (void __force __user *)addr;

		/* A NULL tu means that we already got the vaddr */
		if (tu)
			vaddr += (current->mm->start_data & PAGE_MASK);

		return vaddr;
	}

?

I did this change, and now the test-case above works. And it also works
with "cc -pie -fPIC",

	# nm foo | grep -w global
	0000000000200c9c D global

	# perf probe -x ./foo -a "func var=@0xc9c:u32"
	# perf record -e probe_foo:func ./foo
	...
	# perf script | tail -1
		foo   576 [001]   475.519940: probe_foo:func: (7ffe95ca3814) var=4321

What do you think?

-------------------------------------------------------------------------------
Note:
	- I think that /* A NULL tu means that we already got the vaddr */
	  needs more discussion... IOW, I am not sure about 11/13.

	- Perhaps it also makes sense to allow to pass the absolute address
	  (iow, += start_data should be conditional)

but lets ignore this for now.

Oleg.


  parent reply	other threads:[~2013-11-02 15:53 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-29  6:53 [PATCHSET 00/13] tracing/uprobes: Add support for more fetch methods (v6) Namhyung Kim
2013-10-29  6:53 ` [PATCH 01/13] tracing/uprobes: Fix documentation of uprobe registration syntax Namhyung Kim
2013-10-29  6:53 ` [PATCH 02/13] tracing/probes: Fix basic print type functions Namhyung Kim
2013-10-29  6:53 ` [PATCH 03/13] tracing/kprobes: Move fetch functions to trace_kprobe.c Namhyung Kim
2013-10-29  6:53 ` [PATCH 04/13] tracing/kprobes: Add fetch{,_size} member into deref fetch method Namhyung Kim
2013-10-29  6:53 ` [PATCH 05/13] tracing/kprobes: Staticize stack and memory fetch functions Namhyung Kim
2013-10-29  6:53 ` [PATCH 06/13] tracing/kprobes: Factor out struct trace_probe Namhyung Kim
2013-10-29  6:53 ` [PATCH 07/13] tracing/uprobes: Convert to " Namhyung Kim
2013-10-29  6:53 ` [PATCH 08/13] tracing/kprobes: Move common functions to trace_probe.h Namhyung Kim
2013-10-29  6:53 ` [PATCH 09/13] tracing/kprobes: Integrate duplicate set_print_fmt() Namhyung Kim
2013-10-29  6:53 ` [PATCH 10/13] tracing/uprobes: Fetch args before reserving a ring buffer Namhyung Kim
2013-10-31 18:16   ` Oleg Nesterov
2013-11-01  9:00     ` Namhyung Kim
2013-11-04  8:06     ` Namhyung Kim
2013-11-04 14:35       ` Oleg Nesterov
2013-11-05  1:12         ` Namhyung Kim
2013-11-01 15:09   ` Oleg Nesterov
2013-11-01 15:22     ` Oleg Nesterov
2013-11-03 20:20       ` Oleg Nesterov
2013-11-04  8:11         ` Namhyung Kim
2013-11-04 14:38           ` Oleg Nesterov
2013-11-05  1:17             ` Namhyung Kim
2013-10-29  6:53 ` [PATCH 11/13] tracing/kprobes: Add priv argument to fetch functions Namhyung Kim
2013-11-04 16:09   ` Oleg Nesterov
2013-11-05  2:10     ` Namhyung Kim
2013-10-29  6:53 ` [PATCH 12/13] tracing/uprobes: Add more " Namhyung Kim
2013-10-31 18:22   ` Oleg Nesterov
2013-11-04  8:50     ` Namhyung Kim
2013-11-04 16:44       ` Oleg Nesterov
2013-11-04 17:17         ` Steven Rostedt
2013-11-05  2:19           ` Namhyung Kim
2013-11-05  2:17         ` Namhyung Kim
2013-11-01 17:53   ` Oleg Nesterov
2013-10-29  6:53 ` [PATCH 13/13] tracing/uprobes: Add support for full argument access methods Namhyung Kim
2013-10-30 10:36 ` [PATCHSET 00/13] tracing/uprobes: Add support for more fetch methods (v6) Masami Hiramatsu
2013-11-02 15:54 ` Oleg Nesterov [this message]
2013-11-04  8:46   ` Namhyung Kim
2013-11-04  8:59     ` Namhyung Kim
2013-11-04 15:51       ` Oleg Nesterov
2013-11-04 16:22         ` Oleg Nesterov
2013-11-04 18:47           ` Oleg Nesterov
2013-11-04 18:57             ` Oleg Nesterov
2013-11-05  2:51               ` Namhyung Kim
2013-11-05 16:41                 ` Oleg Nesterov
2013-11-06  8:37                   ` Namhyung Kim
2013-11-05  2:49             ` Namhyung Kim
2013-11-05  6:58             ` Namhyung Kim
2013-11-05 17:45               ` Oleg Nesterov
2013-11-05 19:24                 ` Oleg Nesterov
2013-11-06  8:57                   ` Namhyung Kim
2013-11-06 17:37                     ` Oleg Nesterov
2013-11-06 18:24                       ` Oleg Nesterov
2013-11-07  9:00                         ` Namhyung Kim
2013-11-08 17:00                           ` Oleg Nesterov
2013-11-12  7:49                             ` Namhyung Kim
2013-11-07  8:48                       ` Namhyung Kim
2013-11-09  3:18                         ` Masami Hiramatsu
2013-11-09 15:23                           ` Oleg Nesterov
2013-11-12  8:00                             ` Namhyung Kim
2013-11-12 18:44                               ` Oleg Nesterov
2013-11-25  6:59                               ` Namhyung Kim
2013-11-25 14:12                                 ` [PATCH] uprobes: Allocate ->utask before handler_chain() for tracing handlers Oleg Nesterov
2013-11-06  8:48                 ` [PATCHSET 00/13] tracing/uprobes: Add support for more fetch methods (v6) Namhyung Kim
2013-11-06 16:28                   ` Oleg Nesterov
2013-11-07  7:33                     ` Namhyung Kim
2013-11-08 16:52                       ` Oleg Nesterov
2013-11-05  2:15           ` Namhyung Kim
2013-11-05 16:33             ` Oleg Nesterov
2013-11-06  8:34               ` Namhyung Kim
2013-11-05  1:59         ` Namhyung Kim
2013-11-04 15:01     ` Oleg Nesterov
2013-11-05  1:53       ` Namhyung Kim
2013-11-05 16:28         ` Oleg Nesterov
2013-11-06  8:31           ` Namhyung Kim

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=20131102155458.GA6981@redhat.com \
    --to=oleg@redhat.com \
    --cc=acme@ghostprotocols.net \
    --cc=cheol.lee@lge.com \
    --cc=hkshaw@linux.vnet.ibm.com \
    --cc=jovi.zhangwei@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=namhyung.kim@lge.com \
    --cc=namhyung@kernel.org \
    --cc=rostedt@goodmis.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.