From: Paolo Bonzini <pbonzini@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
rkrcmar@redhat.com, yang.zhang.wz@gmail.com, feng.wu@intel.com
Subject: Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry
Date: Mon, 17 Oct 2016 13:07:16 +0200 [thread overview]
Message-ID: <abe7e9f7-43e5-3d94-1aca-ccc92a491dcc@redhat.com> (raw)
In-Reply-To: <20161016060320-mutt-send-email-mst@kernel.org>
On 16/10/2016 05:21, Michael S. Tsirkin wrote:
> On Fri, Oct 14, 2016 at 08:21:27PM +0200, Paolo Bonzini wrote:
>> On some benchmarks (e.g. netperf with ioeventfd disabled), APICv
>> posted interrupts turn out to be slower than interrupt injection via
>> KVM_REQ_EVENT.
>>
>> This patch optimizes a bit the IRR update, avoiding expensive atomic
>> operations in the common case where PI.ON=0 at vmentry or the PIR vector
>> is mostly zero. This saves at least 20 cycles (1%) per vmexit, as
>> measured by kvm-unit-tests' inl_from_qemu test (20 runs):
>>
>> | enable_apicv=1 | enable_apicv=0
>> | mean stdev | mean stdev
>> ----------|-----------------|------------------
>> before | 5826 32.65 | 5765 47.09
>> after | 5809 43.42 | 5777 77.02
>>
>> Of course, any change in the right column is just placebo effect. :)
>> The savings are bigger if interrupts are frequent.
>>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>> arch/x86/kvm/lapic.c | 6 ++++--
>> arch/x86/kvm/vmx.c | 9 ++++++++-
>> 2 files changed, 12 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
>> index 23b99f305382..63a442aefc12 100644
>> --- a/arch/x86/kvm/lapic.c
>> +++ b/arch/x86/kvm/lapic.c
>> @@ -342,9 +342,11 @@ void __kvm_apic_update_irr(u32 *pir, void *regs)
>> u32 i, pir_val;
>>
>> for (i = 0; i <= 7; i++) {
>> - pir_val = xchg(&pir[i], 0);
>> - if (pir_val)
>> + pir_val = READ_ONCE(pir[i]);
>> + if (pir_val) {
>> + pir_val = xchg(&pir[i], 0);
>> *((u32 *)(regs + APIC_IRR + i * 0x10)) |= pir_val;
>> + }
>> }
>> }
>> EXPORT_SYMBOL_GPL(__kvm_apic_update_irr);
>
> gcc doesn't seem to unroll this loop and it's
> probably worth unrolling it
>
> The following seems to do the trick for me on upstream - I didn't
> benchmark it though. Is there a kvm unit test for interrupts?
No, not yet. Purely from a branch-prediction point of view I wouldn't
be so sure that it's worth unrolling it. Because of the xchg you cannot
make the code branchless, and having a branch per iteration puts some
pressure on the BTB.
This is only a hot path in workloads that have a lot of interrupts and a
lot of vmexits. If it's always the same interrupt (actually the same
group of 32 interrupts) that triggers, then the branch predictor will
predict the history very easily (e.g. 00001000 00001000 00001000...).
Paolo
> --->
>
> kvm: unroll the loop in __kvm_apic_update_irr.
>
> This is hot data path in interrupt-rich workloads, worth unrolling.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>
>
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index b62c852..0c3462c 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -337,7 +337,8 @@ static u8 count_vectors(void *bitmap)
> return count;
> }
>
> -void __kvm_apic_update_irr(u32 *pir, void *regs)
> +void __attribute__((optimize("unroll-loops")))
> +__kvm_apic_update_irr(u32 *pir, void *regs)
> {
> u32 i, pir_val;
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2016-10-17 11:07 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-14 18:21 [PATCH 0/5] KVM: x86: cleanup and minimal speedup for APICv Paolo Bonzini
2016-10-14 18:21 ` [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Paolo Bonzini
2016-10-14 18:50 ` Nadav Amit
2016-10-14 18:56 ` Paolo Bonzini
2016-10-14 19:44 ` Nadav Amit
2016-10-15 7:47 ` Paolo Bonzini
2016-10-16 2:29 ` Michael S. Tsirkin
2016-10-19 11:45 ` Paul E. McKenney
2016-10-26 21:50 ` Michael S. Tsirkin
2016-10-16 3:21 ` Michael S. Tsirkin
2016-10-17 11:07 ` Paolo Bonzini [this message]
2016-10-26 19:53 ` Radim Krčmář
2016-10-26 21:42 ` Michael S. Tsirkin
2016-10-27 16:44 ` Radim Krčmář
2016-10-27 16:51 ` Michael S. Tsirkin
2016-10-27 17:06 ` Radim Krčmář
2016-10-28 9:39 ` Paolo Bonzini
2016-10-28 22:04 ` Michael S. Tsirkin
2016-10-14 18:21 ` [PATCH 2/5] KVM: x86: do not scan IRR twice " Paolo Bonzini
2016-10-18 6:04 ` Wanpeng Li
2016-10-26 19:59 ` Radim Krčmář
2016-11-03 13:30 ` Paolo Bonzini
2016-11-03 13:53 ` Michael S. Tsirkin
2016-11-03 16:01 ` Paolo Bonzini
2016-11-03 15:03 ` Radim Krčmář
2016-11-03 16:00 ` Paolo Bonzini
2016-11-03 18:07 ` Radim Krčmář
2016-11-03 18:18 ` Paolo Bonzini
2016-11-03 18:29 ` Radim Krčmář
2016-11-03 20:16 ` Radim Krčmář
2016-11-04 9:38 ` Paolo Bonzini
2016-10-14 18:21 ` [PATCH 3/5] KVM: x86: do not use KVM_REQ_EVENT for APICv interrupt injection Paolo Bonzini
2016-10-26 20:05 ` Radim Krčmář
2016-10-14 18:21 ` [PATCH 4/5] KVM: x86: remove unnecessary sync_pir_to_irr Paolo Bonzini
2016-10-26 20:28 ` Radim Krčmář
2016-10-14 18:21 ` [PATCH 5/5] KVM: vmx: clear pending interrupts on KVM_SET_LAPIC Paolo Bonzini
2016-10-26 20:08 ` Radim Krčmář
2016-10-26 21:52 ` [PATCH 0/5] KVM: x86: cleanup and minimal speedup for APICv Michael S. Tsirkin
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=abe7e9f7-43e5-3d94-1aca-ccc92a491dcc@redhat.com \
--to=pbonzini@redhat.com \
--cc=feng.wu@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=rkrcmar@redhat.com \
--cc=yang.zhang.wz@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome