kernel/bpf/helpers.c:1960:13: sparse: sparse: Using plain integer as NULL pointer

From: kernel test robot
Date: Sun Nov 19 2023 - 04:48:49 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 037266a5f7239ead1530266f7d7af153d2a867fa
commit: c3c510ce431cd99fa10dcd50d995c8e89330ee5b bpf: Add 'owner' field to bpf_{list,rb}_node
date: 4 months ago
config: hexagon-randconfig-r121-20231119 (https://download.01.org/0day-ci/archive/20231119/202311191708.PLWPE6Tr-lkp@xxxxxxxxx/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce: (https://download.01.org/0day-ci/archive/20231119/202311191708.PLWPE6Tr-lkp@xxxxxxxxx/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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311191708.PLWPE6Tr-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
>> kernel/bpf/helpers.c:1960:13: sparse: sparse: Using plain integer as NULL pointer
kernel/bpf/helpers.c:2059:13: sparse: sparse: Using plain integer as NULL pointer
kernel/bpf/helpers.c: note: in included file (through include/linux/mmzone.h, include/linux/gfp.h, include/linux/umh.h, include/linux/kmod.h, ...):
include/linux/page-flags.h:240:46: sparse: sparse: self-comparison always evaluates to false
kernel/bpf/helpers.c:2419:18: sparse: sparse: context imbalance in 'bpf_rcu_read_lock' - wrong count at exit
kernel/bpf/helpers.c:2424:18: sparse: sparse: context imbalance in 'bpf_rcu_read_unlock' - unexpected unlock

vim +1960 kernel/bpf/helpers.c

1944
1945 static int __bpf_list_add(struct bpf_list_node_kern *node,
1946 struct bpf_list_head *head,
1947 bool tail, struct btf_record *rec, u64 off)
1948 {
1949 struct list_head *n = &node->list_head, *h = (void *)head;
1950
1951 /* If list_head was 0-initialized by map, bpf_obj_init_field wasn't
1952 * called on its fields, so init here
1953 */
1954 if (unlikely(!h->next))
1955 INIT_LIST_HEAD(h);
1956
1957 /* node->owner != NULL implies !list_empty(n), no need to separately
1958 * check the latter
1959 */
> 1960 if (cmpxchg(&node->owner, NULL, BPF_PTR_POISON)) {
1961 /* Only called from BPF prog, no need to migrate_disable */
1962 __bpf_obj_drop_impl((void *)n - off, rec);
1963 return -EINVAL;
1964 }
1965
1966 tail ? list_add_tail(n, h) : list_add(n, h);
1967 WRITE_ONCE(node->owner, head);
1968
1969 return 0;
1970 }
1971

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki