linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Thinker Li <thinker.li@gmail.com>
To: kernel test robot <lkp@intel.com>
Cc: oe-kbuild-all@lists.linux.dev,
	 Linux Memory Management List <linux-mm@kvack.org>,
	Martin KaFai Lau <martin.lau@kernel.org>,
	sinquersw@gmail.com
Subject: Re: [linux-next:master 5519/11156] kernel/bpf/bpf_struct_ops.c:247:16: warning: bitwise operation between different enumeration types ('enum bpf_type_flag' and 'enum bpf_reg_type')
Date: Thu, 29 Feb 2024 13:07:15 -0800	[thread overview]
Message-ID: <CAFVMQ6QYvHfc_=cpOddWgoWDTRt3GHG5+LLB3NoFFRRiCMWDLw@mail.gmail.com> (raw)
In-Reply-To: <202403010423.0vNdUDBW-lkp@intel.com>

[-- Attachment #1: Type: text/plain, Size: 16507 bytes --]

I am checking it.

On Thu, Feb 29, 2024 at 12:32 PM kernel test robot <lkp@intel.com> wrote:

> tree:
> https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> head:   f303a3e2bcfba900efb5aee55236d17030e9f882
> commit: 1611603537a4b88cec7993f32b70c03113801a46 [5519/11156] bpf: Create
> argument information for nullable arguments.
> config: s390-randconfig-r133-20240229 (
> https://download.01.org/0day-ci/archive/20240301/202403010423.0vNdUDBW-lkp@intel.com/config
> )
> compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project
> edd4aee4dd9b5b98b2576a6f783e4086173d902a)
> reproduce: (
> https://download.01.org/0day-ci/archive/20240301/202403010423.0vNdUDBW-lkp@intel.com/reproduce
> )
>
> If you fix the issue in a separate patch/commit (i.e. not just a new
> version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes:
> https://lore.kernel.org/oe-kbuild-all/202403010423.0vNdUDBW-lkp@intel.com/
>
> All warnings (new ones prefixed by >>):
>
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~~~~
>    include/linux/bpf.h:778:47: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum
> bpf_return_type') [-Wenum-enum-conversion]
>      778 |         RET_PTR_TO_TCP_SOCK_OR_NULL     = PTR_MAYBE_NULL |
> RET_PTR_TO_TCP_SOCK,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~~~~~~
>    include/linux/bpf.h:779:50: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum
> bpf_return_type') [-Wenum-enum-conversion]
>      779 |         RET_PTR_TO_SOCK_COMMON_OR_NULL  = PTR_MAYBE_NULL |
> RET_PTR_TO_SOCK_COMMON,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~~~~~~~~~
>    include/linux/bpf.h:781:49: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum
> bpf_return_type') [-Wenum-enum-conversion]
>      781 |         RET_PTR_TO_DYNPTR_MEM_OR_NULL   = PTR_MAYBE_NULL |
> RET_PTR_TO_MEM,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~
>    include/linux/bpf.h:782:45: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum
> bpf_return_type') [-Wenum-enum-conversion]
>      782 |         RET_PTR_TO_BTF_ID_OR_NULL       = PTR_MAYBE_NULL |
> RET_PTR_TO_BTF_ID,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~~~~
>    include/linux/bpf.h:783:43: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum
> bpf_return_type') [-Wenum-enum-conversion]
>      783 |         RET_PTR_TO_BTF_ID_TRUSTED       = PTR_TRUSTED    |
> RET_PTR_TO_BTF_ID,
>          |                                           ~~~~~~~~~~~    ^
> ~~~~~~~~~~~~~~~~~
>    include/linux/bpf.h:894:44: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum bpf_reg_type')
> [-Wenum-enum-conversion]
>      894 |         PTR_TO_MAP_VALUE_OR_NULL        = PTR_MAYBE_NULL |
> PTR_TO_MAP_VALUE,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~~~
>    include/linux/bpf.h:895:42: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum bpf_reg_type')
> [-Wenum-enum-conversion]
>      895 |         PTR_TO_SOCKET_OR_NULL           = PTR_MAYBE_NULL |
> PTR_TO_SOCKET,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~
>    include/linux/bpf.h:896:46: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum bpf_reg_type')
> [-Wenum-enum-conversion]
>      896 |         PTR_TO_SOCK_COMMON_OR_NULL      = PTR_MAYBE_NULL |
> PTR_TO_SOCK_COMMON,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~~~~~
>    include/linux/bpf.h:897:44: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum bpf_reg_type')
> [-Wenum-enum-conversion]
>      897 |         PTR_TO_TCP_SOCK_OR_NULL         = PTR_MAYBE_NULL |
> PTR_TO_TCP_SOCK,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~~~
>    include/linux/bpf.h:898:42: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum bpf_reg_type')
> [-Wenum-enum-conversion]
>      898 |         PTR_TO_BTF_ID_OR_NULL           = PTR_MAYBE_NULL |
> PTR_TO_BTF_ID,
>          |                                           ~~~~~~~~~~~~~~ ^
> ~~~~~~~~~~~~~
>    In file included from kernel/bpf/bpf_struct_ops.c:5:
>    In file included from include/linux/bpf_verifier.h:9:
>    In file included from include/linux/filter.h:12:
>    In file included from include/linux/skbuff.h:28:
>    In file included from include/linux/dma-mapping.h:11:
>    In file included from include/linux/scatterlist.h:9:
>    In file included from arch/s390/include/asm/io.h:78:
>    include/asm-generic/io.h:547:31: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      547 |         val = __raw_readb(PCI_IOBASE + addr);
>          |                           ~~~~~~~~~~ ^
>    include/asm-generic/io.h:560:61: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      560 |         val = __le16_to_cpu((__le16
> __force)__raw_readw(PCI_IOBASE + addr));
>          |
>  ~~~~~~~~~~ ^
>    include/uapi/linux/byteorder/big_endian.h:37:59: note: expanded from
> macro '__le16_to_cpu'
>       37 | #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x))
>          |                                                           ^
>    include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16'
>      102 | #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x))
>          |                                                      ^
>    In file included from kernel/bpf/bpf_struct_ops.c:5:
>    In file included from include/linux/bpf_verifier.h:9:
>    In file included from include/linux/filter.h:12:
>    In file included from include/linux/skbuff.h:28:
>    In file included from include/linux/dma-mapping.h:11:
>    In file included from include/linux/scatterlist.h:9:
>    In file included from arch/s390/include/asm/io.h:78:
>    include/asm-generic/io.h:573:61: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      573 |         val = __le32_to_cpu((__le32
> __force)__raw_readl(PCI_IOBASE + addr));
>          |
>  ~~~~~~~~~~ ^
>    include/uapi/linux/byteorder/big_endian.h:35:59: note: expanded from
> macro '__le32_to_cpu'
>       35 | #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x))
>          |                                                           ^
>    include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32'
>      115 | #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x))
>          |                                                      ^
>    In file included from kernel/bpf/bpf_struct_ops.c:5:
>    In file included from include/linux/bpf_verifier.h:9:
>    In file included from include/linux/filter.h:12:
>    In file included from include/linux/skbuff.h:28:
>    In file included from include/linux/dma-mapping.h:11:
>    In file included from include/linux/scatterlist.h:9:
>    In file included from arch/s390/include/asm/io.h:78:
>    include/asm-generic/io.h:584:33: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      584 |         __raw_writeb(value, PCI_IOBASE + addr);
>          |                             ~~~~~~~~~~ ^
>    include/asm-generic/io.h:594:59: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      594 |         __raw_writew((u16 __force)cpu_to_le16(value),
> PCI_IOBASE + addr);
>          |
>  ~~~~~~~~~~ ^
>    include/asm-generic/io.h:604:59: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      604 |         __raw_writel((u32 __force)cpu_to_le32(value),
> PCI_IOBASE + addr);
>          |
>  ~~~~~~~~~~ ^
>    include/asm-generic/io.h:692:20: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      692 |         readsb(PCI_IOBASE + addr, buffer, count);
>          |                ~~~~~~~~~~ ^
>    include/asm-generic/io.h:700:20: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      700 |         readsw(PCI_IOBASE + addr, buffer, count);
>          |                ~~~~~~~~~~ ^
>    include/asm-generic/io.h:708:20: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      708 |         readsl(PCI_IOBASE + addr, buffer, count);
>          |                ~~~~~~~~~~ ^
>    include/asm-generic/io.h:717:21: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      717 |         writesb(PCI_IOBASE + addr, buffer, count);
>          |                 ~~~~~~~~~~ ^
>    include/asm-generic/io.h:726:21: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      726 |         writesw(PCI_IOBASE + addr, buffer, count);
>          |                 ~~~~~~~~~~ ^
>    include/asm-generic/io.h:735:21: warning: performing pointer arithmetic
> on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
>      735 |         writesl(PCI_IOBASE + addr, buffer, count);
>          |                 ~~~~~~~~~~ ^
> >> kernel/bpf/bpf_struct_ops.c:247:16: warning: bitwise operation between
> different enumeration types ('enum bpf_type_flag' and 'enum bpf_reg_type')
> [-Wenum-enum-conversion]
>      247 |                         PTR_TRUSTED | PTR_TO_BTF_ID |
> PTR_MAYBE_NULL;
>          |                         ~~~~~~~~~~~ ^ ~~~~~~~~~~~~~
>    38 warnings generated.
>
>
> vim +247 kernel/bpf/bpf_struct_ops.c
>
>    153
>    154  /* Prepare argument info for every nullable argument of a member
> of a
>    155   * struct_ops type.
>    156   *
>    157   * Initialize a struct bpf_struct_ops_arg_info according to type
> info of
>    158   * the arguments of a stub function. (Check kCFI for more
> information about
>    159   * stub functions.)
>    160   *
>    161   * Each member in the struct_ops type has a struct
> bpf_struct_ops_arg_info
>    162   * to provide an array of struct bpf_ctx_arg_aux, which in turn
> provides
>    163   * the information that used by the verifier to check the
> arguments of the
>    164   * BPF struct_ops program assigned to the member. Here, we only
> care about
>    165   * the arguments that are marked as __nullable.
>    166   *
>    167   * The array of struct bpf_ctx_arg_aux is eventually assigned to
>    168   * prog->aux->ctx_arg_info of BPF struct_ops programs and passed
> to the
>    169   * verifier. (See check_struct_ops_btf_id())
>    170   *
>    171   * arg_info->info will be the list of struct bpf_ctx_arg_aux if
> success. If
>    172   * fails, it will be kept untouched.
>    173   */
>    174  static int prepare_arg_info(struct btf *btf,
>    175                              const char *st_ops_name,
>    176                              const char *member_name,
>    177                              const struct btf_type *func_proto,
>    178                              struct bpf_struct_ops_arg_info
> *arg_info)
>    179  {
>    180          const struct btf_type *stub_func_proto, *pointed_type;
>    181          const struct btf_param *stub_args, *args;
>    182          struct bpf_ctx_arg_aux *info, *info_buf;
>    183          u32 nargs, arg_no, info_cnt = 0;
>    184          u32 arg_btf_id;
>    185          int offset;
>    186
>    187          stub_func_proto = find_stub_func_proto(btf, st_ops_name,
> member_name);
>    188          if (!stub_func_proto)
>    189                  return 0;
>    190
>    191          /* Check if the number of arguments of the stub function
> is the same
>    192           * as the number of arguments of the function pointer.
>    193           */
>    194          nargs = btf_type_vlen(func_proto);
>    195          if (nargs != btf_type_vlen(stub_func_proto)) {
>    196                  pr_warn("the number of arguments of the stub
> function %s__%s does not match the number of arguments of the member %s of
> struct %s\n",
>    197                          st_ops_name, member_name, member_name,
> st_ops_name);
>    198                  return -EINVAL;
>    199          }
>    200
>    201          if (!nargs)
>    202                  return 0;
>    203
>    204          args = btf_params(func_proto);
>    205          stub_args = btf_params(stub_func_proto);
>    206
>    207          info_buf = kcalloc(nargs, sizeof(*info_buf), GFP_KERNEL);
>    208          if (!info_buf)
>    209                  return -ENOMEM;
>    210
>    211          /* Prepare info for every nullable argument */
>    212          info = info_buf;
>    213          for (arg_no = 0; arg_no < nargs; arg_no++) {
>    214                  /* Skip arguments that is not suffixed with
>    215                   * "__nullable".
>    216                   */
>    217                  if (!btf_param_match_suffix(btf,
> &stub_args[arg_no],
>    218                                              MAYBE_NULL_SUFFIX))
>    219                          continue;
>    220
>    221                  /* Should be a pointer to struct */
>    222                  pointed_type = btf_type_resolve_ptr(btf,
>    223
> args[arg_no].type,
>    224                                                      &arg_btf_id);
>    225                  if (!pointed_type ||
>    226                      !btf_type_is_struct(pointed_type)) {
>    227                          pr_warn("stub function %s__%s has %s
> tagging to an unsupported type\n",
>    228                                  st_ops_name, member_name,
> MAYBE_NULL_SUFFIX);
>    229                          goto err_out;
>    230                  }
>    231
>    232                  offset = btf_ctx_arg_offset(btf, func_proto,
> arg_no);
>    233                  if (offset < 0) {
>    234                          pr_warn("stub function %s__%s has an
> invalid trampoline ctx offset for arg#%u\n",
>    235                                  st_ops_name, member_name, arg_no);
>    236                          goto err_out;
>    237                  }
>    238
>    239                  if (args[arg_no].type != stub_args[arg_no].type) {
>    240                          pr_warn("arg#%u type in stub function
> %s__%s does not match with its original func_proto\n",
>    241                                  arg_no, st_ops_name, member_name);
>    242                          goto err_out;
>    243                  }
>    244
>    245                  /* Fill the information of the new argument */
>    246                  info->reg_type =
>  > 247                          PTR_TRUSTED | PTR_TO_BTF_ID |
> PTR_MAYBE_NULL;
>    248                  info->btf_id = arg_btf_id;
>    249                  info->btf = btf;
>    250                  info->offset = offset;
>    251
>    252                  info++;
>    253                  info_cnt++;
>    254          }
>    255
>    256          if (info_cnt) {
>    257                  arg_info->info = info_buf;
>    258                  arg_info->cnt = info_cnt;
>    259          } else {
>    260                  kfree(info_buf);
>    261          }
>    262
>    263          return 0;
>    264
>    265  err_out:
>    266          kfree(info_buf);
>    267
>    268          return -EINVAL;
>    269  }
>    270
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki
>

[-- Attachment #2: Type: text/html, Size: 20401 bytes --]

  reply	other threads:[~2024-02-29 21:07 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-29 20:31 kernel test robot
2024-02-29 21:07 ` Thinker Li [this message]
2024-03-01 18:25   ` Kui-Feng Lee
2024-03-01 18:27     ` Alexei Starovoitov
2024-03-02 18:09       ` Yonghong Song

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAFVMQ6QYvHfc_=cpOddWgoWDTRt3GHG5+LLB3NoFFRRiCMWDLw@mail.gmail.com' \
    --to=thinker.li@gmail.com \
    --cc=linux-mm@kvack.org \
    --cc=lkp@intel.com \
    --cc=martin.lau@kernel.org \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=sinquersw@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox