From: Waiman Long <waiman.long@hp.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-arch@vger.kernel.org, riel@redhat.com, x86@kernel.org,
kvm@vger.kernel.org, konrad.wilk@oracle.com, scott.norton@hp.com,
raghavendra.kt@linux.vnet.ibm.com, paolo.bonzini@gmail.com,
oleg@redhat.com, linux-kernel@vger.kernel.org, mingo@redhat.com,
david.vrabel@citrix.com, hpa@zytor.com, luto@amacapital.net,
xen-devel@lists.xenproject.org, tglx@linutronix.de,
paulmck@linux.vnet.ibm.com, torvalds@linux-foundation.org,
boris.ostrovsky@oracle.com,
virtualization@lists.linux-foundation.org, doug.hatch@hp.com
Subject: Re: [PATCH 9/9] qspinlock, x86, kvm: Implement KVM support for paravirt qspinlock
Date: Wed, 18 Mar 2015 22:45:55 -0400 [thread overview]
Message-ID: <550A3863.2060808@hp.com> (raw)
In-Reply-To: <20150316133112.333845162@infradead.org>
[-- Attachment #1.1: Type: text/plain, Size: 1947 bytes --]
On 03/16/2015 09:16 AM, Peter Zijlstra wrote:
> Implement the paravirt qspinlock for x86-kvm.
>
> We use the regular paravirt call patching to switch between:
>
> native_queue_spin_lock_slowpath() __pv_queue_spin_lock_slowpath()
> native_queue_spin_unlock() __pv_queue_spin_unlock()
>
> We use a callee saved call for the unlock function which reduces the
> i-cache footprint and allows 'inlining' of SPIN_UNLOCK functions
> again.
>
> We further optimize the unlock path by patching the direct call with a
> "movb $0,%arg1" if we are indeed using the native unlock code. This
> makes the unlock code almost as fast as the !PARAVIRT case.
>
> This significantly lowers the overhead of having
> CONFIG_PARAVIRT_SPINLOCKS enabled, even for native code.
>
>
> Signed-off-by: Peter Zijlstra (Intel)<peterz@infradead.org>
I do have some concern about this call site patching mechanism as the
modification is not atomic. The spin_unlock() calls are in many places
in the kernel. There is a possibility that a thread is calling a certain
spin_unlock call site while it is being patched by another one with the
alternative() function call.
So far, I don't see any problem with bare metal where
paravirt_patch_insns() is used to patch it to the move instruction.
However, in a virtual guest enivornment where paravirt_patch_call() was
used, there were situations where the system panic because of page fault
on some invalid memory in the kthread. If you look at the
paravirt_patch_call(), you will see:
:
b->opcode = 0xe8; /* call */
b->delta = delta;
If another CPU reads the instruction at the call site at the right
moment, it will get the modified call instruction, but not the new delta
value. It will then jump to a random location. I believe that was
causing the system panic that I saw.
So I think it is kind of risky to use it here unless we can guarantee
that call site patching is atomic wrt other CPUs.
-Longman
[-- Attachment #1.2: Type: text/html, Size: 2703 bytes --]
[-- Attachment #2: Type: text/plain, Size: 183 bytes --]
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2015-03-19 2:45 UTC|newest]
Thread overview: 135+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-16 13:16 [PATCH 0/9] qspinlock stuff -v15 Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 1/9] qspinlock: A simple generic 4-byte queue spinlock Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 2/9] qspinlock, x86: Enable x86-64 to use " Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 3/9] qspinlock: Add pending bit Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 4/9] qspinlock: Extract out code snippets for the next patch Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 5/9] qspinlock: Optimize for smaller NR_CPUS Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 6/9] qspinlock: Use a simple write to grab the lock Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 7/9] qspinlock: Revert to test-and-set on hypervisors Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 8/9] qspinlock: Generic paravirt support Peter Zijlstra
2015-03-16 13:16 ` Peter Zijlstra
2015-03-18 20:50 ` Waiman Long
2015-03-19 10:12 ` Peter Zijlstra
2015-03-19 10:12 ` Peter Zijlstra
2015-03-19 10:12 ` Peter Zijlstra
2015-03-19 12:25 ` Peter Zijlstra
2015-03-19 12:25 ` Peter Zijlstra
2015-03-19 13:43 ` Peter Zijlstra
2015-03-19 13:43 ` Peter Zijlstra
2015-03-19 13:43 ` Peter Zijlstra
2015-03-19 23:25 ` Waiman Long
2015-03-19 23:25 ` Waiman Long
2015-03-19 23:25 ` Waiman Long
2015-04-01 16:20 ` Waiman Long
2015-04-01 16:20 ` Waiman Long
2015-04-01 16:20 ` Waiman Long
2015-04-01 17:12 ` Peter Zijlstra
2015-04-01 17:12 ` Peter Zijlstra
2015-04-01 17:12 ` Peter Zijlstra
2015-04-01 17:42 ` Peter Zijlstra
2015-04-01 17:42 ` Peter Zijlstra
2015-04-01 18:17 ` Peter Zijlstra
2015-04-01 18:17 ` Peter Zijlstra
2015-04-01 18:54 ` Waiman Long
2015-04-01 18:54 ` Waiman Long
2015-04-01 18:48 ` Peter Zijlstra
2015-04-01 18:48 ` Peter Zijlstra
2015-04-01 19:58 ` Waiman Long
2015-04-01 21:03 ` Peter Zijlstra
2015-04-01 21:03 ` Peter Zijlstra
2015-04-01 21:03 ` Peter Zijlstra
2015-04-02 16:28 ` Waiman Long
2015-04-02 17:20 ` Peter Zijlstra
2015-04-02 17:20 ` Peter Zijlstra
2015-04-02 19:48 ` Peter Zijlstra
2015-04-02 19:48 ` Peter Zijlstra
2015-04-03 3:39 ` Waiman Long
2015-04-03 3:39 ` Waiman Long
2015-04-03 3:39 ` Waiman Long
2015-04-03 13:43 ` Peter Zijlstra
2015-04-03 13:43 ` Peter Zijlstra
2015-04-03 13:43 ` Peter Zijlstra
2015-04-02 19:48 ` Peter Zijlstra
2015-04-02 17:20 ` Peter Zijlstra
2015-04-02 16:28 ` Waiman Long
2015-04-02 16:28 ` Waiman Long
2015-04-01 19:58 ` Waiman Long
2015-04-01 19:58 ` Waiman Long
2015-04-01 18:48 ` Peter Zijlstra
2015-04-01 18:54 ` Waiman Long
2015-04-01 18:17 ` Peter Zijlstra
2015-04-01 17:42 ` Peter Zijlstra
2015-04-01 20:10 ` Waiman Long
2015-04-01 20:10 ` Waiman Long
2015-04-01 20:10 ` Waiman Long
2015-03-19 12:25 ` Peter Zijlstra
2015-03-18 20:50 ` Waiman Long
2015-03-16 13:16 ` Peter Zijlstra
2015-03-16 13:16 ` [PATCH 9/9] qspinlock, x86, kvm: Implement KVM support for paravirt qspinlock Peter Zijlstra
2015-03-16 13:16 ` [PATCH 9/9] qspinlock,x86,kvm: " Peter Zijlstra
2015-03-16 13:16 ` [PATCH 9/9] qspinlock, x86, kvm: " Peter Zijlstra
2015-03-19 2:45 ` Waiman Long [this message]
2015-03-19 10:01 ` Peter Zijlstra
2015-03-19 10:01 ` [PATCH 9/9] qspinlock,x86,kvm: " Peter Zijlstra
2015-03-19 10:01 ` Peter Zijlstra
2015-03-19 21:08 ` [PATCH 9/9] qspinlock, x86, kvm: " Waiman Long
2015-03-19 21:08 ` [PATCH 9/9] qspinlock,x86,kvm: " Waiman Long
2015-03-19 21:08 ` [PATCH 9/9] qspinlock, x86, kvm: " Waiman Long
2015-03-20 7:43 ` Raghavendra K T
2015-03-20 7:43 ` [PATCH 9/9] qspinlock,x86,kvm: " Raghavendra K T
2015-03-20 7:43 ` [PATCH 9/9] qspinlock, x86, kvm: " Raghavendra K T
2015-03-19 2:45 ` Waiman Long
2015-03-16 14:08 ` [PATCH 0/9] qspinlock stuff -v15 David Vrabel
2015-03-16 14:08 ` [Xen-devel] " David Vrabel
2015-03-16 14:08 ` David Vrabel
2015-03-16 14:08 ` David Vrabel
2015-03-16 14:08 ` David Vrabel
2015-03-18 20:36 ` Waiman Long
2015-03-18 20:36 ` Waiman Long
2015-03-18 20:36 ` Waiman Long
2015-03-19 18:01 ` [Xen-devel] " David Vrabel
2015-03-19 18:01 ` David Vrabel
2015-03-19 18:01 ` David Vrabel
2015-03-19 18:32 ` Peter Zijlstra
2015-03-19 18:32 ` Peter Zijlstra
2015-03-19 18:32 ` Peter Zijlstra
2015-03-19 18:01 ` David Vrabel
2015-03-25 19:47 ` Konrad Rzeszutek Wilk
2015-03-26 20:21 ` Peter Zijlstra
2015-03-26 20:21 ` Peter Zijlstra
2015-03-26 20:21 ` Peter Zijlstra
2015-03-27 14:07 ` Konrad Rzeszutek Wilk
2015-03-27 14:07 ` Konrad Rzeszutek Wilk
2015-03-27 14:07 ` Konrad Rzeszutek Wilk
2015-03-30 16:41 ` Waiman Long
2015-03-30 16:41 ` Waiman Long
2015-03-30 16:41 ` Waiman Long
2015-03-30 16:25 ` Waiman Long
2015-03-30 16:25 ` Waiman Long
2015-03-30 16:29 ` Peter Zijlstra
2015-03-30 16:29 ` Peter Zijlstra
2015-03-30 16:43 ` Waiman Long
2015-03-30 16:43 ` Waiman Long
2015-03-30 16:43 ` Waiman Long
2015-03-30 16:29 ` Peter Zijlstra
2015-03-30 16:25 ` Waiman Long
2015-03-25 19:47 ` Konrad Rzeszutek Wilk
2015-03-25 19:47 ` Konrad Rzeszutek Wilk
2015-03-27 6:40 ` Raghavendra K T
2015-03-27 6:40 ` Raghavendra K T
2015-03-27 6:40 ` Raghavendra K T
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=550A3863.2060808@hp.com \
--to=waiman.long@hp.com \
--cc=boris.ostrovsky@oracle.com \
--cc=david.vrabel@citrix.com \
--cc=doug.hatch@hp.com \
--cc=hpa@zytor.com \
--cc=konrad.wilk@oracle.com \
--cc=kvm@vger.kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=mingo@redhat.com \
--cc=oleg@redhat.com \
--cc=paolo.bonzini@gmail.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=raghavendra.kt@linux.vnet.ibm.com \
--cc=riel@redhat.com \
--cc=scott.norton@hp.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=virtualization@lists.linux-foundation.org \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.