diff options
Diffstat (limited to 'kernel/tracepoint.c')
| -rw-r--r-- | kernel/tracepoint.c | 21 | 
1 files changed, 13 insertions, 8 deletions
| diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index 0c05a459204..29f26540e9c 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c @@ -112,7 +112,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry,  	int nr_probes = 0;  	struct tracepoint_func *old, *new; -	WARN_ON(!probe); +	if (WARN_ON(!probe)) +		return ERR_PTR(-EINVAL);  	debug_print_probes(entry);  	old = entry->funcs; @@ -152,13 +153,18 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry,  	debug_print_probes(entry);  	/* (N -> M), (N > 1, M >= 0) probes */ -	for (nr_probes = 0; old[nr_probes].func; nr_probes++) { -		if (!probe || -		    (old[nr_probes].func == probe && -		     old[nr_probes].data == data)) -			nr_del++; +	if (probe) { +		for (nr_probes = 0; old[nr_probes].func; nr_probes++) { +			if (old[nr_probes].func == probe && +			     old[nr_probes].data == data) +				nr_del++; +		}  	} +	/* +	 * If probe is NULL, then nr_probes = nr_del = 0, and then the +	 * entire entry will be removed. +	 */  	if (nr_probes - nr_del == 0) {  		/* N -> 0, (N > 1) */  		entry->funcs = NULL; @@ -173,8 +179,7 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry,  		if (new == NULL)  			return ERR_PTR(-ENOMEM);  		for (i = 0; old[i].func; i++) -			if (probe && -			    (old[i].func != probe || old[i].data != data)) +			if (old[i].func != probe || old[i].data != data)  				new[j++] = old[i];  		new[nr_probes - nr_del].func = NULL;  		entry->refcount = nr_probes - nr_del; | 
