All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <songliubraving@fb.com>, <linux-kernel@vger.kernel.org>,
	<kernel-team@fb.com>, Masami Hiramatsu <mhiramat@kernel.org>,
	Oleg Nesterov <oleg@redhat.com>,
	Srikar Dronamraju <srikar@linux.vnet.ibm.com>,
	"Naveen N . Rao" <naveen.n.rao@linux.vnet.ibm.com>
Subject: Re: [PATCH RESEND] trace_uprobe: support reference counter in fd-based uprobe
Date: Wed, 26 Sep 2018 12:06:23 -0400	[thread overview]
Message-ID: <20180926120623.7cbf2003@vmware.local.home> (raw)
In-Reply-To: <20180924211236.4149482-1-songliubraving@fb.com>

On Mon, 24 Sep 2018 14:12:36 -0700
Song Liu <songliubraving@fb.com> wrote:

> This patch enables uprobes with reference counter in fd-based uprobe.
> Highest 40 bits of perf_event_attr.config is used to stored offset
> of the reference counter (semaphore).
> 
> Format information in /sys/bus/event_source/devices/uprobe/format/ is
> updated to reflect this new feature.
> 
> Signed-off-by: Song Liu <songliubraving@fb.com>
> Reviewed-and-tested-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
> Cc: Masami Hiramatsu <mhiramat@kernel.org>
> Cc: Oleg Nesterov <oleg@redhat.com>
> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
> Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
> Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
> ---
>  include/linux/trace_events.h    |  3 +-
>  kernel/events/core.c            | 49 ++++++++++++++++++++++++++-------
>  kernel/trace/trace_event_perf.c |  7 +++--

Peter,

This is based off of some uprobe code in my tree (which I just finished
testing and need to push to linux-next). But can you give an ack to the
perf parts?

Thanks!

-- Steve


