From: Marc Zyngier <marc.zyngier@arm.com>
To: Christoffer Dall <christoffer.dall@linaro.org>
Cc: linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org,
kvmarm@lists.cs.columbia.edu
Subject: Re: [PATCH 7/7] arm64: KVM: vgic-v3: Relax synchronization when SRE==1
Date: Tue, 24 May 2016 14:02:19 +0100 [thread overview]
Message-ID: <574450DB.5010409@arm.com> (raw)
In-Reply-To: <20160524125233.GG3582@cbox>
On 24/05/16 13:52, Christoffer Dall wrote:
> On Mon, May 23, 2016 at 01:37:03PM +0100, Marc Zyngier wrote:
>> The GICv3 backend of the vgic is quite barrier heavy, in order
>> to ensure synchronization of the system registers and the
>> memory mapped view for a potential GICv2 guest.
>>
>> But when the guest is using a GICv3 model, there is absolutely
>> no need to execute all these heavy barriers, and it is actually
>> beneficial to avoid them altogether.
>>
>> This patch makes the synchonization conditional, and ensures
>> that we do not change the EL1 SRE settings if we do not need to.
>>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> ---
>> arch/arm64/kvm/hyp/vgic-v3-sr.c | 23 ++++++++++++++++-------
>> 1 file changed, 16 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm64/kvm/hyp/vgic-v3-sr.c b/arch/arm64/kvm/hyp/vgic-v3-sr.c
>> index 40c3b4c..5f8f80b 100644
>> --- a/arch/arm64/kvm/hyp/vgic-v3-sr.c
>> +++ b/arch/arm64/kvm/hyp/vgic-v3-sr.c
>> @@ -169,7 +169,8 @@ void __hyp_text __vgic_v3_save_state(struct kvm_vcpu *vcpu)
>> * Make sure stores to the GIC via the memory mapped interface
>> * are now visible to the system register interface.
>> */
>> - dsb(st);
>> + if (!cpu_if->vgic_sre)
>> + dsb(st);
>>
>> cpu_if->vgic_vmcr = read_gicreg(ICH_VMCR_EL2);
>>
>> @@ -235,8 +236,12 @@ void __hyp_text __vgic_v3_save_state(struct kvm_vcpu *vcpu)
>>
>> val = read_gicreg(ICC_SRE_EL2);
>> write_gicreg(val | ICC_SRE_EL2_ENABLE, ICC_SRE_EL2);
>> - isb(); /* Make sure ENABLE is set at EL2 before setting SRE at EL1 */
>> - write_gicreg(1, ICC_SRE_EL1);
>> +
>> + if (!cpu_if->vgic_sre) {
>> + /* Make sure ENABLE is set at EL2 before setting SRE at EL1 */
>> + isb();
>> + write_gicreg(1, ICC_SRE_EL1);
>
> why the change in behavior to only write 1 to the register when
> (!cpu_if->vgic_sre) ?
If we're on a GICv3 host and emulating a GICv3 guest, then we never
changed the SRE mode (i.e. it is still set to 1). The only case we
change it is when we when have a GICv2 guest (i.e. when vgic_sre is zero).
So there is no need to restore the host configuration unless we actually
changed it...
>
>> + }
>> }
>>
>> void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu)
>> @@ -255,8 +260,10 @@ void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu)
>> * been actually programmed with the value we want before
>> * starting to mess with the rest of the GIC.
>> */
>> - write_gicreg(cpu_if->vgic_sre, ICC_SRE_EL1);
>> - isb();
>> + if (!cpu_if->vgic_sre) {
>> + write_gicreg(0, ICC_SRE_EL1);
>> + isb();
>> + }
... here.
Does it make sense? I could also split this as part of another patch if
you think that's clearer.
M.
--
Jazz is not dead. It just smells funny...
WARNING: multiple messages have this Message-ID (diff)
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 7/7] arm64: KVM: vgic-v3: Relax synchronization when SRE==1
Date: Tue, 24 May 2016 14:02:19 +0100 [thread overview]
Message-ID: <574450DB.5010409@arm.com> (raw)
In-Reply-To: <20160524125233.GG3582@cbox>
On 24/05/16 13:52, Christoffer Dall wrote:
> On Mon, May 23, 2016 at 01:37:03PM +0100, Marc Zyngier wrote:
>> The GICv3 backend of the vgic is quite barrier heavy, in order
>> to ensure synchronization of the system registers and the
>> memory mapped view for a potential GICv2 guest.
>>
>> But when the guest is using a GICv3 model, there is absolutely
>> no need to execute all these heavy barriers, and it is actually
>> beneficial to avoid them altogether.
>>
>> This patch makes the synchonization conditional, and ensures
>> that we do not change the EL1 SRE settings if we do not need to.
>>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> ---
>> arch/arm64/kvm/hyp/vgic-v3-sr.c | 23 ++++++++++++++++-------
>> 1 file changed, 16 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm64/kvm/hyp/vgic-v3-sr.c b/arch/arm64/kvm/hyp/vgic-v3-sr.c
>> index 40c3b4c..5f8f80b 100644
>> --- a/arch/arm64/kvm/hyp/vgic-v3-sr.c
>> +++ b/arch/arm64/kvm/hyp/vgic-v3-sr.c
>> @@ -169,7 +169,8 @@ void __hyp_text __vgic_v3_save_state(struct kvm_vcpu *vcpu)
>> * Make sure stores to the GIC via the memory mapped interface
>> * are now visible to the system register interface.
>> */
>> - dsb(st);
>> + if (!cpu_if->vgic_sre)
>> + dsb(st);
>>
>> cpu_if->vgic_vmcr = read_gicreg(ICH_VMCR_EL2);
>>
>> @@ -235,8 +236,12 @@ void __hyp_text __vgic_v3_save_state(struct kvm_vcpu *vcpu)
>>
>> val = read_gicreg(ICC_SRE_EL2);
>> write_gicreg(val | ICC_SRE_EL2_ENABLE, ICC_SRE_EL2);
>> - isb(); /* Make sure ENABLE is set at EL2 before setting SRE at EL1 */
>> - write_gicreg(1, ICC_SRE_EL1);
>> +
>> + if (!cpu_if->vgic_sre) {
>> + /* Make sure ENABLE is set at EL2 before setting SRE at EL1 */
>> + isb();
>> + write_gicreg(1, ICC_SRE_EL1);
>
> why the change in behavior to only write 1 to the register when
> (!cpu_if->vgic_sre) ?
If we're on a GICv3 host and emulating a GICv3 guest, then we never
changed the SRE mode (i.e. it is still set to 1). The only case we
change it is when we when have a GICv2 guest (i.e. when vgic_sre is zero).
So there is no need to restore the host configuration unless we actually
changed it...
>
>> + }
>> }
>>
>> void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu)
>> @@ -255,8 +260,10 @@ void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu)
>> * been actually programmed with the value we want before
>> * starting to mess with the rest of the GIC.
>> */
>> - write_gicreg(cpu_if->vgic_sre, ICC_SRE_EL1);
>> - isb();
>> + if (!cpu_if->vgic_sre) {
>> + write_gicreg(0, ICC_SRE_EL1);
>> + isb();
>> + }
... here.
Does it make sense? I could also split this as part of another patch if
you think that's clearer.
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2016-05-24 13:02 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-23 12:36 [PATCH 0/7] vgic fixes for 4.7-rc1 Marc Zyngier
2016-05-23 12:36 ` Marc Zyngier
2016-05-23 12:36 ` [PATCH 1/7] KVM: arm/arm64: vgic-v2: Clear all dirty LRs Marc Zyngier
2016-05-23 12:36 ` Marc Zyngier
2016-05-23 12:36 ` [PATCH 2/7] KVM: arm/arm64: vgic-v3: " Marc Zyngier
2016-05-23 12:36 ` Marc Zyngier
2016-05-23 12:36 ` [PATCH 3/7] KVM: arm/arm64: vgic-v2: Always resample level interrupts Marc Zyngier
2016-05-23 12:36 ` Marc Zyngier
2016-05-23 14:19 ` Christoffer Dall
2016-05-23 14:19 ` Christoffer Dall
2016-05-23 14:41 ` Marc Zyngier
2016-05-23 14:41 ` Marc Zyngier
2016-05-23 12:37 ` [PATCH 4/7] KVM: arm/arm64: vgic-v3: " Marc Zyngier
2016-05-23 12:37 ` Marc Zyngier
2016-05-23 14:19 ` Christoffer Dall
2016-05-23 14:19 ` Christoffer Dall
2016-05-23 12:37 ` [PATCH 5/7] arm64: KVM: Make ICC_SRE_EL1 access return the configured SRE value Marc Zyngier
2016-05-23 12:37 ` Marc Zyngier
2016-05-24 12:45 ` Christoffer Dall
2016-05-24 12:45 ` Christoffer Dall
2016-05-23 12:37 ` [PATCH 6/7] arm64: KVM: vgic-v3: Prevent the guest from messing with ICC_SRE_EL1 Marc Zyngier
2016-05-23 12:37 ` Marc Zyngier
2016-05-24 12:49 ` Christoffer Dall
2016-05-24 12:49 ` Christoffer Dall
2016-05-23 12:37 ` [PATCH 7/7] arm64: KVM: vgic-v3: Relax synchronization when SRE==1 Marc Zyngier
2016-05-23 12:37 ` Marc Zyngier
2016-05-24 12:52 ` Christoffer Dall
2016-05-24 12:52 ` Christoffer Dall
2016-05-24 13:02 ` Marc Zyngier [this message]
2016-05-24 13:02 ` Marc Zyngier
2016-05-24 13:18 ` Christoffer Dall
2016-05-24 13:18 ` Christoffer Dall
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=574450DB.5010409@arm.com \
--to=marc.zyngier@arm.com \
--cc=christoffer.dall@linaro.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.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.