[...]
>> By the way, I think the 'delay' is from the
>> unsolicited_report_interval() and it just return value of
>> idev->cnf.mldv{1 | 2}_unsolicited_report_interval.
>> I think this value is msecs, not jiffies.
>> So, It should be converted to use msecs_to_jiffies(), I think.
>> How do you think about it?
>
> Hmm? I think it is in jiffies:
>
> .mldv1_unsolicited_report_interval = 10 * HZ,
> .mldv2_unsolicited_report_interval = HZ,
>
Ah, yes, you're right!
Thanks,
>
>>
>> > [...]
>> >
>> >> -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?
>> >
>>
>> For the moment, RTNL is not needed.
>> But the Resources, which are used by delayed_work will be protected by
>> RTNL instead of other locks.
>> So, It just pre-adds RTNL and the following patches will delete
other locks.
>
> Sounds like this change does not belong to this patch. ;) If so,
> please move it to where ever more appropriate.
>
Yes, I will do that,
I will rearrange it then I will send a v3 patch.
Thank you so much for your review!