From: Yordan Karadzhov <y.karadz@gmail.com>
To: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>,
rostedt@goodmis.org
Cc: linux-trace-devel@vger.kernel.org
Subject: Re: [PATCH v4 08/10] libtracefs: Use the internal dynamic events API when creating synthetic events
Date: Thu, 4 Nov 2021 14:47:34 +0200 [thread overview]
Message-ID: <256b3fba-49a1-3082-608a-53c9d35f8757@gmail.com> (raw)
In-Reply-To: <20211104111047.302660-9-tz.stoyanov@gmail.com>
On 4.11.21 г. 13:10, Tzvetomir Stoyanov (VMware) wrote:
> Synthetic events are type of ftrace dynamic events. The tracefs library
> has dedicated APIs to manage dynamic events of all types. In order the
> code to be consistent, the creation of synthetic events inside the
> library is reimplemented with these new dynamic events APIs.
>
> Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com>
> ---
> src/tracefs-hist.c | 103 +++++++++++++++++++++------------------------
> 1 file changed, 47 insertions(+), 56 deletions(-)
>
> diff --git a/src/tracefs-hist.c b/src/tracefs-hist.c
> index 9009dba..08bb2da 100644
> --- a/src/tracefs-hist.c
> +++ b/src/tracefs-hist.c
> @@ -661,6 +661,7 @@ struct tracefs_synth {
> struct tep_event *end_event;
> struct action *actions;
> struct action **next_action;
> + struct tracefs_dynevent *dyn_event;
> char *name;
> char **synthetic_fields;
> char **synthetic_args;
> @@ -719,6 +720,7 @@ void tracefs_synth_free(struct tracefs_synth *synth)
> synth->actions = action->next;
> action_free(action);
> }
> + tracefs_dynevent_free(synth->dyn_event);
>
> free(synth);
> }
> @@ -889,6 +891,28 @@ synth_init_from(struct tep_handle *tep, const char *start_system,
> return synth;
> }
>
> +static int alloc_synthetic_event(struct tracefs_synth *synth)
> +{
> + char *synthetic_format;
> + const char *field;
> + int i;
> +
> + synthetic_format = strdup("");
> + if (!synthetic_format)
> + return -1;
> +
> + for (i = 0; synth->synthetic_fields && synth->synthetic_fields[i]; i++) {
> + field = synth->synthetic_fields[i];
> + synthetic_format = append_string(synthetic_format, " ", field);
> + }
> +
> + synth->dyn_event = dynevent_alloc(TRACEFS_DYNEVENT_SYNTH, NULL,
> + synth->name, NULL, synthetic_format);
> + free(synthetic_format);
> +
> + return synth->dyn_event ? 0 : -1;
> +}
> +
> /**
> * tracefs_synth_alloc - create a new tracefs_synth instance
> * @tep: The tep handle that holds the events to work on
> @@ -1609,38 +1633,6 @@ int tracefs_synth_save(struct tracefs_synth *synth,
> return 0;
> }
>
> -static char *create_synthetic_event(struct tracefs_synth *synth)
> -{
> - char *synthetic_event;
> - const char *field;
> - int i;
> -
> - synthetic_event = strdup(synth->name);
> - if (!synthetic_event)
> - return NULL;
> -
> - for (i = 0; synth->synthetic_fields && synth->synthetic_fields[i]; i++) {
> - field = synth->synthetic_fields[i];
> - synthetic_event = append_string(synthetic_event, " ", field);
> - }
> -
> - return synthetic_event;
> -}
> -
> -static int remove_synthetic(const char *synthetic)
> -{
> - char *str;
> - int ret;
> -
> - ret = asprintf(&str, "!%s", synthetic);
> - if (ret < 0)
> - return -1;
> -
> - ret = tracefs_instance_file_append(NULL, "synthetic_events", str);
> - free(str);
> - return ret < 0 ? -1 : 0;
> -}
> -
> static int remove_hist(struct tracefs_instance *instance,
> struct tep_event *event, const char *hist)
> {
> @@ -1919,7 +1911,6 @@ tracefs_synth_get_start_hist(struct tracefs_synth *synth)
> int tracefs_synth_create(struct tracefs_instance *instance,
I wonder is it really necessary this function to take 'tracefs_instance' as argument?
I remember from conversations with Steven that setting the histograms/triggers in the top instance will have the same
effect. Or maybe I am wrong? The same question applies for the 'destroy' API.
Thanks!
Yordan
> struct tracefs_synth *synth)
> {
> - char *synthetic_event;
> char *start_hist = NULL;
> char *end_hist = NULL;
> int ret;
> @@ -1937,14 +1928,10 @@ int tracefs_synth_create(struct tracefs_instance *instance,
> if (verify_state(synth) < 0)
> return -1;
>
> - synthetic_event = create_synthetic_event(synth);
> - if (!synthetic_event)
> + if (!synth->dyn_event && alloc_synthetic_event(synth))
> + return -1;
> + if (!tracefs_dynevent_create(synth->dyn_event))
> return -1;
> -
> - ret = tracefs_instance_file_append(NULL, "synthetic_events",
> - synthetic_event);
> - if (ret < 0)
> - goto free_synthetic;
>
> start_hist = create_hist(synth->start_keys, synth->start_vars);
> start_hist = append_filter(start_hist, synth->start_filter,
> @@ -1980,9 +1967,7 @@ int tracefs_synth_create(struct tracefs_instance *instance,
> remove_synthetic:
> free(end_hist);
> free(start_hist);
> - remove_synthetic(synthetic_event);
> - free_synthetic:
> - free(synthetic_event);
> + tracefs_dynevent_destroy(synth->dyn_event, false);
> return -1;
> }
>
> @@ -2007,7 +1992,6 @@ int tracefs_synth_create(struct tracefs_instance *instance,
> int tracefs_synth_destroy(struct tracefs_instance *instance,
> struct tracefs_synth *synth)
> {
> - char *synthetic_event;
> char *hist;
> int ret;
>
> @@ -2041,11 +2025,7 @@ int tracefs_synth_destroy(struct tracefs_instance *instance,
> ret = remove_hist(instance, synth->start_event, hist);
> free(hist);
>
> - synthetic_event = create_synthetic_event(synth);
> - if (!synthetic_event)
> - return -1;
> -
> - ret = remove_synthetic(synthetic_event);
> + ret = tracefs_dynevent_destroy(synth->dyn_event, false);
>
> return ret ? -1 : 0;
> }
> @@ -2067,7 +2047,7 @@ int tracefs_synth_show(struct trace_seq *seq,
> struct tracefs_instance *instance,
> struct tracefs_synth *synth)
> {
> - char *synthetic_event = NULL;
> + bool new_event = false;
> char *hist = NULL;
> char *path;
> int ret = -1;
> @@ -2082,16 +2062,19 @@ int tracefs_synth_show(struct trace_seq *seq,
> return -1;
> }
>
> - synthetic_event = create_synthetic_event(synth);
> - if (!synthetic_event)
> - return -1;
> + if (!synth->dyn_event) {
> + if (alloc_synthetic_event(synth))
> + return -1;
> + new_event = true;
> + }
>
> path = trace_find_tracing_dir();
> if (!path)
> goto out_free;
>
> - trace_seq_printf(seq, "echo '%s' > %s/synthetic_events\n",
> - synthetic_event, path);
> + trace_seq_printf(seq, "echo '%s%s %s' > %s/%s\n",
> + synth->dyn_event->prefix, synth->dyn_event->event,
> + synth->dyn_event->format, path, synth->dyn_event->trace_file);
>
> tracefs_put_tracing_file(path);
> path = tracefs_instance_get_dir(instance);
> @@ -2116,10 +2099,18 @@ int tracefs_synth_show(struct trace_seq *seq,
> hist, path, synth->end_event->system,
> synth->end_event->name);
>
> + if (new_event) {
> + tracefs_dynevent_free(synth->dyn_event);
> + synth->dyn_event = NULL;
> + }
> +
> ret = 0;
> out_free:
> - free(synthetic_event);
> free(hist);
> tracefs_put_tracing_file(path);
> + if (new_event) {
> + tracefs_dynevent_free(synth->dyn_event);
> + synth->dyn_event = NULL;
> + }
> return ret;
> }
>
next prev parent reply other threads:[~2021-11-04 12:47 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-04 11:10 [PATCH v4 00/10] libtracefs dynamic events support Tzvetomir Stoyanov (VMware)
2021-11-04 11:10 ` [PATCH v4 01/10] libtracefs: New APIs for dynamic events Tzvetomir Stoyanov (VMware)
2021-11-04 13:58 ` Steven Rostedt
2021-11-04 14:37 ` Steven Rostedt
2021-11-04 14:54 ` Steven Rostedt
2021-11-04 11:10 ` [PATCH v4 02/10] libtracefs: New APIs for kprobe allocation Tzvetomir Stoyanov (VMware)
2021-11-04 16:29 ` Steven Rostedt
2021-11-04 11:10 ` [PATCH v4 03/10] libtracefs: Remove redundant kprobes APIs Tzvetomir Stoyanov (VMware)
2021-11-04 11:10 ` [PATCH v4 04/10] libtracefs: Change tracefs_kprobe_info API Tzvetomir Stoyanov (VMware)
2021-11-04 16:33 ` Steven Rostedt
2021-11-04 17:28 ` Tzvetomir Stoyanov
2021-11-04 17:57 ` Steven Rostedt
2021-11-04 11:10 ` [PATCH v4 05/10] libtracefs: Reimplement kprobe raw APIs Tzvetomir Stoyanov (VMware)
2021-11-04 11:10 ` [PATCH v4 06/10] libtracefs: Extend kprobes unit test Tzvetomir Stoyanov (VMware)
2021-11-04 11:10 ` [PATCH v4 07/10] libtracefs: Rename tracefs_synth_init API Tzvetomir Stoyanov (VMware)
2021-11-04 11:10 ` [PATCH v4 08/10] libtracefs: Use the internal dynamic events API when creating synthetic events Tzvetomir Stoyanov (VMware)
2021-11-04 12:47 ` Yordan Karadzhov [this message]
2021-11-04 13:21 ` Steven Rostedt
2021-11-04 17:13 ` Steven Rostedt
2021-11-05 12:15 ` Tzvetomir Stoyanov
2021-11-05 12:33 ` Steven Rostedt
2021-11-04 11:10 ` [PATCH v4 09/10] libtracefs: Update kprobes man pages Tzvetomir Stoyanov (VMware)
2021-11-04 20:28 ` Steven Rostedt
2021-11-04 11:10 ` [PATCH v4 10/10] libtracefs: Document dynamic events APIs Tzvetomir Stoyanov (VMware)
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=256b3fba-49a1-3082-608a-53c9d35f8757@gmail.com \
--to=y.karadz@gmail.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=tz.stoyanov@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).