Skip to content

Commit 5949574

Browse files
FlorentRevestrostedt
authored andcommitted
ftrace: Let unregister_ftrace_direct_multi() call ftrace_free_filter()
A common pattern when using the ftrace_direct_multi API is to unregister the ops and also immediately free its filter. We've noticed it's very easy for users to miss calling ftrace_free_filter(). This adds a "free_filters" argument to unregister_ftrace_direct_multi() to both remind the user they should free filters and also to make their life easier. Link: https://lkml.kernel.org/r/[email protected] Suggested-by: Steven Rostedt <[email protected]> Signed-off-by: Florent Revest <[email protected]> Acked-by: Mark Rutland <[email protected]> Acked-by: Jiri Olsa <[email protected]> Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent e8d018d commit 5949574

File tree

5 files changed

+12
-8
lines changed

5 files changed

+12
-8
lines changed

include/linux/ftrace.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@ int ftrace_modify_direct_caller(struct ftrace_func_entry *entry,
407407
unsigned long new_addr);
408408
unsigned long ftrace_find_rec_direct(unsigned long ip);
409409
int register_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr);
410-
int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr);
410+
int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr,
411+
bool free_filters);
411412
int modify_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr);
412413
int modify_ftrace_direct_multi_nolock(struct ftrace_ops *ops, unsigned long addr);
413414

@@ -446,7 +447,8 @@ static inline int register_ftrace_direct_multi(struct ftrace_ops *ops, unsigned
446447
{
447448
return -ENODEV;
448449
}
449-
static inline int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr)
450+
static inline int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr,
451+
bool free_filters)
450452
{
451453
return -ENODEV;
452454
}

kernel/bpf/trampoline.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ static int unregister_fentry(struct bpf_trampoline *tr, void *old_addr)
198198
int ret;
199199

200200
if (tr->func.ftrace_managed)
201-
ret = unregister_ftrace_direct_multi(tr->fops, (long)old_addr);
201+
ret = unregister_ftrace_direct_multi(tr->fops, (long)old_addr, false);
202202
else
203203
ret = bpf_arch_text_poke(ip, BPF_MOD_CALL, old_addr, NULL);
204204

kernel/trace/ftrace.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5805,7 +5805,8 @@ EXPORT_SYMBOL_GPL(register_ftrace_direct_multi);
58055805
* 0 on success
58065806
* -EINVAL - The @ops object was not properly registered.
58075807
*/
5808-
int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr)
5808+
int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr,
5809+
bool free_filters)
58095810
{
58105811
struct ftrace_hash *hash = ops->func_hash->filter_hash;
58115812
int err;
@@ -5823,6 +5824,9 @@ int unregister_ftrace_direct_multi(struct ftrace_ops *ops, unsigned long addr)
58235824
/* cleanup for possible another register call */
58245825
ops->func = NULL;
58255826
ops->trampoline = 0;
5827+
5828+
if (free_filters)
5829+
ftrace_free_filter(ops);
58265830
return err;
58275831
}
58285832
EXPORT_SYMBOL_GPL(unregister_ftrace_direct_multi);

samples/ftrace/ftrace-direct-multi-modify.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ static int __init ftrace_direct_multi_init(void)
151151
static void __exit ftrace_direct_multi_exit(void)
152152
{
153153
kthread_stop(simple_tsk);
154-
unregister_ftrace_direct_multi(&direct, my_tramp);
155-
ftrace_free_filter(&direct);
154+
unregister_ftrace_direct_multi(&direct, my_tramp, true);
156155
}
157156

158157
module_init(ftrace_direct_multi_init);

samples/ftrace/ftrace-direct-multi.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ static int __init ftrace_direct_multi_init(void)
7878

7979
static void __exit ftrace_direct_multi_exit(void)
8080
{
81-
unregister_ftrace_direct_multi(&direct, (unsigned long) my_tramp);
82-
ftrace_free_filter(&direct);
81+
unregister_ftrace_direct_multi(&direct, (unsigned long) my_tramp, true);
8382
}
8483

8584
module_init(ftrace_direct_multi_init);

0 commit comments

Comments
 (0)