linux-trace-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Yordan Karadzhov (VMware)" <y.karadz@gmail.com>
To: Steven Rostedt <rostedt@goodmis.org>, linux-trace-devel@vger.kernel.org
Subject: Re: [PATCH v2 2/4] libtracefs: Implement tracefs_kprobe_raw()
Date: Wed, 30 Jun 2021 22:46:19 +0300	[thread overview]
Message-ID: <83cee0b8-b9c6-849b-291e-b750815de69e@gmail.com> (raw)
In-Reply-To: <20210630154729.129873-3-rostedt@goodmis.org>



On 30.06.21 г. 18:47, Steven Rostedt wrote:
> From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
> 
> Add a function to facilitate creating a kprobe event. It has the "raw" in
> its name because it still requires knowing the format of the kprobe. But
> does handle the kprobe naming better and writing to the kprobe_event file.
> 
> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
> ---
>   include/tracefs.h     |  4 +++
>   src/Makefile          |  1 +
>   src/tracefs-kprobes.c | 70 +++++++++++++++++++++++++++++++++++++++++++
>   3 files changed, 75 insertions(+)
>   create mode 100644 src/tracefs-kprobes.c
> 
> diff --git a/include/tracefs.h b/include/tracefs.h
> index a21d2d2f22a6..bc504bcb0188 100644
> --- a/include/tracefs.h
> +++ b/include/tracefs.h
> @@ -214,4 +214,8 @@ int tracefs_tracer_clear(struct tracefs_instance *instance);
>   ssize_t tracefs_trace_pipe_stream(int fd, struct tracefs_instance *instance, int flags);
>   ssize_t tracefs_trace_pipe_print(struct tracefs_instance *instance, int flags);
>   void tracefs_trace_pipe_stop(struct tracefs_instance *instance);
> +
> +int tracefs_kprobe_raw(const char *system, const char *event,
> +		       const char *addr, const char *format);
> +
>   #endif /* _TRACE_FS_H */
> diff --git a/src/Makefile b/src/Makefile
> index b4cff07efc50..0697a047f4bc 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -8,6 +8,7 @@ OBJS += tracefs-instance.o
>   OBJS += tracefs-events.o
>   OBJS += tracefs-tools.o
>   OBJS += tracefs-marker.o
> +OBJS += tracefs-kprobes.o
>   
>   OBJS := $(OBJS:%.o=$(bdir)/%.o)
>   DEPS := $(OBJS:$(bdir)/%.o=$(bdir)/.%.d)
> diff --git a/src/tracefs-kprobes.c b/src/tracefs-kprobes.c
> new file mode 100644
> index 000000000000..e4b28cff9f08
> --- /dev/null
> +++ b/src/tracefs-kprobes.c
> @@ -0,0 +1,70 @@
> +// SPDX-License-Identifier: LGPL-2.1
> +/*
> + * Copyright (C) 2021 VMware Inc, Steven Rostedt <rostedt@goodmis.org>
> + *
> + * Updates:
> + * Copyright (C) 2021, VMware, Tzvetomir Stoyanov <tz.stoyanov@gmail.com>
> + *
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <dirent.h>
> +#include <unistd.h>
> +#include <errno.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <limits.h>
> +
> +#include "tracefs.h"
> +#include "tracefs-local.h"
> +
> +#define KPROBE_EVENTS "kprobe_events"
> +
> +/**
> + * tracefs_kprobe_raw - Create a kprobe using raw format
> + * @system: The system name (NULL for the default kprobes)
> + * @event: The event to create (NULL to use @addr for the event)
> + * @addr: The function and offset (or address) to insert the probe
> + * @format: The raw format string to define the probe.
> + *
> + * Create a kprobe that will be in the @system group (or kprobes if
> + * @system is NULL). Have the name of @event (or @addr if @event is
> + * NULL). Will be inserted to @addr (function name, with or without
> + * offset, or a address). And the @format will define the raw format
> + * of the kprobe. See the Linux documentation file under:
> + * Documentation/trace/kprobetrace.rst
> + *
> + * Return 0 on success, or -1 on error.
> + *   If the syntex of @format was incorrect, running
> + *   tracefs_error_last(NULL) may show what went wrong.
> + *
> + * errno will be set to EBADMSG if addr or format is NULL.
> + */
> +int tracefs_kprobe_raw(const char *system, const char *event,
> +		       const char *addr, const char *format)
> +{
> +	char *str;
> +	int ret;
> +
> +	errno = EBADMSG;
> +	if (!addr || !format)
> +		return -1;
> +
> +	if (!event)
> +		event = addr;
> +
> +	if (system)
> +		ret = asprintf(&str, "p:%s/%s %s %s\n",
> +			       system, event, addr, format);
> +	else
> +		ret = asprintf(&str, "p:%s %s %s\n",
> +			       event, addr, format);

I wonder what will be the way to register a "return value" ("r:") 
kprobe. Do you consider having a separate API for them?

Thanks!
Yordan

> +
> +	if (ret < 0)
> +		return -1;
> +
> +	ret = tracefs_instance_file_append(NULL, KPROBE_EVENTS, str);
> +	free(str);
> +
> +	return ret < 0 ? ret : 0;
> +}
> 

  reply	other threads:[~2021-06-30 19:46 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-30 15:47 [PATCH v2 0/4] libtracefs: Facilitate adding and removing kprobes Steven Rostedt
2021-06-30 15:47 ` [PATCH v2 1/4] libtracefs: Implement tracefs_instances() Steven Rostedt
2021-06-30 15:47 ` [PATCH v2 2/4] libtracefs: Implement tracefs_kprobe_raw() Steven Rostedt
2021-06-30 19:46   ` Yordan Karadzhov (VMware) [this message]
2021-06-30 19:53     ` Steven Rostedt
2021-06-30 20:05       ` Yordan Karadzhov (VMware)
2021-06-30 15:47 ` [PATCH v2 3/4] libtracefs: Implement tracefs_kprobe_clear() to remove all kprobes Steven Rostedt
2021-06-30 15:47 ` [PATCH v2 4/4] libtracefs: Implement tracefs_kprobe_clear_probe() Steven Rostedt

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=83cee0b8-b9c6-849b-291e-b750815de69e@gmail.com \
    --to=y.karadz@gmail.com \
    --cc=linux-trace-devel@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --subject='Re: [PATCH v2 2/4] libtracefs: Implement tracefs_kprobe_raw()' \
    /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

This is a public inbox, see mirroring instructions
on how to clone and mirror all data and code used for this inbox