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
.config.gz
Description: application/gzip