Hi KP,

I love your patch! Perhaps something to improve:

[auto build test WARNING on bpf-next/master]

url:    
https://github.com/0day-ci/linux/commits/KP-Singh/Generalizing-bpf_local_storage/20200709-085810
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
config: alpha-allyesconfig (attached as .config)
compiler: alpha-linux-gcc (GCC) 9.3.0
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
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross 
ARCH=alpha 

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

All warnings (new ones prefixed by >>):

>> net/core/bpf_sk_storage.c:170:6: warning: no previous prototype for 
>> 'bpf_sk_storage_free' [-Wmissing-prototypes]
     170 | void bpf_sk_storage_free(struct sock *sk)
         |      ^~~~~~~~~~~~~~~~~~~
>> net/core/bpf_sk_storage.c:280:5: warning: no previous prototype for 
>> 'bpf_sk_storage_clone' [-Wmissing-prototypes]
     280 | int bpf_sk_storage_clone(const struct sock *sk, struct sock *newsk)
         |     ^~~~~~~~~~~~~~~~~~~~
>> net/core/bpf_sk_storage.c:401:17: warning: no previous prototype for 
>> 'sk_storage_map_alloc' [-Wmissing-prototypes]
     401 | struct bpf_map *sk_storage_map_alloc(union bpf_attr *attr)
         |                 ^~~~~~~~~~~~~~~~~~~~
>> net/core/bpf_sk_storage.c:413:6: warning: no previous prototype for 
>> 'sk_storage_map_free' [-Wmissing-prototypes]
     413 | void sk_storage_map_free(struct bpf_map *map)
         |      ^~~~~~~~~~~~~~~~~~~
>> net/core/bpf_sk_storage.c:483:6: warning: no previous prototype for 
>> 'bpf_sk_storage_diag_free' [-Wmissing-prototypes]
     483 | void bpf_sk_storage_diag_free(struct bpf_sk_storage_diag *diag)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~
>> net/core/bpf_sk_storage.c:511:1: warning: no previous prototype for 
>> 'bpf_sk_storage_diag_alloc' [-Wmissing-prototypes]
     511 | bpf_sk_storage_diag_alloc(const struct nlattr *nla_stgs)
         | ^~~~~~~~~~~~~~~~~~~~~~~~~
