diff options
Diffstat (limited to 'tools/perf/util/probe-event.c')
| -rw-r--r-- | tools/perf/util/probe-event.c | 30 | 
1 files changed, 21 insertions, 9 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 16822a8a540f..1a5b7fa459b2 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -53,6 +53,8 @@  bool probe_event_dry_run;	/* Dry run flag */  struct probe_conf probe_conf = { .magic_num = DEFAULT_PROBE_MAGIC_NUM }; +static char *synthesize_perf_probe_point(struct perf_probe_point *pp); +  #define semantic_error(msg ...) pr_err("Semantic error :" msg)  int e_snprintf(char *str, size_t size, const char *format, ...) @@ -961,8 +963,9 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,  	debuginfo__delete(dinfo);  	if (ntevs == 0)	{	/* No error but failed to find probe point. */ -		pr_warning("Probe point '%s' not found.\n", -			   synthesize_perf_probe_point(&pev->point)); +		char *probe_point = synthesize_perf_probe_point(&pev->point); +		pr_warning("Probe point '%s' not found.\n", probe_point); +		free(probe_point);  		return -ENODEV;  	} else if (ntevs < 0) {  		/* Error path : ntevs < 0 */ @@ -2009,7 +2012,7 @@ out:  }  /* Compose only probe point (not argument) */ -char *synthesize_perf_probe_point(struct perf_probe_point *pp) +static char *synthesize_perf_probe_point(struct perf_probe_point *pp)  {  	struct strbuf buf;  	char *tmp, *ret = NULL; @@ -2062,14 +2065,18 @@ char *synthesize_perf_probe_command(struct perf_probe_event *pev)  			goto out;  	tmp = synthesize_perf_probe_point(&pev->point); -	if (!tmp || strbuf_addstr(&buf, tmp) < 0) +	if (!tmp || strbuf_addstr(&buf, tmp) < 0) { +		free(tmp);  		goto out; +	}  	free(tmp);  	for (i = 0; i < pev->nargs; i++) {  		tmp = synthesize_perf_probe_arg(pev->args + i); -		if (!tmp || strbuf_addf(&buf, " %s", tmp) < 0) +		if (!tmp || strbuf_addf(&buf, " %s", tmp) < 0) { +			free(tmp);  			goto out; +		}  		free(tmp);  	} @@ -2800,13 +2807,18 @@ static void warn_uprobe_event_compat(struct probe_trace_event *tev)  	if (!tev->uprobes || tev->nargs == 0 || !buf)  		goto out; -	for (i = 0; i < tev->nargs; i++) -		if (strglobmatch(tev->args[i].value, "[$@+-]*")) { -			pr_warning("Please upgrade your kernel to at least " -				   "3.14 to have access to feature %s\n", +	for (i = 0; i < tev->nargs; i++) { +		if (strchr(tev->args[i].value, '@')) { +			pr_warning("%s accesses a variable by symbol name, but that is not supported for user application probe.\n",  				   tev->args[i].value);  			break;  		} +		if (strglobmatch(tev->args[i].value, "[$+-]*")) { +			pr_warning("Please upgrade your kernel to at least 3.14 to have access to feature %s\n", +				   tev->args[i].value); +			break; +		} +	}  out:  	free(buf);  }  |