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: Sat, 6 Mar 2021 16:50:25 +0530 [thread overview]
Message-ID: <1615029625-9749-1-git-send-email-sameeruddin.shaik8@gmail.com> (raw)
This new API will write the function filters into the
set_ftrace_filter file.
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..2e5d3e3 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 **filters, const char *module, bool reset, const char **errs);
/**
* 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..8311191 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,90 @@ 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 **filters, const char *module, bool reset, const char **errs)
+{
+ int flags = reset ? O_TRUNC : O_APPEND;
+ int write_size;
+ char *each_str;
+ int ret = 0;
+ int j = 0;
+ int size;
+ int slen;
+ int fd;
+ int i;
+
+ fd = open(filter_path, O_WRONLY | flags);
+ if (fd < 0)
+ return -1;
+
+ for (i = 0; filters[i]; i++) {
+ slen = strlen(filters[i]);
+ if (!slen)
+ continue;
+
+ if (module)
+ /* Adding 5 extra bytes for ":mod:"*/
+ 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]);
+
+ size = write(fd, each_str, write_size);
+ /* compare written bytes and also compare the written bytes with difference of added 5 bytes to string for ":mod:"*/
+ if ((size < write_size) && (size < (write_size - 5))) {
+ errs[j++] = filters[i];
+ ret -= 1;
+ }
+ free(each_str);
+ }
+ errs[j] = NULL;
+ close(fd);
+ return ret;
+}
+
+/**
+ * tracefs_function_filter - write to set_ftrace_filter file to trace particular functions
+ * @instance: ftrace instance, can be NULL for top tracing instance
+ * @filters: An array of function names ending with a NULL pointer
+ * @module: Module to be traced
+ * @reset: set to true to reset the file before applying the filter
+ * @errs: An Array of failed function names ending with a NULL pointer
+ *
+ * The @filters is an array of strings, where each string will be used 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 file
+ *
+ * The @errs is an array of strings, where each string is a failed function
+ * name
+ *
+ * returns -x (where x is number of failed filter srtings or it can be
+ * 1 for general errors), or 0 if there are no errors.
+ */
+int tracefs_function_filter(struct tracefs_instance *instance, const char **filters, const char *module, bool reset, const char **errs)
+{
+ char *ftrace_filter_path;
+ int ret = 0;
+
+ if (!filters)
+ return -1;
+
+ ftrace_filter_path = tracefs_instance_get_file(instance, TRACE_FILTER);
+ if (!ftrace_filter_path)
+ goto out;
+
+ ret = controlled_write(ftrace_filter_path, filters, module, reset, errs);
+ out:
+ tracefs_put_tracing_file(ftrace_filter_path);
+ return ret;
+}
--
2.7.4
next reply other threads:[~2021-03-05 11:21 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-06 11:20 Sameeruddin shaik [this message]
2021-03-05 12:20 ` [PATCH] libtracefs: An API to set the filtering of functions 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
-- strict thread matches above, loose matches on Subject: below --
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
2021-03-02 17:15 Sameeruddin shaik
2021-03-01 18:17 ` 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
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=1615029625-9749-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).