>> net/core/bpf_sk_storage.c:658:5: warning: no previous prototype for 
>> 'bpf_sk_storage_diag_put' [-Wmissing-prototypes]
     658 | int bpf_sk_storage_diag_put(struct bpf_sk_storage_diag *diag,
         |     ^~~~~~~~~~~~~~~~~~~~~~~

vim +/bpf_sk_storage_free +170 net/core/bpf_sk_storage.c

6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  168  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  169  /* Called by __sk_destruct() 
& bpf_sk_storage_clone() */
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26 @170  void 
bpf_sk_storage_free(struct sock *sk)
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  171  {
9af362a775d83f KP Singh           2020-07-09  172       struct 
bpf_local_storage_elem *selem;
9af362a775d83f KP Singh           2020-07-09  173       struct 
bpf_local_storage *sk_storage;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  174       bool free_sk_storage = 
false;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  175       struct hlist_node *n;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  176  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  177       rcu_read_lock();
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  178       sk_storage = 
rcu_dereference(sk->sk_bpf_storage);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  179       if (!sk_storage) {
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  180               
rcu_read_unlock();
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  181               return;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  182       }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  183  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  184       /* Netiher the bpf_prog 
nor the bpf-map's syscall
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  185        * could be modifying 
the sk_storage->list now.
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  186        * Thus, no elem can be 
added-to or deleted-from the
9af362a775d83f KP Singh           2020-07-09  187        * local_storage->list 
by the bpf_prog or by the bpf-map's syscall.
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  188        *
9af362a775d83f KP Singh           2020-07-09  189        * It is racing with 
bpf_local_storage_map_free() alone
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  190        * when unlinking elem 
from the sk_storage->list and
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  191        * the map's 
bucket->list.
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  192        */
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  193       
raw_spin_lock_bh(&sk_storage->lock);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  194       
hlist_for_each_entry_safe(selem, n, &sk_storage->list, snode) {
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  195               /* Always 
unlink from map before unlinking from
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  196                * sk_storage.
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  197                */
9af362a775d83f KP Singh           2020-07-09  198               
bpf_selem_unlink_map(selem);
9af362a775d83f KP Singh           2020-07-09  199               free_sk_storage 
= bpf_selem_unlink(sk_storage, selem, true);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  200       }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  201       
raw_spin_unlock_bh(&sk_storage->lock);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  202       rcu_read_unlock();
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  203  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  204       if (free_sk_storage)
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  205               
kfree_rcu(sk_storage, rcu);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  206  }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  207  
9af362a775d83f KP Singh           2020-07-09  208  static void 
*bpf_sk_storage_lookup_elem(struct bpf_map *map, void *key)
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  209  {
9af362a775d83f KP Singh           2020-07-09  210       struct 
bpf_local_storage_data *sdata;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  211       struct socket *sock;
9af362a775d83f KP Singh           2020-07-09  212       int fd, err = -EINVAL;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  213  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  214       fd = *(int *)key;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  215       sock = 
sockfd_lookup(fd, &err);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  216       if (sock) {
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  217               sdata = 
sk_storage_lookup(sock->sk, map, true);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  218               
sockfd_put(sock);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  219               return sdata ? 
sdata->data : NULL;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  220       }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  221  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  222       return ERR_PTR(err);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  223  }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  224  
9af362a775d83f KP Singh           2020-07-09  225  static int 
bpf_sk_storage_update_elem(struct bpf_map *map, void *key,
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  226                               
      void *value, u64 map_flags)
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  227  {
9af362a775d83f KP Singh           2020-07-09  228       struct 
bpf_local_storage_data *sdata;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  229       struct socket *sock;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  230       int fd, err;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  231  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  232       fd = *(int *)key;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  233       sock = 
sockfd_lookup(fd, &err);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  234       if (sock) {
9af362a775d83f KP Singh           2020-07-09  235               sdata = 
map->ops->map_local_storage_update(sock->sk, map, value,
9af362a775d83f KP Singh           2020-07-09  236                               
                           map_flags);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  237               
sockfd_put(sock);
71f150f4c2af5f YueHaibing         2019-04-29  238               return 
PTR_ERR_OR_ZERO(sdata);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  239       }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  240  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  241       return err;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  242  }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  243  
9af362a775d83f KP Singh           2020-07-09  244  static int 
bpf_sk_storage_delete_elem(struct bpf_map *map, void *key)
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  245  {
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  246       struct socket *sock;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  247       int fd, err;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  248  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  249       fd = *(int *)key;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  250       sock = 
sockfd_lookup(fd, &err);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  251       if (sock) {
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  252               err = 
sk_storage_delete(sock->sk, map);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  253               
sockfd_put(sock);
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  254       }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  255  
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  256       return err;
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  257  }
6ac99e8f23d4b1 Martin KaFai Lau   2019-04-26  258  
9af362a775d83f KP Singh           2020-07-09  259  static struct 
bpf_local_storage_elem *
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  260  
bpf_sk_storage_clone_elem(struct sock *newsk,
9af362a775d83f KP Singh           2020-07-09  261                         
struct bpf_local_storage_map *smap,
9af362a775d83f KP Singh           2020-07-09  262                         
struct bpf_local_storage_elem *selem)
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  263  {
9af362a775d83f KP Singh           2020-07-09  264       struct 
bpf_local_storage_elem *copy_selem;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  265  
9af362a775d83f KP Singh           2020-07-09  266       copy_selem = 
sk_selem_alloc(smap, newsk, NULL, true);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  267       if (!copy_selem)
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  268               return NULL;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  269  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  270       if 
(map_value_has_spin_lock(&smap->map))
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  271               
copy_map_value_locked(&smap->map, SDATA(copy_selem)->data,
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  272                               
      SDATA(selem)->data, true);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  273       else
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  274               
copy_map_value(&smap->map, SDATA(copy_selem)->data,
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  275                              
SDATA(selem)->data);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  276  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  277       return copy_selem;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  278  }
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  279  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14 @280  int 
bpf_sk_storage_clone(const struct sock *sk, struct sock *newsk)
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  281  {
9af362a775d83f KP Singh           2020-07-09  282       struct 
bpf_local_storage *new_sk_storage = NULL;
9af362a775d83f KP Singh           2020-07-09  283       struct 
bpf_local_storage *sk_storage;
9af362a775d83f KP Singh           2020-07-09  284       struct 
bpf_local_storage_elem *selem;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  285       int ret = 0;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  286  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  287       
RCU_INIT_POINTER(newsk->sk_bpf_storage, NULL);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  288  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  289       rcu_read_lock();
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  290       sk_storage = 
rcu_dereference(sk->sk_bpf_storage);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  291  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  292       if (!sk_storage || 
hlist_empty(&sk_storage->list))
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  293               goto out;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  294  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  295       
hlist_for_each_entry_rcu(selem, &sk_storage->list, snode) {
9af362a775d83f KP Singh           2020-07-09  296               struct 
bpf_local_storage_elem *copy_selem;
9af362a775d83f KP Singh           2020-07-09  297               struct 
bpf_local_storage_map *smap;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  298               struct bpf_map 
*map;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  299  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  300               smap = 
rcu_dereference(SDATA(selem)->smap);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  301               if 
(!(smap->map.map_flags & BPF_F_CLONE))
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  302                       
continue;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  303  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  304               /* Note that 
for lockless listeners adding new element
9af362a775d83f KP Singh           2020-07-09  305                * here can 
race with cleanup in bpf_local_storage_map_free.
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  306                * Try to grab 
map refcnt to make sure that it's still
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  307                * alive and 
prevent concurrent removal.
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  308                */
1e0bd5a091e5d9 Andrii Nakryiko    2019-11-17  309               map = 
bpf_map_inc_not_zero(&smap->map);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  310               if (IS_ERR(map))
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  311                       
continue;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  312  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  313               copy_selem = 
bpf_sk_storage_clone_elem(newsk, smap, selem);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  314               if 
(!copy_selem) {
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  315                       ret = 
-ENOMEM;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  316                       
bpf_map_put(map);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  317                       goto 
out;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  318               }
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  319  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  320               if 
(new_sk_storage) {
9af362a775d83f KP Singh           2020-07-09  321                       
bpf_selem_link_map(smap, copy_selem);
9af362a775d83f KP Singh           2020-07-09  322                       
bpf_selem_link(new_sk_storage, copy_selem);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  323               } else {
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  324                       ret = 
sk_storage_alloc(newsk, smap, copy_selem);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  325                       if 
(ret) {
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  326                               
kfree(copy_selem);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  327                               
atomic_sub(smap->elem_size,
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  328                               
           &newsk->sk_omem_alloc);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  329                               
bpf_map_put(map);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  330                               
goto out;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  331                       }
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  332  
9af362a775d83f KP Singh           2020-07-09  333                       
new_sk_storage =
9af362a775d83f KP Singh           2020-07-09  334                               
rcu_dereference(copy_selem->local_storage);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  335               }
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  336               
bpf_map_put(map);
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  337       }
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  338  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  339  out:
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  340       rcu_read_unlock();
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  341  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  342       /* In case of an error, 
don't free anything explicitly here, the
9af362a775d83f KP Singh           2020-07-09  343        * caller is 
responsible to call bpf_local_storage_free.
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  344        */
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  345  
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  346       return ret;
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  347  }
8f51dfc73bf181 Stanislav Fomichev 2019-08-14  348  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org

Attachment: .config.gz
Description: application/gzip

Reply via email to