On Mon, 25 Apr 2022 08:31:23 -0700 Eric Dumazet wrote: > > Jann described a case where someone does > > > > CPU 0 CPU 1 CPU 2 > > > > dev_hold() > > ------ #unregister ------- > > dev_hold() > > dev_put() > > > > Our check for refcount == 0 goes over the CPUs one by one, > > so if it sums up CPUs 0 and 1 at the "unregister" point above > > and CPU2 after the CPU1 hold and CPU2 release it will "miss" > > one refcount. > > > > That's a problem unless doing a dev_hold() on a netdev we only have > > a reference on is illegal. > > What is 'illegal' is trying to keep using the device after #unregister. > > We have barriers to prevent that. > > Somehow a layer does not care about the barriers and pretends the > device is still good to use. > > It is of course perfectly fine to stack multiple dev_hold() from one > path (if these do not leak, but this is a different issue) So we'd need something like WARN_ON(dev->reg_state != NETREG_REGISTERED && !rtnl_held()) in dev_hold()?