mirror of
https://github.com/torvalds/linux.git
synced 2026-01-12 00:42:35 +08:00
tracing: uprobe: eprobes: Allocate traceprobe_parse_context per probe
Since traceprobe_parse_context is reusable among a probe arguments, it is more efficient to allocate it outside of the loop for parsing probe argument as kprobe and fprobe events do. Link: https://lore.kernel.org/all/175509541393.193596.16330324746701582114.stgit@devnote2/ Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
This commit is contained in:
@@ -801,25 +801,6 @@ find_and_get_event(const char *system, const char *event_name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int trace_eprobe_tp_update_arg(struct trace_eprobe *ep, const char *argv[], int i)
|
||||
{
|
||||
struct traceprobe_parse_context *ctx __free(traceprobe_parse_context) = NULL;
|
||||
int ret;
|
||||
|
||||
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
ctx->event = ep->event;
|
||||
ctx->flags = TPARG_FL_KERNEL | TPARG_FL_TEVENT;
|
||||
|
||||
ret = traceprobe_parse_probe_arg(&ep->tp, i, argv[i], ctx);
|
||||
/* Handle symbols "@" */
|
||||
if (!ret)
|
||||
ret = traceprobe_update_arg(&ep->tp.args[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int trace_eprobe_parse_filter(struct trace_eprobe *ep, int argc, const char *argv[])
|
||||
{
|
||||
struct event_filter *dummy = NULL;
|
||||
@@ -871,6 +852,7 @@ static int __trace_eprobe_create(int argc, const char *argv[])
|
||||
* Fetch args (no space):
|
||||
* <name>=$<field>[:TYPE]
|
||||
*/
|
||||
struct traceprobe_parse_context *ctx __free(traceprobe_parse_context) = NULL;
|
||||
struct trace_eprobe *ep __free(trace_event_probe_cleanup) = NULL;
|
||||
const char *trlog __free(trace_probe_log_clear) = NULL;
|
||||
const char *event = NULL, *group = EPROBE_EVENT_SYSTEM;
|
||||
@@ -956,11 +938,21 @@ static int __trace_eprobe_create(int argc, const char *argv[])
|
||||
} else
|
||||
ep->filter_str = NULL;
|
||||
|
||||
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
ctx->event = ep->event;
|
||||
ctx->flags = TPARG_FL_KERNEL | TPARG_FL_TEVENT;
|
||||
|
||||
argc -= 2; argv += 2;
|
||||
/* parse arguments */
|
||||
for (i = 0; i < argc; i++) {
|
||||
trace_probe_log_set_index(i + 2);
|
||||
ret = trace_eprobe_tp_update_arg(ep, argv, i);
|
||||
|
||||
ret = traceprobe_parse_probe_arg(&ep->tp, i, argv[i], ctx);
|
||||
/* Handle symbols "@" */
|
||||
if (!ret)
|
||||
ret = traceprobe_update_arg(&ep->tp.args[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -541,6 +541,7 @@ DEFINE_FREE(free_trace_uprobe, struct trace_uprobe *, if (_T) free_trace_uprobe(
|
||||
*/
|
||||
static int __trace_uprobe_create(int argc, const char **argv)
|
||||
{
|
||||
struct traceprobe_parse_context *ctx __free(traceprobe_parse_context) = NULL;
|
||||
struct trace_uprobe *tu __free(free_trace_uprobe) = NULL;
|
||||
const char *trlog __free(trace_probe_log_clear) = NULL;
|
||||
const char *event = NULL, *group = UPROBE_EVENT_SYSTEM;
|
||||
@@ -698,14 +699,13 @@ static int __trace_uprobe_create(int argc, const char **argv)
|
||||
memset(&path, 0, sizeof(path));
|
||||
tu->filename = no_free_ptr(filename);
|
||||
|
||||
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
ctx->flags = (is_return ? TPARG_FL_RETURN : 0) | TPARG_FL_USER;
|
||||
|
||||
/* parse arguments */
|
||||
for (i = 0; i < argc; i++) {
|
||||
struct traceprobe_parse_context *ctx __free(traceprobe_parse_context)
|
||||
= kzalloc(sizeof(*ctx), GFP_KERNEL);
|
||||
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
ctx->flags = (is_return ? TPARG_FL_RETURN : 0) | TPARG_FL_USER;
|
||||
trace_probe_log_set_index(i + 2);
|
||||
ret = traceprobe_parse_probe_arg(&tu->tp, i, argv[i], ctx);
|
||||
if (ret)
|
||||
|
||||
Reference in New Issue
Block a user