From: Steven Rostedt <rostedt@goodmis.org>
To: linux-trace-devel@vger.kernel.org
Cc: Sameeruddin shaik <sameeruddin.shaik8@gmail.com>,
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>
Subject: [PATCH 01/13 v2] libtracefs: An API to set the filtering of functions
Date: Mon, 29 Mar 2021 20:51:24 -0400 [thread overview]
Message-ID: <20210330005247.397966909@goodmis.org> (raw)
In-Reply-To: 20210330005123.151740983@goodmis.org
From: Sameeruddin shaik <sameeruddin.shaik8@gmail.com>
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
Link: https://lore.kernel.org/linux-trace-devel/1616171938-18914-1-git-send-email-sameeruddin.shaik8@gmail.com
Link: https://lore.kernel.org/linux-trace-devel/20210323013224.729594322@goodmis.org
Acked-by: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>
Signed-off-by: Sameeruddin shaik <sameeruddin.shaik8@gmail.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
include/tracefs.h | 3 +-
src/tracefs-tools.c | 111 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 113 insertions(+), 1 deletion(-)
diff --git a/include/tracefs.h b/include/tracefs.h
index 05bd0ef4d404..9477fdb14c5a 100644
--- a/include/tracefs.h
+++ b/include/tracefs.h
@@ -145,5 +145,6 @@ bool tracefs_option_is_enabled(struct tracefs_instance *instance, enum tracefs_o
int tracefs_option_enable(struct tracefs_instance *instance, enum tracefs_option_id id);
int tracefs_option_diasble(struct tracefs_instance *instance, enum tracefs_option_id id);
const char *tracefs_option_name(enum tracefs_option_id id);
-
+int tracefs_function_filter(struct tracefs_instance *instance, const char **filters,
+ const char *module, bool reset, const char ***errs);
#endif /* _TRACE_FS_H */
diff --git a/src/tracefs-tools.c b/src/tracefs-tools.c
index e2dfc7b8acff..4f8bcdc299df 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,113 @@ 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;
+ const char **temp = NULL;
+ const char **e = NULL;
+ char *each_str = NULL;
+ int write_size = 0;
+ int size = 0;
+ int fd = -1;
+ int ret = 0;
+ int j = 0;
+ int i;
+
+ fd = open(filter_path, O_WRONLY | flags);
+ if (fd < 0)
+ return 1;
+
+ for (i = 0; filters[i]; i++) {
+ if (module)
+ write_size = asprintf(&each_str, "%s:mod:%s ", filters[i], module);
+ else
+ write_size = asprintf(&each_str, "%s ", filters[i]);
+ if (write_size < 0) {
+ ret = 1;
+ goto error;
+ }
+ size = write(fd, each_str, write_size);
+ /* compare written bytes*/
+ if (size < write_size) {
+ if (errs) {
+ temp = realloc(e, (j + 1) * (sizeof(char *)));
+ if (!temp) {
+ free(e);
+ ret = 1;
+ goto error;
+ } else
+ e = temp;
+
+ e[j++] = filters[i];
+ ret -= 1;
+ }
+ }
+ free(each_str);
+ each_str = NULL;
+ }
+ if (errs) {
+ temp = realloc(e, (j + 1) * (sizeof(char *)));
+ if (!temp) {
+ free(e);
+ ret = 1;
+ goto error;
+ } else
+ e = temp;
+ e[j] = NULL;
+ *errs = e;
+ }
+ error:
+ if (each_str)
+ free(each_str);
+ 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: A pointer to array of constant strings that will be allocated
+ * on negative return of this function, pointing to the filters that
+ * failed.May be NULL, in which case this field will be ignored.
+ *
+ * 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 @filters. Otherwise, the functions set
+ * by @filters will be appended to the filter file
+ *
+ * returns -x on filter errors (where x is number of failed filter
+ * srtings) and if @errs is not NULL will be an allocated string array
+ * pointing to the strings in @filters that failed and must be freed
+ * with free().
+ *
+ * returns 1 on general errors not realted to setting the filter.
+ * @errs is not set even if supplied.
+ *
+ * return 0 on success and @errs is not set.
+ */
+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)
+ return 1;
+
+ ret = controlled_write(ftrace_filter_path, filters, module, reset, errs);
+ tracefs_put_tracing_file(ftrace_filter_path);
+ return ret;
+}
--
2.30.1
next prev parent reply other threads:[~2021-03-30 0:53 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-30 0:51 [PATCH 00/13 v2] libtracefs: Add tracefs_function_filter() Steven Rostedt
2021-03-30 0:51 ` Steven Rostedt [this message]
2021-03-30 0:51 ` [PATCH 02/13 v2] libtracefs: Document function_filter API Steven Rostedt
2021-03-30 0:51 ` [PATCH 03/13 v2] libtracefs: Fix notations of tracefs_function_filter() and module parameter Steven Rostedt
2021-03-30 0:51 ` [PATCH 04/13 v2] libtracefs: Move opening of file out of controlled_write() Steven Rostedt
2021-03-30 0:51 ` [PATCH 05/13 v2] libtracefs: Add add_errors() helper function for control_write() Steven Rostedt
2021-03-30 0:51 ` [PATCH 06/13 v2] libtracefs: Add checking of available_filter_functions to tracefs_function_filter() Steven Rostedt
2021-03-30 0:51 ` [PATCH 07/13 v2] libtracefs: Add write_filter() helper function Steven Rostedt
2021-03-30 0:51 ` [PATCH 08/13 v2] libtracefs: Allow for setting filters with regex expressions Steven Rostedt
2021-04-01 16:33 ` sameeruddin shaik
2021-03-31 16:39 ` Steven Rostedt
2021-04-02 1:59 ` sameeruddin shaik
2021-04-01 2:41 ` Steven Rostedt
2021-03-30 0:51 ` [PATCH 09/13 v2] libtracefs: Add indexing to set functions in tracefs_function_filter() Steven Rostedt
2021-03-30 0:51 ` [PATCH 10/13 v2] libtracefs: Pass in reset via flags to tracefs_function_filter() Steven Rostedt
2021-03-30 14:29 ` Tzvetomir Stoyanov
2021-03-30 14:53 ` Steven Rostedt
2021-03-30 0:51 ` [PATCH 11/13 v2] libtracefs: Add pthread_mutex_lock() around tracefs_function_filter() Steven Rostedt
2021-03-30 0:51 ` [PATCH 12/13 v2] libtracefs: Move struct tracefs_instance to tracefs-local.h Steven Rostedt
2021-03-30 0:51 ` [PATCH 13/13 v2] libtracefs: Add CONTINUE to tracefs_function_filter() Steven Rostedt
2021-03-30 14:29 ` Tzvetomir Stoyanov
2021-03-30 14:52 ` Steven Rostedt
2021-03-30 15:14 ` Steven Rostedt
2021-03-30 15:32 ` Tzvetomir Stoyanov
2021-03-30 16:03 ` Steven Rostedt
2021-03-30 1:03 ` [RFC][PATCH 14/13 v2] libtracefs: Just past one filter in for tracefs_function_filter() Steven Rostedt
2021-03-30 14:31 ` 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=20210330005247.397966909@goodmis.org \
--to=rostedt@goodmis.org \
--cc=linux-trace-devel@vger.kernel.org \
--cc=sameeruddin.shaik8@gmail.com \
--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).