On Sun, 25 Oct 2026 17:38:05 +0900
"Masami Hiramatsu (Google)" <[email protected]> wrote:

> From: Masami Hiramatsu (Google) <[email protected]>
> 
> In calc_stack(), when encountering '||' or '&&' (where str[i+1] == str[i]),
> the loop sets 'is_pred = false' and continues without advancing 'i' past
> the second character of the operator. On the next iteration, the second '|'
> or '&' sees str[i+1] != str[i], breaks out of the switch statement, and is
> counted as the start of a new predicate (incrementing nr_preds and setting
> is_pred = true).
> 
> Consequently, a trailing logical operator (e.g. 'common_pid == 1 ||') is
> counted as having 2 predicates instead of 1, and any subsequent non-space
> character before a delimiter fails to increment nr_preds.

 "common_pid ||' is an invalid expression.

> 
> Increment 'i' when matching '||' or '&&' so the entire two-character
> operator is skipped.

This is just wrong.

Masami, don't blindly trust AI.

I purposely did it this way. Because && and || creates a new predicate.

 If you have "x||y"
              ^
              i

 Start with i = 0; is_pred = false; nr_preds = 0;

   str[i] == 'x'
   if (!is_pred) {
        nr_preds++;  // nr_preds = 1
        is_pred = true;
   }

 in for loop i++;  // i = 1; str[i] = '|'

   switch (str[i])
   case '|':
      if (str[i+1] != str[i]) // false
      is_pred = false;
      continue;

 in for loop i++; // i = 2; str[i] == '|';

   switch (str[i])
   case '|':
      if (str[i+1] != str[i]) // true
          break;

   if (!is_pred) {
        nr_preds++;  // nr_preds = 2
        is_pred = true;
   }

 in for loop i++; // i = 3; str[i] == 'y';
 
   if (!is_pred) { // false because is_pred == true

Loop ends.

nr_preds == 2. This is correct.

This patch is garbage.

-- Stevwe



> 
> Fixes: 80765597bc58 ("tracing: Rewrite filter logic to be simpler and faster")
> Cc: [email protected]
> Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
> ---
>  kernel/trace/trace_events_filter.c |    1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/kernel/trace/trace_events_filter.c 
> b/kernel/trace/trace_events_filter.c
> index 3bd0b47a627f..bcd37fd6c109 100644
> --- a/kernel/trace/trace_events_filter.c
> +++ b/kernel/trace/trace_events_filter.c
> @@ -2208,6 +2208,7 @@ static int calc_stack(const char *str, int *parens, int 
> *preds, int *err)
>               case '&':
>                       if (str[i+1] != str[i])
>                               break;
> +                     i++;
>                       is_pred = false;
>                       continue;
>               case '(':


Reply via email to