From: KP Singh <kpsingh@chromium.org>
To: kernel test robot <lkp@intel.com>
Cc: KP Singh <kpsingh@chromium.org>,
linux-kernel@vger.kernel.org, bpf@vger.kernel.org,
linux-security-module@vger.kernel.org, kbuild-all@lists.01.org,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Paul Turner <pjt@google.com>, Jann Horn <jannh@google.com>,
Florent Revest <revest@chromium.org>
Subject: Re: [PATCH bpf-next v3 1/4] bpf: Generalize bpf_sk_storage
Date: Thu, 9 Jul 2020 11:43:21 +0200 [thread overview]
Message-ID: <20200709094321.GA3743174@google.com> (raw)
In-Reply-To: <202007091053.Se7i8FMj%lkp@intel.com>
On 09-Jul 10:49, kernel test robot wrote:
> 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 <lkp@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)
Thanks! Fixed with a missing include to bpf_sk_storage.h in
bpf_sk_storage.c
> | ^~~~~~~~~~~~~~~~~~~
> >> 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)
> | ^~~~~~~~~~~~~~~~~~~~
should have been static. Fixed.
> >> 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)
> | ^~~~~~~~~~~~~~~~~~~
Ditto. Fixed.
- KP
> >> 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-all@lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: KP Singh <kpsingh@chromium.org>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH bpf-next v3 1/4] bpf: Generalize bpf_sk_storage
Date: Thu, 09 Jul 2020 11:43:21 +0200 [thread overview]
Message-ID: <20200709094321.GA3743174@google.com> (raw)
In-Reply-To: <202007091053.Se7i8FMj%lkp@intel.com>
[-- Attachment #1: Type: text/plain, Size: 17113 bytes --]
On 09-Jul 10:49, kernel test robot wrote:
> 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 <lkp@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)
Thanks! Fixed with a missing include to bpf_sk_storage.h in
bpf_sk_storage.c
> | ^~~~~~~~~~~~~~~~~~~
> >> 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)
> | ^~~~~~~~~~~~~~~~~~~~
should have been static. Fixed.
> >> 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)
> | ^~~~~~~~~~~~~~~~~~~
Ditto. Fixed.
- KP
> >> 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-all(a)lists.01.org
next prev parent reply other threads:[~2020-07-09 9:43 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-09 0:56 [PATCH bpf-next v3 0/4] Generalizing bpf_local_storage KP Singh
2020-07-09 0:56 ` [PATCH bpf-next v3 1/4] bpf: Generalize bpf_sk_storage KP Singh
2020-07-09 2:49 ` kernel test robot
2020-07-09 2:49 ` kernel test robot
2020-07-09 9:43 ` KP Singh [this message]
2020-07-09 9:43 ` KP Singh
2020-07-09 0:56 ` [PATCH bpf-next v3 2/4] bpf: Implement bpf_local_storage for inodes KP Singh
2020-07-09 4:37 ` kernel test robot
2020-07-09 4:37 ` kernel test robot
2020-07-09 9:44 ` KP Singh
2020-07-09 9:44 ` KP Singh
2020-07-09 0:56 ` [PATCH bpf-next v3 3/4] bpf: Allow local storage to be used from LSM programs KP Singh
2020-07-09 0:56 ` [PATCH bpf-next v3 4/4] bpf: Add selftests for local_storage KP Singh
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=20200709094321.GA3743174@google.com \
--to=kpsingh@chromium.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=jannh@google.com \
--cc=kbuild-all@lists.01.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=lkp@intel.com \
--cc=pjt@google.com \
--cc=revest@chromium.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.