On 25/06/2020 15:03, kernel test robot wrote: > Hi Horatiu, > > Thank you for the patch! Perhaps something to improve: >
Hi, I think you should drop the __rcu tag for the mrp_list member and also from the "list" member of struct br_mrp to fix most of the below. Cheers, Nik > [auto build test WARNING on net-next/master] > > url: > https://github.com/0day-ci/linux/commits/Horatiu-Vultur/bridge-mrp-Extend-MRP-netlink-interface-with-IFLA_BRIDGE_MRP_CLEAR/20200625-150941 > base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git > 147373d968f1c1b5d6bb71e4e8b7495eeb9cdcae > config: i386-randconfig-s001-20200624 (attached as .config) > compiler: gcc-9 (Debian 9.3.0-13) 9.3.0 > reproduce: > # apt-get install sparse > # sparse version: v0.6.2-dirty > # save the attached .config to linux build tree > make W=1 C=1 ARCH=i386 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' > > If you fix the issue, kindly add following tag as appropriate > Reported-by: kernel test robot <l...@intel.com> > > > sparse warnings: (new ones prefixed by >>) > > net/bridge/br_mrp.c:106:18: sparse: sparse: incorrect type in assignment > (different base types) @@ expected unsigned short [usertype] @@ got > restricted __be16 [usertype] @@ > net/bridge/br_mrp.c:106:18: sparse: expected unsigned short [usertype] > net/bridge/br_mrp.c:106:18: sparse: got restricted __be16 [usertype] > net/bridge/br_mrp.c:281:23: sparse: sparse: incorrect type in argument 1 > (different modifiers) @@ expected struct list_head *entry @@ got > struct list_head [noderef] * @@ > net/bridge/br_mrp.c:281:23: sparse: expected struct list_head *entry > net/bridge/br_mrp.c:281:23: sparse: got struct list_head [noderef] * > net/bridge/br_mrp.c:332:28: sparse: sparse: incorrect type in argument 1 > (different modifiers) @@ expected struct list_head *new @@ got struct > list_head [noderef] * @@ > net/bridge/br_mrp.c:332:28: sparse: expected struct list_head *new > net/bridge/br_mrp.c:332:28: sparse: got struct list_head [noderef] * > net/bridge/br_mrp.c:332:40: sparse: sparse: incorrect type in argument 2 > (different modifiers) @@ expected struct list_head *head @@ got > struct list_head [noderef] * @@ > net/bridge/br_mrp.c:332:40: sparse: expected struct list_head *head > net/bridge/br_mrp.c:332:40: sparse: got struct list_head [noderef] * > net/bridge/br_mrp.c:691:29: sparse: sparse: incorrect type in argument 1 > (different modifiers) @@ expected struct list_head const *head @@ got > struct list_head [noderef] * @@ > net/bridge/br_mrp.c:691:29: sparse: expected struct list_head const > *head > net/bridge/br_mrp.c:691:29: sparse: got struct list_head [noderef] * >>> net/bridge/br_mrp.c:383:9: sparse: sparse: dereference of noderef expression >>> net/bridge/br_mrp.c:383:9: sparse: sparse: dereference of noderef expression >>> net/bridge/br_mrp.c:383:9: sparse: sparse: dereference of noderef expression > > vim +383 net/bridge/br_mrp.c > > 284 > 285 /* Adds a new MRP instance. > 286 * note: called under rtnl_lock > 287 */ > 288 int br_mrp_add(struct net_bridge *br, struct br_mrp_instance > *instance) > 289 { > 290 struct net_bridge_port *p; > 291 struct br_mrp *mrp; > 292 int err; > 293 > 294 /* If the ring exists, it is not possible to create > another one with the > 295 * same ring_id > 296 */ > 297 mrp = br_mrp_find_id(br, instance->ring_id); > 298 if (mrp) > 299 return -EINVAL; > 300 > 301 if (!br_mrp_get_port(br, instance->p_ifindex) || > 302 !br_mrp_get_port(br, instance->s_ifindex)) > 303 return -EINVAL; > 304 > 305 /* It is not possible to have the same port part of > multiple rings */ > 306 if (!br_mrp_unique_ifindex(br, instance->p_ifindex) || > 307 !br_mrp_unique_ifindex(br, instance->s_ifindex)) > 308 return -EINVAL; > 309 > 310 mrp = kzalloc(sizeof(*mrp), GFP_KERNEL); > 311 if (!mrp) > 312 return -ENOMEM; > 313 > 314 mrp->ring_id = instance->ring_id; > 315 mrp->prio = instance->prio; > 316 > 317 p = br_mrp_get_port(br, instance->p_ifindex); > 318 spin_lock_bh(&br->lock); > 319 p->state = BR_STATE_FORWARDING; > 320 p->flags |= BR_MRP_AWARE; > 321 spin_unlock_bh(&br->lock); > 322 rcu_assign_pointer(mrp->p_port, p); > 323 > 324 p = br_mrp_get_port(br, instance->s_ifindex); > 325 spin_lock_bh(&br->lock); > 326 p->state = BR_STATE_FORWARDING; > 327 p->flags |= BR_MRP_AWARE; > 328 spin_unlock_bh(&br->lock); > 329 rcu_assign_pointer(mrp->s_port, p); > 330 > 331 INIT_DELAYED_WORK(&mrp->test_work, > br_mrp_test_work_expired); > > 332 list_add_tail_rcu(&mrp->list, &br->mrp_list); > 333 > 334 err = br_mrp_switchdev_add(br, mrp); > 335 if (err) > 336 goto delete_mrp; > 337 > 338 return 0; > 339 > 340 delete_mrp: > 341 br_mrp_del_impl(br, mrp); > 342 > 343 return err; > 344 } > 345 > 346 /* Deletes the MRP instance from which the port is part of > 347 * note: called under rtnl_lock > 348 */ > 349 void br_mrp_port_del(struct net_bridge *br, struct > net_bridge_port *p) > 350 { > 351 struct br_mrp *mrp = br_mrp_find_port(br, p); > 352 > 353 /* If the port is not part of a MRP instance just bail > out */ > 354 if (!mrp) > 355 return; > 356 > 357 br_mrp_del_impl(br, mrp); > 358 } > 359 > 360 /* Deletes existing MRP instance based on ring_id > 361 * note: called under rtnl_lock > 362 */ > 363 int br_mrp_del(struct net_bridge *br, struct br_mrp_instance > *instance) > 364 { > 365 struct br_mrp *mrp = br_mrp_find_id(br, > instance->ring_id); > 366 > 367 if (!mrp) > 368 return -EINVAL; > 369 > 370 br_mrp_del_impl(br, mrp); > 371 > 372 return 0; > 373 } > 374 > 375 /* Deletes all MRP instances on the bridge > 376 * note: called under rtnl_lock > 377 */ > 378 int br_mrp_clear(struct net_bridge *br) > 379 { > 380 struct br_mrp *mrp; > 381 struct br_mrp *tmp; > 382 > > 383 list_for_each_entry_safe(mrp, tmp, &br->mrp_list, list) > { > 384 br_mrp_del_impl(br, mrp); > 385 } > 386 > 387 return 0; > 388 } > 389 > > --- > 0-DAY CI Kernel Test Service, Intel Corporation > https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org >