From: Sameeruddin shaik <sameeruddin.shaik8@gmail.com>
To: rostedt@goodmis.org
Cc: linux-trace-devel@vger.kernel.org,
Sameeruddin shaik <sameeruddin.shaik8@gmail.com>
Subject: [PATCH] libtracefs: An API to set the filtering of functions
Date: Tue, 2 Mar 2021 22:45:10 +0530 [thread overview]
Message-ID: <1614705310-5887-1-git-send-email-sameeruddin.shaik8@gmail.com> (raw)
This new API will write the function filters into the
set_ftrace_filter file, it will write only string as of now, it can't
handle kernel glob or regular expressions.
tracefs_function_filter()
https://bugzilla.kernel.org/show_bug.cgi?id=210643
Signed-off-by: Sameeruddin shaik <sameeruddin.shaik8@gmail.com>
diff --git a/include/tracefs.h b/include/tracefs.h
index f3eec62..b5259f9 100644
--- a/include/tracefs.h
+++ b/include/tracefs.h
@@ -50,6 +50,7 @@ int tracefs_trace_on(struct tracefs_instance *instance);
int tracefs_trace_off(struct tracefs_instance *instance);
int tracefs_trace_on_fd(int fd);
int tracefs_trace_off_fd(int fd);
+int tracefs_function_filter(struct tracefs_instance *instance, const char * const *filters, const char *module, bool reset);
/**
* tracefs_trace_on_get_fd - Get a file descriptor of "tracing_on" in given instance
diff --git a/src/tracefs-tools.c b/src/tracefs-tools.c
index e2dfc7b..b8d8c99 100644
--- a/src/tracefs-tools.c
+++ b/src/tracefs-tools.c
@@ -18,6 +18,7 @@
#include "tracefs-local.h"
#define TRACE_CTRL "tracing_on"
+#define TRACE_FILTER "set_ftrace_filter"
static const char * const options_map[] = {
"unknown",
@@ -387,3 +388,85 @@ void tracefs_option_clear(struct tracefs_options_mask *options, enum tracefs_opt
if (options && id > TRACEFS_OPTION_INVALID)
options->mask &= ~(1ULL << (id - 1));
}
+
+static int controlled_write(const char *filter_path, const char * const *filters, const char *module, bool reset)
+{
+ int write_size;
+ char *each_str;
+ int size = 0;
+ int slen;
+ int fd;
+ int i;
+
+
+ if (!filters)
+ return -1;
+ if (reset)
+ fd = open(filter_path, O_WRONLY | O_TRUNC);
+ else
+ fd = open(filter_path, O_WRONLY | O_APPEND);
+ if (fd < 0)
+ return -1;
+ for (i = 0; filters[i] != NULL ; i++) {
+ slen = 0;
+ slen = strlen(*(filters + i));
+ if (slen < 0)
+ continue;
+
+ if (module)
+ slen += strlen(module) + 5;
+ /* Adding 2 extra byte for the space and '\0' at the end*/
+ slen += 2;
+ each_str = calloc(1, slen);
+ if (!each_str)
+ return -1;
+ if (module)
+ write_size = snprintf(each_str, slen, "%s:mod:%s ", *(filters + i), module);
+ else
+ write_size = snprintf(each_str, slen, "%s ", *(filters + i));
+ if (write_size < (slen - 1)) {
+ free(each_str);
+ continue;
+ }
+ size += write(fd, each_str, write_size);
+ free(each_str);
+ }
+ close(fd);
+ return size;
+}
+
+/**
+ * tracefs_function_filter - write to set_ftrace_filter file to trace particular functions
+ * @instance: ftrace instance, can be NULL for top tracing instance
+ * @filter: An array of function names ending with a NULL pointer
+ * @module: Module Name to be traced
+ * @reset: set to true to reset the file before applying the filter
+ *
+ * The @filter is an array of strings, where each string will be use to set
+ * a function or functions to be traced.
+ *
+ * If @reset is true, then all functions in the filter are cleared before
+ * adding functions from @filter. Otherwise, the functions set by @filter
+ * will be appended to the filter
+ *
+ * Returns the number of bytes written into the filter file or -1 if
+ * there is any error in writing to filter file
+ */
+int tracefs_function_filter(struct tracefs_instance *instance, const char * const *filters, const char *module, bool reset)
+{
+ char *ftrace_filter_path;
+ int ret;
+
+ if (!filters)
+ return -1;
+ ftrace_filter_path = tracefs_instance_get_file(instance, TRACE_FILTER);
+
+ if (!ftrace_filter_path)
+ goto gracefully_free;
+
+ ret = controlled_write(ftrace_filter_path, filters, module, reset);
+
+ gracefully_free:
+ tracefs_put_tracing_file(ftrace_filter_path);
+ return ret;
+}
--
2.7.4
next reply other threads:[~2021-03-01 17:19 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-02 17:15 Sameeruddin shaik [this message]
2021-03-01 18:17 ` [PATCH] libtracefs: An API to set the filtering of functions Steven Rostedt
2021-03-02 4:21 ` Tzvetomir Stoyanov
2021-03-02 5:14 ` Sameeruddin Shaik
2021-03-02 13:15 ` Steven Rostedt
2021-03-03 1:16 ` Sameeruddin Shaik
2021-03-02 1:28 ` Steven Rostedt
2021-03-04 8:59 ` Tzvetomir Stoyanov
2021-03-04 9:43 ` Sameeruddin Shaik
-- strict thread matches above, loose matches on Subject: below --
2021-03-06 11:20 Sameeruddin shaik
2021-03-05 12:20 ` Tzvetomir Stoyanov
2021-03-05 14:39 ` Steven Rostedt
2021-03-05 14:54 ` Steven Rostedt
2021-03-06 1:55 ` Sameeruddin Shaik
2021-03-06 3:39 ` Steven Rostedt
2021-03-06 4:29 ` Sameeruddin Shaik
2021-03-06 5:19 ` Steven Rostedt
2021-03-06 15:05 ` Steven Rostedt
2021-03-08 23:53 ` Sameeruddin Shaik
2021-03-10 16:21 Sameeruddin shaik
2021-03-10 5:28 ` Tzvetomir Stoyanov
2021-03-10 16:51 ` Sameeruddin Shaik
2021-03-10 5:28 ` Tzvetomir Stoyanov
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=1614705310-5887-1-git-send-email-sameeruddin.shaik8@gmail.com \
--to=sameeruddin.shaik8@gmail.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
/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).