* Re: [PATCH] netdev: Fix sleeping inside wait event [not found] ` <20141029161657.GF3337@twins.programming.kicks-ass.net> @ 2014-10-29 16:29 ` Cong Wang 2014-10-29 17:13 ` Peter Zijlstra 0 siblings, 1 reply; 4+ messages in thread From: Cong Wang @ 2014-10-29 16:29 UTC (permalink / raw) To: Peter Zijlstra Cc: Fengguang Wu, LKP, LKML, oleg@redhat.com, Eric W. Biederman, David Miller, Linux Kernel Network Developers (Adding netdev@...) On Wed, Oct 29, 2014 at 9:16 AM, Peter Zijlstra <peterz@infradead.org> wrote: > > Dave, this relies on bits currently in tip/sched/core, if you're ok I'll > merge it through that tree. > > --- > Subject: netdev: Fix sleeping inside wait event > From: Peter Zijlstra <peterz@infradead.org> > Date: Wed Oct 29 17:04:56 CET 2014 > > rtnl_lock_unregistering() takes rtnl_lock() -- a mutex -- inside a > wait loop. The wait loop relies on current->state to function, but so > does mutex_lock(), nesting them makes for the inner to destroy the > outer state. > While you are on it, please fix rtnl_lock_unregistering_all() too? Thanks! > Fix this using the new wait_woken() bits. > > Cc: Oleg Nesterov <oleg@redhat.com> > Cc: Eric Biederman <ebiederm@xmission.com> > Cc: David Miller <davem@davemloft.net> > Reported-by: Fengguang Wu <fengguang.wu@intel.com> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> > --- > net/core/dev.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -7196,11 +7196,10 @@ static void __net_exit rtnl_lock_unregis > */ > struct net *net; > bool unregistering; > - DEFINE_WAIT(wait); > + DEFINE_WAIT_FUNC(wait, woken_wake_function); > > + add_wait_queue(&netdev_unregistering_wq, &wait); > for (;;) { > - prepare_to_wait(&netdev_unregistering_wq, &wait, > - TASK_UNINTERRUPTIBLE); > unregistering = false; > rtnl_lock(); > list_for_each_entry(net, net_list, exit_list) { > @@ -7212,9 +7211,10 @@ static void __net_exit rtnl_lock_unregis > if (!unregistering) > break; > __rtnl_unlock(); > - schedule(); > + > + wait_woken(&wait, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); > } > - finish_wait(&netdev_unregistering_wq, &wait); > + remove_wait_queue(&netdev_unregistering_wq, &wait); > } > > static void __net_exit default_device_exit_batch(struct list_head *net_list) > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] netdev: Fix sleeping inside wait event 2014-10-29 16:29 ` [PATCH] netdev: Fix sleeping inside wait event Cong Wang @ 2014-10-29 17:13 ` Peter Zijlstra 2014-10-29 17:31 ` Peter Zijlstra 0 siblings, 1 reply; 4+ messages in thread From: Peter Zijlstra @ 2014-10-29 17:13 UTC (permalink / raw) To: Cong Wang Cc: Fengguang Wu, LKP, LKML, oleg@redhat.com, Eric W. Biederman, David Miller, Linux Kernel Network Developers On Wed, Oct 29, 2014 at 09:29:55AM -0700, Cong Wang wrote: > (Adding netdev@...) > > On Wed, Oct 29, 2014 at 9:16 AM, Peter Zijlstra <peterz@infradead.org> wrote: > > > > Dave, this relies on bits currently in tip/sched/core, if you're ok I'll > > merge it through that tree. > > > > --- > > Subject: netdev: Fix sleeping inside wait event > > From: Peter Zijlstra <peterz@infradead.org> > > Date: Wed Oct 29 17:04:56 CET 2014 > > > > rtnl_lock_unregistering() takes rtnl_lock() -- a mutex -- inside a > > wait loop. The wait loop relies on current->state to function, but so > > does mutex_lock(), nesting them makes for the inner to destroy the > > outer state. > > > > While you are on it, please fix rtnl_lock_unregistering_all() too? Ah, that's hidden someplace else, sure I can do that. Thanks for pointing it out. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] netdev: Fix sleeping inside wait event 2014-10-29 17:13 ` Peter Zijlstra @ 2014-10-29 17:31 ` Peter Zijlstra 2014-10-29 17:38 ` David Miller 0 siblings, 1 reply; 4+ messages in thread From: Peter Zijlstra @ 2014-10-29 17:31 UTC (permalink / raw) To: Cong Wang Cc: Fengguang Wu, LKP, LKML, oleg@redhat.com, Eric W. Biederman, David Miller, Linux Kernel Network Developers On Wed, Oct 29, 2014 at 06:13:45PM +0100, Peter Zijlstra wrote: > On Wed, Oct 29, 2014 at 09:29:55AM -0700, Cong Wang wrote: > > While you are on it, please fix rtnl_lock_unregistering_all() too? > > Ah, that's hidden someplace else, sure I can do that. Thanks for > pointing it out. Here goes.. --- Subject: netdev: Fix sleeping inside wait event From: Peter Zijlstra <peterz@infradead.org> Date: Wed Oct 29 17:04:56 CET 2014 rtnl_lock_unregistering*() take rtnl_lock() -- a mutex -- inside a wait loop. The wait loop relies on current->state to function, but so does mutex_lock(), nesting them makes for the inner to destroy the outer state. Fix this using the new wait_woken() bits. Cc: David Miller <davem@davemloft.net> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Eric Biederman <ebiederm@xmission.com> Reported-by: Fengguang Wu <fengguang.wu@intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- net/core/dev.c | 10 +++++----- net/core/rtnetlink.c | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) --- a/net/core/dev.c +++ b/net/core/dev.c @@ -7196,11 +7196,10 @@ static void __net_exit rtnl_lock_unregis */ struct net *net; bool unregistering; - DEFINE_WAIT(wait); + DEFINE_WAIT_FUNC(wait, woken_wake_function); + add_wait_queue(&netdev_unregistering_wq, &wait); for (;;) { - prepare_to_wait(&netdev_unregistering_wq, &wait, - TASK_UNINTERRUPTIBLE); unregistering = false; rtnl_lock(); list_for_each_entry(net, net_list, exit_list) { @@ -7212,9 +7211,10 @@ static void __net_exit rtnl_lock_unregis if (!unregistering) break; __rtnl_unlock(); - schedule(); + + wait_woken(&wait, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); } - finish_wait(&netdev_unregistering_wq, &wait); + remove_wait_queue(&netdev_unregistering_wq, &wait); } static void __net_exit default_device_exit_batch(struct list_head *net_list) --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -365,11 +365,10 @@ static void rtnl_lock_unregistering_all( { struct net *net; bool unregistering; - DEFINE_WAIT(wait); + DEFINE_WAIT_FUNC(wait, woken_wake_function); + add_wait_queue(&netdev_unregistering_wq, &wait); for (;;) { - prepare_to_wait(&netdev_unregistering_wq, &wait, - TASK_UNINTERRUPTIBLE); unregistering = false; rtnl_lock(); for_each_net(net) { @@ -381,9 +380,10 @@ static void rtnl_lock_unregistering_all( if (!unregistering) break; __rtnl_unlock(); - schedule(); + + wait_woken(&wait, TASK_UNINTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); } - finish_wait(&netdev_unregistering_wq, &wait); + remove_wait_queue(&netdev_unregistering_wq, &wait); } /** ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] netdev: Fix sleeping inside wait event 2014-10-29 17:31 ` Peter Zijlstra @ 2014-10-29 17:38 ` David Miller 0 siblings, 0 replies; 4+ messages in thread From: David Miller @ 2014-10-29 17:38 UTC (permalink / raw) To: peterz Cc: xiyou.wangcong, fengguang.wu, lkp, linux-kernel, oleg, ebiederm, netdev From: Peter Zijlstra <peterz@infradead.org> Date: Wed, 29 Oct 2014 18:31:10 +0100 > On Wed, Oct 29, 2014 at 06:13:45PM +0100, Peter Zijlstra wrote: >> On Wed, Oct 29, 2014 at 09:29:55AM -0700, Cong Wang wrote: >> > While you are on it, please fix rtnl_lock_unregistering_all() too? >> >> Ah, that's hidden someplace else, sure I can do that. Thanks for >> pointing it out. > > Here goes.. For this as well: Acked-by: David S. Miller <davem@davemloft.net> ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-10-29 17:38 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20141028142541.GA19097@wfg-t540p.sh.intel.com>
[not found] ` <20141029161657.GF3337@twins.programming.kicks-ass.net>
2014-10-29 16:29 ` [PATCH] netdev: Fix sleeping inside wait event Cong Wang
2014-10-29 17:13 ` Peter Zijlstra
2014-10-29 17:31 ` Peter Zijlstra
2014-10-29 17:38 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox