Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1501873

Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry

Path csiph.com!aioe.org!bofh.it!news.nic.it!robomod
From Paolo Bonzini <pbonzini@redhat.com>
Newsgroups linux.kernel
Subject Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry
Date Mon, 17 Oct 2016 13:10:01 +0200
Message-ID <stdXP-2H4-1@gated-at.bofh.it> (permalink)
References <ssfoZ-4T2-9@gated-at.bofh.it> <ssfp1-4T2-43@gated-at.bofh.it> <ssKj7-9c-1@gated-at.bofh.it>
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=Yz3KuyIT0N5k1qrMXx9GhHns7NL1WtbCVqoD7jVGwNc=; b=lIrzM7XdQgRWUNxQJaeguIYtZbdfce7MXyKnSDx0CizIs5Qejw3i54pCmO/CPgAJaH SmMa5CTdPnLTsYPPPUps7nBFkBEOCUQwUZNh4cVskYQQVyjvChW4PK9gLxSsiz7jayhd B19K9xOn06XyIKv3IFcmbQFQTpY23kRHBGknCvwrBw/pK1Wg5QaOPE4sqYY6U7+qsocT NsdokCt8Czq3gyc6ma4YPqYgEp6lk5nWZYAZOSo96nRAjiAuXjbDw9WiYKc0AVsVrPQ1 qFodY2T4NYMuVqlw4OFcwdiUhQ1Ossii2hnqSRRRhBeMo4nQh7HZCYWp9R7EltHmixfE TJ3w==
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:subject:to:references:cc:from:message-id :date:user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=Yz3KuyIT0N5k1qrMXx9GhHns7NL1WtbCVqoD7jVGwNc=; b=XUtf0OevCnMG4v8KQTizaWbaWG4zxr/BUIoCH4nOkRJp4o4NsYSBgQO35t/6kOQton FeLPnbH6fR31vTisQzYkA3PJlSrgqbTjUli19pS0i4yvFclAZi91IGVr4niLI/ujl9zB fQYzbuh6KzMcgPjCxFQGcxJmSrvSVFrRazThVzKyepNVFlhnJm0TQswa5ZqQq4u3eSkJ 2kKy+BoFj0gVJQBwLXfRgWYQtzRMok+BEL65bGkvWjsaTyg3JR+rOxjPgW6dxDXHEUbe 1MlPLERv1U0UXwX4y6YEFPMkq4UY1nXH85Pof3c00PFMhBCJwdaiSPhe8AS70OwVfUIj F3Lg==
X-Gm-Message-State AA6/9Rk5tFmhpVayZYRFyOZmZZ7axoeU5W/YXqegTW12LDcN4bhEL+wCt55NjQabMSZQNg==
X-Received by 10.25.211.80 with SMTP id k77mr14101990lfg.71.1476702445077; Mon, 17 Oct 2016 04:07:25 -0700 (PDT)
User-Agent Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0
MIME-Version 1.0
Content-Type text/plain; charset=windows-1252
Content-Transfer-Encoding 7bit
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 93
Organization linux.* mail to news gateway
X-Original-Cc linux-kernel@vger.kernel.org, kvm@vger.kernel.org, rkrcmar@redhat.com, yang.zhang.wz@gmail.com, feng.wu@intel.com
X-Original-Date Mon, 17 Oct 2016 13:07:16 +0200
X-Original-Message-ID <abe7e9f7-43e5-3d94-1aca-ccc92a491dcc@redhat.com>
X-Original-References <1476469291-5039-1-git-send-email-pbonzini@redhat.com> <1476469291-5039-2-git-send-email-pbonzini@redhat.com> <20161016060320-mutt-send-email-mst@kernel.org>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1501873

Show key headers only | View raw



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
> 

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 0/5] KVM: x86: cleanup and minimal speedup for APICv Paolo Bonzini <pbonzini@redhat.com> - 2016-10-14 20:30 +0200
  [PATCH 3/5] KVM: x86: do not use KVM_REQ_EVENT for APICv interrupt injection Paolo Bonzini <pbonzini@redhat.com> - 2016-10-14 20:30 +0200
    Re: [PATCH 3/5] KVM: x86: do not use KVM_REQ_EVENT for APICv  interrupt injection Radim Krčmář <rkrcmar@redhat.com> - 2016-10-26 22:10 +0200
  [PATCH 2/5] KVM: x86: do not scan IRR twice on APICv vmentry Paolo Bonzini <pbonzini@redhat.com> - 2016-10-14 20:30 +0200
    Re: [PATCH 2/5] KVM: x86: do not scan IRR twice on APICv vmentry Wanpeng Li <kernellwp@gmail.com> - 2016-10-18 08:10 +0200
    Re: [PATCH 2/5] KVM: x86: do not scan IRR twice on APICv vmentry Radim Krčmář <rkrcmar@redhat.com> - 2016-10-26 22:00 +0200
  [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Paolo Bonzini <pbonzini@redhat.com> - 2016-10-14 20:30 +0200
    Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Paolo Bonzini <pbonzini@redhat.com> - 2016-10-14 21:00 +0200
      Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Nadav Amit <nadav.amit@gmail.com> - 2016-10-14 21:50 +0200
        Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Paolo Bonzini <pbonzini@redhat.com> - 2016-10-15 09:50 +0200
          Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry "Michael S. Tsirkin" <mst@redhat.com> - 2016-10-16 04:40 +0200
            Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2016-10-19 20:00 +0200
              Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry "Michael S. Tsirkin" <mst@redhat.com> - 2016-10-27 00:00 +0200
    Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Nadav Amit <nadav.amit@gmail.com> - 2016-10-14 21:00 +0200
    Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry "Michael S. Tsirkin" <mst@redhat.com> - 2016-10-16 05:30 +0200
      Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Paolo Bonzini <pbonzini@redhat.com> - 2016-10-17 13:10 +0200
    Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry Radim Krčmář <rkrcmar@redhat.com> - 2016-10-26 22:00 +0200
      Re: [PATCH 1/5] KVM: x86: avoid atomic operations on APICv vmentry "Michael S. Tsirkin" <mst@redhat.com> - 2016-10-26 23:50 +0200
  [PATCH 5/5] KVM: vmx: clear pending interrupts on KVM_SET_LAPIC Paolo Bonzini <pbonzini@redhat.com> - 2016-10-14 20:30 +0200
    Re: [PATCH 5/5] KVM: vmx: clear pending interrupts on KVM_SET_LAPIC Radim Krčmář <rkrcmar@redhat.com> - 2016-10-26 22:10 +0200
  Re: [PATCH 0/5] KVM: x86: cleanup and minimal speedup for APICv "Michael S. Tsirkin" <mst@redhat.com> - 2016-10-27 00:00 +0200

csiph-web