CC: l...@lists.linux.dev
CC: kbuild-...@lists.01.org
BCC: l...@intel.com
CC: linux-ker...@vger.kernel.org
TO: Joanne Koong <joannelko...@gmail.com>
CC: Alexei Starovoitov <a...@kernel.org>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
master
head:   ae085d7f9365de7da27ab5c0d16b12d51ea7fca9
commit: b00fa38a9c1cba044a32a601b49a55a18ed719d1 bpf: Enable non-atomic 
allocations in local storage
date:   8 days ago
:::::: branch date: 26 hours ago
:::::: commit date: 8 days ago
config: i386-randconfig-c001 
(https://download.01.org/0day-ci/archive/20220329/202203291151.auxjtqzs-...@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 
902f4708fe1d03b0de7e5315ef875006a6adc319)
reproduce (this is a W=1 build):
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        # 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b00fa38a9c1cba044a32a601b49a55a18ed719d1
        git remote add linus 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        git fetch --no-tags linus master
        git checkout b00fa38a9c1cba044a32a601b49a55a18ed719d1
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=i386 
clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <l...@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                 ^
   fs/ext4/mballoc.c:3353:7: note: Left side of '&&' is true
                   if ((sb->s_flags & SB_ACTIVE) && !err &&
                       ^
   fs/ext4/mballoc.c:3353:37: note: 'err' is 0
                   if ((sb->s_flags & SB_ACTIVE) && !err &&
                                                     ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                                                
        ^~~~
   include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
            ^~~~
   fs/ext4/mballoc.c:3353:7: note: Left side of '&&' is true
                   if ((sb->s_flags & SB_ACTIVE) && !err &&
                       ^
   fs/ext4/mballoc.c:3353:3: note: '?' condition is true
                   if ((sb->s_flags & SB_ACTIVE) && !err &&
                   ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                                       ^
   include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
           ^
   fs/ext4/mballoc.c:3353:3: note: Taking true branch
                   if ((sb->s_flags & SB_ACTIVE) && !err &&
                   ^
   include/linux/compiler.h:56:23: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                         ^
   fs/ext4/mballoc.c:3356:8: note: Assuming 'grp' is equal to 'load_grp'
                           if (grp != load_grp) {
                               ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                      ^~~~
   fs/ext4/mballoc.c:3356:4: note: '?' condition is false
                           if (grp != load_grp) {
                           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                 ^
   fs/ext4/mballoc.c:3356:8: note: 'grp' is equal to 'load_grp'
                           if (grp != load_grp) {
                               ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:86: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                                                
        ^~~~
   include/linux/compiler.h:69:3: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
            ^~~~
   fs/ext4/mballoc.c:3356:4: note: '?' condition is false
                           if (grp != load_grp) {
                           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                                       ^
   include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
           ^
   fs/ext4/mballoc.c:3356:4: note: Taking false branch
                           if (grp != load_grp) {
                           ^
   include/linux/compiler.h:56:23: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                         ^
   fs/ext4/mballoc.c:3371:4: note: Calling 'ext4_try_to_trim_range'
                           ext4_try_to_trim_range(sb, &e4b, 
fd->efd_start_cluster,
                           
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/ext4/mballoc.c:6307:9: note: Assigned value is garbage or undefined
           bitmap = e4b->bd_bitmap;
                  ^ ~~~~~~~~~~~~~~
   1 warning generated.
   Suppressed 1 warnings (1 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   2 warnings generated.
>> kernel/bpf/bpf_local_storage.c:473:2: warning: Potential leak of memory 
>> pointed to by 'selem' [clang-analyzer-unix.Malloc]
           raw_spin_unlock_irqrestore(&local_storage->lock, flags);
           ^
   include/linux/spinlock.h:279:13: note: expanded from macro 
'raw_spin_unlock_irqrestore'
                   typecheck(unsigned long, flags);                \
                             ^
   kernel/bpf/bpf_local_storage.c:363:15: note: Assuming the condition is false
           if (unlikely((map_flags & ~BPF_F_LOCK) > BPF_EXIST) ||
                        ^
   include/linux/compiler.h:48:41: note: expanded from macro 'unlikely'
   #  define unlikely(x)   (__branch_check__(x, 0, __builtin_constant_p(x)))
                                             ^
   include/linux/compiler.h:33:34: note: expanded from macro '__branch_check__'
                           ______r = __builtin_expect(!!(x), expect);      \
                                                         ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                      ^~~~
   kernel/bpf/bpf_local_storage.c:363:6: note: Left side of '||' is false
           if (unlikely((map_flags & ~BPF_F_LOCK) > BPF_EXIST) ||
               ^
   include/linux/compiler.h:48:23: note: expanded from macro 'unlikely'
   #  define unlikely(x)   (__branch_check__(x, 0, __builtin_constant_p(x)))
                           ^
   kernel/bpf/bpf_local_storage.c:365:16: note: Assuming the condition is true
               unlikely((map_flags & BPF_F_LOCK) &&
                         ^
   include/linux/compiler.h:48:41: note: expanded from macro 'unlikely'
   #  define unlikely(x)   (__branch_check__(x, 0, __builtin_constant_p(x)))
                                             ^
   include/linux/compiler.h:33:34: note: expanded from macro '__branch_check__'
                           ______r = __builtin_expect(!!(x), expect);      \
                                                         ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                      ^~~~
   kernel/bpf/bpf_local_storage.c:365:15: note: Left side of '&&' is true
               unlikely((map_flags & BPF_F_LOCK) &&
                        ^
   kernel/bpf/bpf_local_storage.c:365:15: note: Left side of '&&' is true
   kernel/bpf/bpf_local_storage.c:363:2: note: '?' condition is false
           if (unlikely((map_flags & ~BPF_F_LOCK) > BPF_EXIST) ||
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:31: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                 ^
   kernel/bpf/bpf_local_storage.c:363:6: note: Left side of '||' is false
           if (unlikely((map_flags & ~BPF_F_LOCK) > BPF_EXIST) ||
               ^
   include/linux/compiler.h:48:23: note: expanded from macro 'unlikely'
   #  define unlikely(x)   (__branch_check__(x, 0, __builtin_constant_p(x)))
                           ^
   kernel/bpf/bpf_local_storage.c:365:15: note: Left side of '&&' is true
               unlikely((map_flags & BPF_F_LOCK) &&
                        ^
   kernel/bpf/bpf_local_storage.c:365:15: note: Left side of '&&' is true
   kernel/bpf/bpf_local_storage.c:363:2: note: '?' condition is false
           if (unlikely((map_flags & ~BPF_F_LOCK) > BPF_EXIST) ||
           ^
   include/linux/compiler.h:56:28: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ^
   include/linux/compiler.h:58:69: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                                       ^
   include/linux/compiler.h:69:2: note: expanded from macro '__trace_if_value'
           (cond) ?                                        \
           ^
   kernel/bpf/bpf_local_storage.c:363:2: note: Taking false branch
           if (unlikely((map_flags & ~BPF_F_LOCK) > BPF_EXIST) ||
           ^
   include/linux/compiler.h:56:23: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                         ^
   kernel/bpf/bpf_local_storage.c:369:6: note: Assuming the condition is true
           if (gfp_flags == GFP_KERNEL && (map_flags & ~BPF_F_LOCK) != 
BPF_NOEXIST)
               ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                              ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:58:52: note: expanded from macro '__trace_if_var'
   #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : 
__trace_if_value(cond))
                                                      ^~~~
   kernel/bpf/bpf_local_storage.c:369:6: note: Left side of '&&' is true
           if (gfp_flags == GFP_KERNEL && (map_flags & ~BPF_F_LOCK) != 
BPF_NOEXIST)
               ^
   kernel/bpf/bpf_local_storage.c:369:33: note: Assuming the condition is false
           if (gfp_flags == GFP_KERNEL && (map_flags & ~BPF_F_LOCK) != 
BPF_NOEXIST)
                                          ^
   include/linux/compiler.h:56:47: note: expanded from macro 'if'
   #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
                                                 ^~~~

vim +/selem +473 kernel/bpf/bpf_local_storage.c

450af8d0f6be2e7 KP Singh     2020-08-25  346  
450af8d0f6be2e7 KP Singh     2020-08-25  347  /* sk cannot be going away 
because it is linking new elem
450af8d0f6be2e7 KP Singh     2020-08-25  348   * to sk->sk_bpf_storage. (i.e. 
sk->sk_refcnt cannot be 0).
450af8d0f6be2e7 KP Singh     2020-08-25  349   * Otherwise, it will become a 
leak (and other memory issues
450af8d0f6be2e7 KP Singh     2020-08-25  350   * during map destruction).
450af8d0f6be2e7 KP Singh     2020-08-25  351   */
450af8d0f6be2e7 KP Singh     2020-08-25  352  struct bpf_local_storage_data *
450af8d0f6be2e7 KP Singh     2020-08-25  353  bpf_local_storage_update(void 
*owner, struct bpf_local_storage_map *smap,
b00fa38a9c1cba0 Joanne Koong 2022-03-17  354                     void *value, 
u64 map_flags, gfp_t gfp_flags)
450af8d0f6be2e7 KP Singh     2020-08-25  355  {
450af8d0f6be2e7 KP Singh     2020-08-25  356    struct bpf_local_storage_data 
*old_sdata = NULL;
b00fa38a9c1cba0 Joanne Koong 2022-03-17  357    struct bpf_local_storage_elem 
*selem = NULL;
450af8d0f6be2e7 KP Singh     2020-08-25  358    struct bpf_local_storage 
*local_storage;
a10787e6d58c24b Song Liu     2021-02-25  359    unsigned long flags;
450af8d0f6be2e7 KP Singh     2020-08-25  360    int err;
450af8d0f6be2e7 KP Singh     2020-08-25  361  
450af8d0f6be2e7 KP Singh     2020-08-25  362    /* BPF_EXIST and BPF_NOEXIST 
cannot be both set */
450af8d0f6be2e7 KP Singh     2020-08-25  363    if (unlikely((map_flags & 
~BPF_F_LOCK) > BPF_EXIST) ||
450af8d0f6be2e7 KP Singh     2020-08-25  364        /* BPF_F_LOCK can only be 
used in a value with spin_lock */
450af8d0f6be2e7 KP Singh     2020-08-25  365        unlikely((map_flags & 
BPF_F_LOCK) &&
450af8d0f6be2e7 KP Singh     2020-08-25  366                 
!map_value_has_spin_lock(&smap->map)))
450af8d0f6be2e7 KP Singh     2020-08-25  367            return ERR_PTR(-EINVAL);
450af8d0f6be2e7 KP Singh     2020-08-25  368  
b00fa38a9c1cba0 Joanne Koong 2022-03-17  369    if (gfp_flags == GFP_KERNEL && 
(map_flags & ~BPF_F_LOCK) != BPF_NOEXIST)
b00fa38a9c1cba0 Joanne Koong 2022-03-17  370            return ERR_PTR(-EINVAL);
b00fa38a9c1cba0 Joanne Koong 2022-03-17  371  
0fe4b381a59ebc5 KP Singh     2021-12-24  372    local_storage = 
rcu_dereference_check(*owner_storage(smap, owner),
0fe4b381a59ebc5 KP Singh     2021-12-24  373                                    
      bpf_rcu_lock_held());
450af8d0f6be2e7 KP Singh     2020-08-25  374    if (!local_storage || 
hlist_empty(&local_storage->list)) {
450af8d0f6be2e7 KP Singh     2020-08-25  375            /* Very first elem for 
the owner */
450af8d0f6be2e7 KP Singh     2020-08-25  376            err = check_flags(NULL, 
map_flags);
450af8d0f6be2e7 KP Singh     2020-08-25  377            if (err)
450af8d0f6be2e7 KP Singh     2020-08-25  378                    return 
ERR_PTR(err);
450af8d0f6be2e7 KP Singh     2020-08-25  379  
b00fa38a9c1cba0 Joanne Koong 2022-03-17  380            selem = 
bpf_selem_alloc(smap, owner, value, true, gfp_flags);
450af8d0f6be2e7 KP Singh     2020-08-25  381            if (!selem)
450af8d0f6be2e7 KP Singh     2020-08-25  382                    return 
ERR_PTR(-ENOMEM);
450af8d0f6be2e7 KP Singh     2020-08-25  383  
b00fa38a9c1cba0 Joanne Koong 2022-03-17  384            err = 
bpf_local_storage_alloc(owner, smap, selem, gfp_flags);
450af8d0f6be2e7 KP Singh     2020-08-25  385            if (err) {
450af8d0f6be2e7 KP Singh     2020-08-25  386                    kfree(selem);
450af8d0f6be2e7 KP Singh     2020-08-25  387                    
mem_uncharge(smap, owner, smap->elem_size);
450af8d0f6be2e7 KP Singh     2020-08-25  388                    return 
ERR_PTR(err);
450af8d0f6be2e7 KP Singh     2020-08-25  389            }
450af8d0f6be2e7 KP Singh     2020-08-25  390  
450af8d0f6be2e7 KP Singh     2020-08-25  391            return SDATA(selem);
450af8d0f6be2e7 KP Singh     2020-08-25  392    }
450af8d0f6be2e7 KP Singh     2020-08-25  393  
450af8d0f6be2e7 KP Singh     2020-08-25  394    if ((map_flags & BPF_F_LOCK) && 
!(map_flags & BPF_NOEXIST)) {
450af8d0f6be2e7 KP Singh     2020-08-25  395            /* Hoping to find an 
old_sdata to do inline update
450af8d0f6be2e7 KP Singh     2020-08-25  396             * such that it can 
avoid taking the local_storage->lock
450af8d0f6be2e7 KP Singh     2020-08-25  397             * and changing the 
lists.
450af8d0f6be2e7 KP Singh     2020-08-25  398             */
450af8d0f6be2e7 KP Singh     2020-08-25  399            old_sdata =
450af8d0f6be2e7 KP Singh     2020-08-25  400                    
bpf_local_storage_lookup(local_storage, smap, false);
450af8d0f6be2e7 KP Singh     2020-08-25  401            err = 
check_flags(old_sdata, map_flags);
450af8d0f6be2e7 KP Singh     2020-08-25  402            if (err)
450af8d0f6be2e7 KP Singh     2020-08-25  403                    return 
ERR_PTR(err);
450af8d0f6be2e7 KP Singh     2020-08-25  404            if (old_sdata && 
selem_linked_to_storage(SELEM(old_sdata))) {
450af8d0f6be2e7 KP Singh     2020-08-25  405                    
copy_map_value_locked(&smap->map, old_sdata->data,
450af8d0f6be2e7 KP Singh     2020-08-25  406                                    
      value, false);
450af8d0f6be2e7 KP Singh     2020-08-25  407                    return 
old_sdata;
450af8d0f6be2e7 KP Singh     2020-08-25  408            }
450af8d0f6be2e7 KP Singh     2020-08-25  409    }
450af8d0f6be2e7 KP Singh     2020-08-25  410  
b00fa38a9c1cba0 Joanne Koong 2022-03-17  411    if (gfp_flags == GFP_KERNEL) {
b00fa38a9c1cba0 Joanne Koong 2022-03-17  412            selem = 
bpf_selem_alloc(smap, owner, value, true, gfp_flags);
b00fa38a9c1cba0 Joanne Koong 2022-03-17  413            if (!selem)
b00fa38a9c1cba0 Joanne Koong 2022-03-17  414                    return 
ERR_PTR(-ENOMEM);
b00fa38a9c1cba0 Joanne Koong 2022-03-17  415    }
b00fa38a9c1cba0 Joanne Koong 2022-03-17  416  
a10787e6d58c24b Song Liu     2021-02-25  417    
raw_spin_lock_irqsave(&local_storage->lock, flags);
450af8d0f6be2e7 KP Singh     2020-08-25  418  
450af8d0f6be2e7 KP Singh     2020-08-25  419    /* Recheck local_storage->list 
under local_storage->lock */
450af8d0f6be2e7 KP Singh     2020-08-25  420    if 
(unlikely(hlist_empty(&local_storage->list))) {
450af8d0f6be2e7 KP Singh     2020-08-25  421            /* A parallel del is 
happening and local_storage is going
450af8d0f6be2e7 KP Singh     2020-08-25  422             * away.  It has just 
been checked before, so very
450af8d0f6be2e7 KP Singh     2020-08-25  423             * unlikely.  Return 
instead of retry to keep things
450af8d0f6be2e7 KP Singh     2020-08-25  424             * simple.
450af8d0f6be2e7 KP Singh     2020-08-25  425             */
450af8d0f6be2e7 KP Singh     2020-08-25  426            err = -EAGAIN;
450af8d0f6be2e7 KP Singh     2020-08-25  427            goto unlock_err;
450af8d0f6be2e7 KP Singh     2020-08-25  428    }
450af8d0f6be2e7 KP Singh     2020-08-25  429  
450af8d0f6be2e7 KP Singh     2020-08-25  430    old_sdata = 
bpf_local_storage_lookup(local_storage, smap, false);
450af8d0f6be2e7 KP Singh     2020-08-25  431    err = check_flags(old_sdata, 
map_flags);
450af8d0f6be2e7 KP Singh     2020-08-25  432    if (err)
450af8d0f6be2e7 KP Singh     2020-08-25  433            goto unlock_err;
450af8d0f6be2e7 KP Singh     2020-08-25  434  
450af8d0f6be2e7 KP Singh     2020-08-25  435    if (old_sdata && (map_flags & 
BPF_F_LOCK)) {
450af8d0f6be2e7 KP Singh     2020-08-25  436            
copy_map_value_locked(&smap->map, old_sdata->data, value,
450af8d0f6be2e7 KP Singh     2020-08-25  437                                  
false);
450af8d0f6be2e7 KP Singh     2020-08-25  438            selem = 
SELEM(old_sdata);
450af8d0f6be2e7 KP Singh     2020-08-25  439            goto unlock;
450af8d0f6be2e7 KP Singh     2020-08-25  440    }
450af8d0f6be2e7 KP Singh     2020-08-25  441  
b00fa38a9c1cba0 Joanne Koong 2022-03-17  442    if (gfp_flags != GFP_KERNEL) {
450af8d0f6be2e7 KP Singh     2020-08-25  443            /* local_storage->lock 
is held.  Hence, we are sure
450af8d0f6be2e7 KP Singh     2020-08-25  444             * we can unlink and 
uncharge the old_sdata successfully
450af8d0f6be2e7 KP Singh     2020-08-25  445             * later.  Hence, 
instead of charging the new selem now
450af8d0f6be2e7 KP Singh     2020-08-25  446             * and then uncharge 
the old selem later (which may cause
450af8d0f6be2e7 KP Singh     2020-08-25  447             * a potential but 
unnecessary charge failure),  avoid taking
450af8d0f6be2e7 KP Singh     2020-08-25  448             * a charge at all here 
(the "!old_sdata" check) and the
450af8d0f6be2e7 KP Singh     2020-08-25  449             * old_sdata will not 
be uncharged later during
450af8d0f6be2e7 KP Singh     2020-08-25  450             * 
bpf_selem_unlink_storage_nolock().
450af8d0f6be2e7 KP Singh     2020-08-25  451             */
b00fa38a9c1cba0 Joanne Koong 2022-03-17  452            selem = 
bpf_selem_alloc(smap, owner, value, !old_sdata, gfp_flags);
450af8d0f6be2e7 KP Singh     2020-08-25  453            if (!selem) {
450af8d0f6be2e7 KP Singh     2020-08-25  454                    err = -ENOMEM;
450af8d0f6be2e7 KP Singh     2020-08-25  455                    goto unlock_err;
450af8d0f6be2e7 KP Singh     2020-08-25  456            }
b00fa38a9c1cba0 Joanne Koong 2022-03-17  457    }
450af8d0f6be2e7 KP Singh     2020-08-25  458  
450af8d0f6be2e7 KP Singh     2020-08-25  459    /* First, link the new selem to 
the map */
450af8d0f6be2e7 KP Singh     2020-08-25  460    bpf_selem_link_map(smap, selem);
450af8d0f6be2e7 KP Singh     2020-08-25  461  
450af8d0f6be2e7 KP Singh     2020-08-25  462    /* Second, link (and publish) 
the new selem to local_storage */
450af8d0f6be2e7 KP Singh     2020-08-25  463    
bpf_selem_link_storage_nolock(local_storage, selem);
450af8d0f6be2e7 KP Singh     2020-08-25  464  
450af8d0f6be2e7 KP Singh     2020-08-25  465    /* Third, remove old selem, 
SELEM(old_sdata) */
450af8d0f6be2e7 KP Singh     2020-08-25  466    if (old_sdata) {
450af8d0f6be2e7 KP Singh     2020-08-25  467            
bpf_selem_unlink_map(SELEM(old_sdata));
450af8d0f6be2e7 KP Singh     2020-08-25  468            
bpf_selem_unlink_storage_nolock(local_storage, SELEM(old_sdata),
450af8d0f6be2e7 KP Singh     2020-08-25  469                                    
        false);
450af8d0f6be2e7 KP Singh     2020-08-25  470    }
450af8d0f6be2e7 KP Singh     2020-08-25  471  
450af8d0f6be2e7 KP Singh     2020-08-25  472  unlock:
a10787e6d58c24b Song Liu     2021-02-25 @473    
raw_spin_unlock_irqrestore(&local_storage->lock, flags);
450af8d0f6be2e7 KP Singh     2020-08-25  474    return SDATA(selem);
450af8d0f6be2e7 KP Singh     2020-08-25  475  
450af8d0f6be2e7 KP Singh     2020-08-25  476  unlock_err:
a10787e6d58c24b Song Liu     2021-02-25  477    
raw_spin_unlock_irqrestore(&local_storage->lock, flags);
b00fa38a9c1cba0 Joanne Koong 2022-03-17  478    if (selem) {
b00fa38a9c1cba0 Joanne Koong 2022-03-17  479            mem_uncharge(smap, 
owner, smap->elem_size);
b00fa38a9c1cba0 Joanne Koong 2022-03-17  480            kfree(selem);
b00fa38a9c1cba0 Joanne Koong 2022-03-17  481    }
450af8d0f6be2e7 KP Singh     2020-08-25  482    return ERR_PTR(err);
450af8d0f6be2e7 KP Singh     2020-08-25  483  }
450af8d0f6be2e7 KP Singh     2020-08-25  484  

:::::: The code at line 473 was first introduced by commit
:::::: a10787e6d58c24b51e91c19c6d16c5da89fcaa4b bpf: Enable task local storage 
for tracing programs

:::::: TO: Song Liu <songliubrav...@fb.com>
:::::: CC: Alexei Starovoitov <a...@kernel.org>

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp
_______________________________________________
kbuild mailing list -- kbuild@lists.01.org
To unsubscribe send an email to kbuild-le...@lists.01.org

Reply via email to