tracing: Integrate similar probe argument parsers
Integrate similar argument parsers for kprobes and uprobes events into traceprobe_parse_probe_arg(). Link: http://lkml.kernel.org/r/154140850016.17322.9836787731210512176.stgit@devbox Reviewed-by: Tom Zanussi <tom.zanussi@linux.intel.com> Tested-by: Tom Zanussi <tom.zanussi@linux.intel.com> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:

committed by
Steven Rostedt (VMware)

parent
faacb361f2
commit
d00bbea945
@@ -348,7 +348,7 @@ static int __parse_bitfield_probe_arg(const char *bf,
|
||||
}
|
||||
|
||||
/* String length checking wrapper */
|
||||
int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
||||
static int traceprobe_parse_probe_arg_body(char *arg, ssize_t *size,
|
||||
struct probe_arg *parg, unsigned int flags)
|
||||
{
|
||||
struct fetch_insn *code, *scode, *tmp = NULL;
|
||||
@@ -491,8 +491,8 @@ fail:
|
||||
}
|
||||
|
||||
/* Return 1 if name is reserved or already used by another argument */
|
||||
int traceprobe_conflict_field_name(const char *name,
|
||||
struct probe_arg *args, int narg)
|
||||
static int traceprobe_conflict_field_name(const char *name,
|
||||
struct probe_arg *args, int narg)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -507,6 +507,47 @@ int traceprobe_conflict_field_name(const char *name,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int traceprobe_parse_probe_arg(struct trace_probe *tp, int i, char *arg,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct probe_arg *parg = &tp->args[i];
|
||||
char *body;
|
||||
int ret;
|
||||
|
||||
/* Increment count for freeing args in error case */
|
||||
tp->nr_args++;
|
||||
|
||||
body = strchr(arg, '=');
|
||||
if (body) {
|
||||
parg->name = kmemdup_nul(arg, body - arg, GFP_KERNEL);
|
||||
body++;
|
||||
} else {
|
||||
/* If argument name is omitted, set "argN" */
|
||||
parg->name = kasprintf(GFP_KERNEL, "arg%d", i + 1);
|
||||
body = arg;
|
||||
}
|
||||
if (!parg->name)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!is_good_name(parg->name)) {
|
||||
pr_info("Invalid argument[%d] name: %s\n",
|
||||
i, parg->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (traceprobe_conflict_field_name(parg->name, tp->args, i)) {
|
||||
pr_info("Argument[%d]: '%s' conflicts with another field.\n",
|
||||
i, parg->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Parse fetch argument */
|
||||
ret = traceprobe_parse_probe_arg_body(body, &tp->size, parg, flags);
|
||||
if (ret)
|
||||
pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void traceprobe_free_probe_arg(struct probe_arg *arg)
|
||||
{
|
||||
struct fetch_insn *code = arg->code;
|
||||
|
Reference in New Issue
Block a user