>  kernel/trace/trace_probe.h      |  3 +-
>  kernel/trace/trace_uprobe.c     |  4 ++-
>  5 files changed, 50 insertions(+), 16 deletions(-)
> 
> diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
> index 78a010e19ed4..4130a5497d40 100644
> --- a/include/linux/trace_events.h
> +++ b/include/linux/trace_events.h
> @@ -575,7 +575,8 @@ extern int bpf_get_kprobe_info(const struct perf_event *event,
>  			       bool perf_type_tracepoint);
>  #endif
>  #ifdef CONFIG_UPROBE_EVENTS
> -extern int  perf_uprobe_init(struct perf_event *event, bool is_retprobe);
> +extern int  perf_uprobe_init(struct perf_event *event,
> +			     unsigned long ref_ctr_offset, bool is_retprobe);
>  extern void perf_uprobe_destroy(struct perf_event *event);
>  extern int bpf_get_uprobe_info(const struct perf_event *event,
>  			       u32 *fd_type, const char **filename,
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index c80549bf82c6..a4ad5235ec9b 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -8368,30 +8368,39 @@ static struct pmu perf_tracepoint = {
>   *
>   * PERF_PROBE_CONFIG_IS_RETPROBE if set, create kretprobe/uretprobe
>   *                               if not set, create kprobe/uprobe
> + *
> + * The following values specify a reference counter (or semaphore in the
> + * terminology of tools like dtrace, systemtap, etc.) Userspace Statically
> + * Defined Tracepoints (USDT). Currently, we use 40 bit for the offset.
> + *
> + * PERF_UPROBE_REF_CTR_OFFSET_BITS	# of bits in config as th offset
> + * PERF_UPROBE_REF_CTR_OFFSET_SHIFT	# of bits to shift left
>   */
>  enum perf_probe_config {
>  	PERF_PROBE_CONFIG_IS_RETPROBE = 1U << 0,  /* [k,u]retprobe */
> +	PERF_UPROBE_REF_CTR_OFFSET_BITS = 40,
> +	PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 64 - PERF_UPROBE_REF_CTR_OFFSET_BITS,
>  };
> 
>  PMU_FORMAT_ATTR(retprobe, "config:0");
> +#endif
> 
> -static struct attribute *probe_attrs[] = {
> +#ifdef CONFIG_KPROBE_EVENTS
> +static struct attribute *kprobe_attrs[] = {
>  	&format_attr_retprobe.attr,
>  	NULL,
>  };
> 
> -static struct attribute_group probe_format_group = {
> +static struct attribute_group kprobe_format_group = {
>  	.name = "format",
> -	.attrs = probe_attrs,
> +	.attrs = kprobe_attrs,
>  };
> 
> -static const struct attribute_group *probe_attr_groups[] = {
> -	&probe_format_group,
> +static const struct attribute_group *kprobe_attr_groups[] = {
> +	&kprobe_format_group,
>  	NULL,
>  };
> -#endif
> 
> -#ifdef CONFIG_KPROBE_EVENTS
>  static int perf_kprobe_event_init(struct perf_event *event);
>  static struct pmu perf_kprobe = {
>  	.task_ctx_nr	= perf_sw_context,
> @@ -8401,7 +8410,7 @@ static struct pmu perf_kprobe = {
>  	.start		= perf_swevent_start,
>  	.stop		= perf_swevent_stop,
>  	.read		= perf_swevent_read,
> -	.attr_groups	= probe_attr_groups,
> +	.attr_groups	= kprobe_attr_groups,
>  };
> 
>  static int perf_kprobe_event_init(struct perf_event *event)
> @@ -8433,6 +8442,24 @@ static int perf_kprobe_event_init(struct perf_event *event)
>  #endif /* CONFIG_KPROBE_EVENTS */
> 
>  #ifdef CONFIG_UPROBE_EVENTS
> +PMU_FORMAT_ATTR(ref_ctr_offset, "config:63-24");
> +
> +static struct attribute *uprobe_attrs[] = {
> +	&format_attr_retprobe.attr,
> +	&format_attr_ref_ctr_offset.attr,
> +	NULL,
> +};
> +
> +static struct attribute_group uprobe_format_group = {
> +	.name = "format",
> +	.attrs = uprobe_attrs,
> +};
> +
> +static const struct attribute_group *uprobe_attr_groups[] = {
> +	&uprobe_format_group,
> +	NULL,
> +};
> +
>  static int perf_uprobe_event_init(struct perf_event *event);
>  static struct pmu perf_uprobe = {
>  	.task_ctx_nr	= perf_sw_context,
> @@ -8442,12 +8469,13 @@ static struct pmu perf_uprobe = {
>  	.start		= perf_swevent_start,
>  	.stop		= perf_swevent_stop,
>  	.read		= perf_swevent_read,
> -	.attr_groups	= probe_attr_groups,
> +	.attr_groups	= uprobe_attr_groups,
>  };
> 
>  static int perf_uprobe_event_init(struct perf_event *event)
>  {
>  	int err;
> +	unsigned long ref_ctr_offset;
>  	bool is_retprobe;
> 
>  	if (event->attr.type != perf_uprobe.type)
> @@ -8463,7 +8491,8 @@ static int perf_uprobe_event_init(struct perf_event *event)
>  		return -EOPNOTSUPP;
> 
>  	is_retprobe = event->attr.config & PERF_PROBE_CONFIG_IS_RETPROBE;
> -	err = perf_uprobe_init(event, is_retprobe);
> +	ref_ctr_offset = event->attr.config >> PERF_UPROBE_REF_CTR_OFFSET_SHIFT;
> +	err = perf_uprobe_init(event, ref_ctr_offset, is_retprobe);
>  	if (err)
>  		return err;
> 
> diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
> index 69a3fe926e8c..76217bbef815 100644
> --- a/kernel/trace/trace_event_perf.c
> +++ b/kernel/trace/trace_event_perf.c
> @@ -290,7 +290,8 @@ void perf_kprobe_destroy(struct perf_event *p_event)
>  #endif /* CONFIG_KPROBE_EVENTS */
> 
>  #ifdef CONFIG_UPROBE_EVENTS
> -int perf_uprobe_init(struct perf_event *p_event, bool is_retprobe)
> +int perf_uprobe_init(struct perf_event *p_event,
> +		     unsigned long ref_ctr_offset, bool is_retprobe)
>  {
>  	int ret;
>  	char *path = NULL;
> @@ -312,8 +313,8 @@ int perf_uprobe_init(struct perf_event *p_event, bool is_retprobe)
>  		goto out;
>  	}
> 
> -	tp_event = create_local_trace_uprobe(
> -		path, p_event->attr.probe_offset, is_retprobe);
> +	tp_event = create_local_trace_uprobe(path, p_event->attr.probe_offset,
> +					     ref_ctr_offset, is_retprobe);
>  	if (IS_ERR(tp_event)) {
>  		ret = PTR_ERR(tp_event);
>  		goto out;
> diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h
> index 5f52668e165d..03b10f3201a5 100644
> --- a/kernel/trace/trace_probe.h
> +++ b/kernel/trace/trace_probe.h
> @@ -412,6 +412,7 @@ create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
>  extern void destroy_local_trace_kprobe(struct trace_event_call *event_call);
> 
>  extern struct trace_event_call *
> -create_local_trace_uprobe(char *name, unsigned long offs, bool is_return);
> +create_local_trace_uprobe(char *name, unsigned long offs,
> +			  unsigned long ref_ctr_offset, bool is_return);
>  extern void destroy_local_trace_uprobe(struct trace_event_call *event_call);
>  #endif
> diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
> index 3a7c73c40007..d09638706fe0 100644
> --- a/kernel/trace/trace_uprobe.c
> +++ b/kernel/trace/trace_uprobe.c
> @@ -1405,7 +1405,8 @@ static int unregister_uprobe_event(struct trace_uprobe *tu)
> 
>  #ifdef CONFIG_PERF_EVENTS
>  struct trace_event_call *
> -create_local_trace_uprobe(char *name, unsigned long offs, bool is_return)
> +create_local_trace_uprobe(char *name, unsigned long offs,
> +			  unsigned long ref_ctr_offset, bool is_return)
>  {
>  	struct trace_uprobe *tu;
>  	struct path path;
> @@ -1437,6 +1438,7 @@ create_local_trace_uprobe(char *name, unsigned long offs, bool is_return)
> 
>  	tu->offset = offs;
>  	tu->path = path;
> +	tu->ref_ctr_offset = ref_ctr_offset;
>  	tu->filename = kstrdup(name, GFP_KERNEL);
>  	init_trace_event_call(tu, &tu->tp.call);
> 
> --
> 2.17.1


  parent reply	other threads:[~2018-09-26 16:06 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-24 21:12 [PATCH RESEND] trace_uprobe: support reference counter in fd-based uprobe Song Liu
2018-09-25  6:26 ` kbuild test robot
2018-09-25 14:46   ` Song Liu
2018-09-26 16:06 ` Steven Rostedt [this message]
2018-09-28  7:18   ` Peter Zijlstra
2018-09-28  7:23 ` Song Liu
2018-09-28  7:52   ` Peter Zijlstra
2018-09-28 14:50     ` Song Liu

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=20180926120623.7cbf2003@vmware.local.home \
    --to=rostedt@goodmis.org \
    --cc=kernel-team@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=naveen.n.rao@linux.vnet.ibm.com \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=songliubraving@fb.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.