[PATCH] ftrace: properly merge notrace hash

Andy Chiu posted 1 patch 10 months ago
There is a newer version of this series
kernel/trace/ftrace.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
[PATCH] ftrace: properly merge notrace hash
Posted by Andy Chiu 10 months ago
The global notrace hash should be jointly decided by the intersection of
each subops's notrace hash, but not the filter hash.

Fixes: 5fccc7552ccb ("ftrace: Add subops logic to allow one ops to manage many")
Signed-off-by: Andy Chiu <andybnac@gmail.com>
---
 kernel/trace/ftrace.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 1a48aedb5255..ee662f380b61 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -3526,18 +3526,17 @@ int ftrace_startup_subops(struct ftrace_ops *ops, struct ftrace_ops *subops, int
 	    ftrace_hash_empty(subops->func_hash->notrace_hash)) {
 		notrace_hash = EMPTY_HASH;
 	} else {
-		size_bits = max(ops->func_hash->filter_hash->size_bits,
-				subops->func_hash->filter_hash->size_bits);
+		size_bits = max(ops->func_hash->notrace_hash->size_bits,
+				subops->func_hash->notrace_hash->size_bits);
 		notrace_hash = alloc_ftrace_hash(size_bits);
 		if (!notrace_hash) {
-			free_ftrace_hash(filter_hash);
+			free_ftrace_hash(notrace_hash);
 			return -ENOMEM;
 		}
 
-		ret = intersect_hash(&notrace_hash, ops->func_hash->filter_hash,
-				     subops->func_hash->filter_hash);
+		ret = intersect_hash(&notrace_hash, ops->func_hash->notrace_hash,
+				     subops->func_hash->notrace_hash);
 		if (ret < 0) {
-			free_ftrace_hash(filter_hash);
 			free_ftrace_hash(notrace_hash);
 			return ret;
 		}
-- 
2.39.3 (Apple Git-145)
Re: [PATCH] ftrace: properly merge notrace hash
Posted by Steven Rostedt 10 months ago
On Tue,  8 Apr 2025 02:07:44 +0800
Andy Chiu <andybnac@gmail.com> wrote:

> The global notrace hash should be jointly decided by the intersection of
> each subops's notrace hash, but not the filter hash.
> 
> Fixes: 5fccc7552ccb ("ftrace: Add subops logic to allow one ops to manage many")
> Signed-off-by: Andy Chiu <andybnac@gmail.com>
> ---
>  kernel/trace/ftrace.c | 11 +++++------
>  1 file changed, 5 insertions(+), 6 deletions(-)
> 
> diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> index 1a48aedb5255..ee662f380b61 100644
> --- a/kernel/trace/ftrace.c
> +++ b/kernel/trace/ftrace.c
> @@ -3526,18 +3526,17 @@ int ftrace_startup_subops(struct ftrace_ops *ops, struct ftrace_ops *subops, int
>  	    ftrace_hash_empty(subops->func_hash->notrace_hash)) {
>  		notrace_hash = EMPTY_HASH;
>  	} else {
> -		size_bits = max(ops->func_hash->filter_hash->size_bits,
> -				subops->func_hash->filter_hash->size_bits);
> +		size_bits = max(ops->func_hash->notrace_hash->size_bits,
> +				subops->func_hash->notrace_hash->size_bits);
>  		notrace_hash = alloc_ftrace_hash(size_bits);
>  		if (!notrace_hash) {
> -			free_ftrace_hash(filter_hash);
> +			free_ftrace_hash(notrace_hash);
>  			return -ENOMEM;
>  		}
>  
> -		ret = intersect_hash(&notrace_hash, ops->func_hash->filter_hash,
> -				     subops->func_hash->filter_hash);
> +		ret = intersect_hash(&notrace_hash, ops->func_hash->notrace_hash,
> +				     subops->func_hash->notrace_hash);

Thanks for catching this.


>  		if (ret < 0) {
> -			free_ftrace_hash(filter_hash);

The filter_hash still needs to be freed, as it could have been allocated in
the previous if statement and never used (both the filter_hash and
notrace_hash get used at the end of the function via ftrace_update_ops().

Care to send a v2?

-- Steve


>  			free_ftrace_hash(notrace_hash);
>  			return ret;
>  		}
Re: [PATCH] ftrace: properly merge notrace hash
Posted by Andy Chiu 10 months ago
Steven Rostedt <rostedt@goodmis.org> 於 2025年4月8日 週二 上午4:08寫道:
>
> On Tue,  8 Apr 2025 02:07:44 +0800
> Andy Chiu <andybnac@gmail.com> wrote:
>
> > The global notrace hash should be jointly decided by the intersection of
> > each subops's notrace hash, but not the filter hash.
> >
> > Fixes: 5fccc7552ccb ("ftrace: Add subops logic to allow one ops to manage many")
> > Signed-off-by: Andy Chiu <andybnac@gmail.com>
> > ---
> >  kernel/trace/ftrace.c | 11 +++++------
> >  1 file changed, 5 insertions(+), 6 deletions(-)
> >
> > diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
> > index 1a48aedb5255..ee662f380b61 100644
> > --- a/kernel/trace/ftrace.c
> > +++ b/kernel/trace/ftrace.c
> > @@ -3526,18 +3526,17 @@ int ftrace_startup_subops(struct ftrace_ops *ops, struct ftrace_ops *subops, int
> >           ftrace_hash_empty(subops->func_hash->notrace_hash)) {
> >               notrace_hash = EMPTY_HASH;
> >       } else {
> > -             size_bits = max(ops->func_hash->filter_hash->size_bits,
> > -                             subops->func_hash->filter_hash->size_bits);
> > +             size_bits = max(ops->func_hash->notrace_hash->size_bits,
> > +                             subops->func_hash->notrace_hash->size_bits);
> >               notrace_hash = alloc_ftrace_hash(size_bits);
> >               if (!notrace_hash) {
> > -                     free_ftrace_hash(filter_hash);
> > +                     free_ftrace_hash(notrace_hash);
> >                       return -ENOMEM;
> >               }
> >
> > -             ret = intersect_hash(&notrace_hash, ops->func_hash->filter_hash,
> > -                                  subops->func_hash->filter_hash);
> > +             ret = intersect_hash(&notrace_hash, ops->func_hash->notrace_hash,
> > +                                  subops->func_hash->notrace_hash);
>
> Thanks for catching this.
>
>
> >               if (ret < 0) {
> > -                     free_ftrace_hash(filter_hash);
>
> The filter_hash still needs to be freed, as it could have been allocated in
> the previous if statement and never used (both the filter_hash and
> notrace_hash get used at the end of the function via ftrace_update_ops().
>
> Care to send a v2?

Yes, thanks for reminding! Let me send a v2 with filter_hash freed on
this condition.

Regards,
Andy