public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* deadlock between cpu_stopper & native_flush_tlb_others()->smp_call_function_many()
@ 2014-03-03 16:43 Igor Mammedov
  2014-03-03 16:45 ` Rik van Riel
  0 siblings, 1 reply; 3+ messages in thread
From: Igor Mammedov @ 2014-03-03 16:43 UTC (permalink / raw)
  To: linux-kernel; +Cc: prarit, riel, mgorman, peterz, alex.shi, Igor Mammedov, hpa

It looks like I hit a deadlock between smp_call_function_many() and
cpu_stopper threads.

Where smp_call_function_many() on CPU1 called from
native_flush_tlb_others() waits on call to be complete on
CPU2 while CPU2 waits on state synchronization in
multi_cpu_stop() which can't be completed until stop work
queued on CPU1 is completed, which can't be done since  CPU1
is busy looping in smp_call_function_many().


CPU1                                       CPU2
stop_machine()
 queue stop work on cpu 1&2

native_flush_tlb_others()
   smp_call_function_many()
      ...
---------------------------------------------------------
                                    cpu_stopper_thread()
                                       multi_cpu_stop()
                                          do {
                                             ...
                                             msdata->state == MULTI_STOP_PREPARE
                                             msdata->active_cpus == 0110
                                             msdata->thread_ack == 1
                                          } while (curstate != MULTI_STOP_EXIT)
                                    waiting until CPU1 ACKs state, i.e. thread_ack == 0
---------------------------------------------------------                                    
      ...
      if (wait) {
         for_cpu(0110) {
           csd_lock_wait(csd);
waiting until call on CPU2 is completed

Are there any suggestions on how to fix this nicely?

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: deadlock between cpu_stopper & native_flush_tlb_others()->smp_call_function_many()
  2014-03-03 16:43 deadlock between cpu_stopper & native_flush_tlb_others()->smp_call_function_many() Igor Mammedov
@ 2014-03-03 16:45 ` Rik van Riel
  2014-03-05 16:49   ` Igor Mammedov
  0 siblings, 1 reply; 3+ messages in thread
From: Rik van Riel @ 2014-03-03 16:45 UTC (permalink / raw)
  To: Igor Mammedov, linux-kernel; +Cc: prarit, mgorman, peterz, alex.shi, hpa

On 03/03/2014 11:43 AM, Igor Mammedov wrote:
> It looks like I hit a deadlock between smp_call_function_many() and
> cpu_stopper threads.

> Are there any suggestions on how to fix this nicely?

This patch should fix it:

https://lkml.org/lkml/2014/2/28/194

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: deadlock between cpu_stopper & native_flush_tlb_others()->smp_call_function_many()
  2014-03-03 16:45 ` Rik van Riel
@ 2014-03-05 16:49   ` Igor Mammedov
  0 siblings, 0 replies; 3+ messages in thread
From: Igor Mammedov @ 2014-03-05 16:49 UTC (permalink / raw)
  To: Rik van Riel; +Cc: linux-kernel, prarit, mgorman, peterz, alex.shi, hpa

On Mon, 03 Mar 2014 11:45:04 -0500
Rik van Riel <riel@redhat.com> wrote:

> On 03/03/2014 11:43 AM, Igor Mammedov wrote:
> > It looks like I hit a deadlock between smp_call_function_many() and
> > cpu_stopper threads.
> 
> > Are there any suggestions on how to fix this nicely?
> 
> This patch should fix it:
> 
> https://lkml.org/lkml/2014/2/28/194

I've just tried it and it doesn't fix issue.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-03-05 16:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-03 16:43 deadlock between cpu_stopper & native_flush_tlb_others()->smp_call_function_many() Igor Mammedov
2014-03-03 16:45 ` Rik van Riel
2014-03-05 16:49   ` Igor Mammedov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox