On Thu, Sep 17, 2020 at 8:33 AM Francesco Ruggeri <[email protected]> wrote: > > > static inline void dev_put(struct net_device *dev) > > { > > + struct task_struct *destroy_task = dev->destroy_task; > > + > > this_cpu_dec(*dev->pcpu_refcnt); > > + if (destroy_task) > > + wake_up_process(destroy_task); > > } > > I just realized that this introduces a race, if dev_put drops the last > reference, an already running netdev_wait_allrefs runs to completion > and then dev_put tries to wake it up. > Any suggestions on how to avoid this without resorting to > locking? >
Honestly I would not touch dev_put() at all. Simply change the msleep(250) to something better, with maybe exponential backoff.

