Commit 2d9a93b4 authored by Taehee Yoo's avatar Taehee Yoo Committed by David S. Miller

mld: convert from timer to delayed work

mcast.c has several timers for delaying works.
Timer's expire handler is working under atomic context so it can't use
sleepable things such as GFP_KERNEL, mutex, etc.
In order to use sleepable APIs, it converts from timers to delayed work.
But there are some critical sections, which is used by both process
and BH context. So that it still uses spin_lock_bh() and rwlock.
Suggested-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: default avatarTaehee Yoo <ap420073@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6e275143
...@@ -120,7 +120,7 @@ struct ifmcaddr6 { ...@@ -120,7 +120,7 @@ struct ifmcaddr6 {
unsigned int mca_sfmode; unsigned int mca_sfmode;
unsigned char mca_crcount; unsigned char mca_crcount;
unsigned long mca_sfcount[2]; unsigned long mca_sfcount[2];
struct timer_list mca_timer; struct delayed_work mca_work;
unsigned int mca_flags; unsigned int mca_flags;
int mca_users; int mca_users;
refcount_t mca_refcnt; refcount_t mca_refcnt;
...@@ -179,9 +179,9 @@ struct inet6_dev { ...@@ -179,9 +179,9 @@ struct inet6_dev {
unsigned long mc_qri; /* Query Response Interval */ unsigned long mc_qri; /* Query Response Interval */
unsigned long mc_maxdelay; unsigned long mc_maxdelay;
struct timer_list mc_gq_timer; /* general query timer */ struct delayed_work mc_gq_work; /* general query work */
struct timer_list mc_ifc_timer; /* interface change timer */ struct delayed_work mc_ifc_work; /* interface change work */
struct timer_list mc_dad_timer; /* dad complete mc timer */ struct delayed_work mc_dad_work; /* dad complete mc work */
struct ifacaddr6 *ac_list; struct ifacaddr6 *ac_list;
rwlock_t lock; rwlock_t lock;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment