• Jose E. Marchesi's avatar
    bpf: make list_for_each_entry portable · ba39486d
    Jose E. Marchesi authored
    [Changes from V1:
    - The __compat_break has been abandoned in favor of
      a more readable can_loop macro that can be used anywhere, including
      loop conditions.]
    
    The macro list_for_each_entry is defined in bpf_arena_list.h as
    follows:
    
      #define list_for_each_entry(pos, head, member)				\
    	for (void * ___tmp = (pos = list_entry_safe((head)->first,		\
    						    typeof(*(pos)), member),	\
    			      (void *)0);					\
    	     pos && ({ ___tmp = (void *)pos->member.next; 1; });		\
    	     cond_break,							\
    	     pos = list_entry_safe((void __arena *)___tmp, typeof(*(pos)), member))
    
    The macro cond_break, in turn, expands to a statement expression that
    contains a `break' statement.  Compound statement expressions, and the
    subsequent ability of placing statements in the header of a `for'
    loop, are GNU extensions.
    
    Unfortunately, clang implements this GNU extension differently than
    GCC:
    
    - In GCC the `break' statement is bound to the containing "breakable"
      context in which the defining `for' appears.  If there is no such
      context, GCC emits a warning: break statement without enclosing `for'
      o `switch' statement.
    
    - In clang the `break' statement is bound to the defining `for'.  If
      the defining `for' is itself inside some breakable construct, then
      clang emits a -Wgcc-compat warning.
    
    This patch adds a new macro can_loop to bpf_experimental, that
    implements the same logic than cond_break but evaluates to a boolean
    expression.  The patch also changes all the current instances of usage
    of cond_break withing the header of loop accordingly.
    
    Tested in bpf-next master.
    No regressions.
    Signed-off-by: default avatarJose E. Marchesi <jose.marchesi@oracle.com>
    Cc: david.faust@oracle.com
    Cc: cupertino.miranda@oracle.com
    Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
    Link: https://lore.kernel.org/r/20240511212243.23477-1-jose.marchesi@oracle.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    ba39486d
arena_list.c 1.67 KB