lkml.org 
[lkml]   [2014]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 11/11] qspinlock, kvm: Add paravirt support
On 06/15/2014 06:17 PM, Peter Zijlstra wrote:
> Signed-off-by: Peter Zijlstra<peterz@infradead.org>
> ---
[...]
> +
> +void kvm_wait(int *ptr, int val)
> +{
> + unsigned long flags;
> +
> + if (in_nmi())
> + return;
> +
> + /*
> + * Make sure an interrupt handler can't upset things in a
> + * partially setup state.
> + */

I am seeing hang with even 2 cpu guest (with patches on top of 3.15-rc6 ).
looking further with gdb I see one cpu is stuck with native_halt with
slowpath flag(_Q_LOCKED_SLOW) set when it was called.

(gdb) bt
#0 native_halt () at /test/master/arch/x86/include/asm/irqflags.h:55
#1 0xffffffff81033118 in halt (ptr=0xffffffff81eb0e58, val=524291) at
/test/master/arch/x86/include/asm/paravirt.h:116
#2 kvm_wait (ptr=0xffffffff81eb0e58, val=524291) at
arch/x86/kernel/kvm.c:835
#3 kvm_wait (ptr=0xffffffff81eb0e58, val=524291) at
arch/x86/kernel/kvm.c:809
#4 0xffffffff810a2d8e in pv_wait (lock=0xffffffff81eb0e58) at
/test/master/arch/x86/include/asm/paravirt.h:744
#5 __pv_wait_head (lock=0xffffffff81eb0e58) at
kernel/locking/qspinlock.c:352

Value of lock seem to be 524288 (means already unlocked?)
So apart from races Waiman mentioned, are we also in need of smp_mb()
here and/or native_queue_unlock()?.

Interestingly I see other cpu stuck at multi_cpu_stop().

(gdb) thr 1
[Switching to thread 1 (Thread 1)]#0 multi_cpu_stop
(data=0xffff8802140d1da0) at kernel/stop_machine.c:192
192 if (msdata->state != curstate) {

Or is it I am missing something.

please let me know if .config need to be shared.

> + local_irq_save(flags);
> +
> + /*
> + * check again make sure it didn't become free while
> + * we weren't looking.
> + */
> + if (ACCESS_ONCE(*ptr) != val)
> + goto out;
> +
> + /*
> + * halt until it's our turn and kicked. Note that we do safe halt
> + * for irq enabled case to avoid hang when lock info is overwritten
> + * in irq spinlock slowpath and no spurious interrupt occur to save us.
> + */
> + if (arch_irqs_disabled_flags(flags))
> + halt();
> + else
> + safe_halt();
> +
> +out:
> + local_irq_restore(flags);
> +}
> +#endif /* QUEUE_SPINLOCK */



\
 
 \ /
  Last update: 2014-06-22 19:21    [W:0.421 / U:0.088 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site