On Sat, Feb 13, 2021 at 9:51 AM Taehee Yoo <ap420...@gmail.com> wrote: > -static void mld_dad_start_timer(struct inet6_dev *idev, unsigned long delay) > +static void mld_dad_start_work(struct inet6_dev *idev, unsigned long delay) > { > unsigned long tv = prandom_u32() % delay; > > - if (!mod_timer(&idev->mc_dad_timer, jiffies+tv+2)) > + if (!mod_delayed_work(mld_wq, &idev->mc_dad_work, msecs_to_jiffies(tv > + 2)))
IIUC, before this patch 'delay' is in jiffies, after this patch it is in msecs? [...] > -static void mld_dad_timer_expire(struct timer_list *t) > +static void mld_dad_work(struct work_struct *work) > { > - struct inet6_dev *idev = from_timer(idev, t, mc_dad_timer); > + struct inet6_dev *idev = container_of(to_delayed_work(work), > + struct inet6_dev, > + mc_dad_work); > > + rtnl_lock(); Any reason why we need RTNL after converting the timer to delayed work? Thanks.