From: m.smarduch@samsung•com (Mario Smarduch)
To: linux-arm-kernel@lists•infradead.org
Subject: [PATCH v3 1/2] arm64: KVM: Optimize arm64 skip 30-50% vfp/simd save/restore on exits
Date: Thu, 02 Jul 2015 14:51:57 -0700 [thread overview]
Message-ID: <5595B27D.90201@samsung.com> (raw)
In-Reply-To: <20150701134649.GG11332@cbox>
On 07/01/2015 06:46 AM, Christoffer Dall wrote:
> On Wed, Jun 24, 2015 at 05:04:11PM -0700, Mario Smarduch wrote:
>> This patch only saves and restores FP/SIMD registers on Guest access. To do
>> this cptr_el2 FP/SIMD trap is set on Guest entry and later checked on exit.
>> lmbench, hackbench show significant improvements, for 30-50% exits FP/SIMD
>> context is not saved/restored
>>
>> Signed-off-by: Mario Smarduch <m.smarduch@samsung•com>
>> ---
>> arch/arm64/include/asm/kvm_arm.h | 5 ++++-
>> arch/arm64/kvm/hyp.S | 46 +++++++++++++++++++++++++++++++++++---
>> 2 files changed, 47 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
>> index ac6fafb..7605e09 100644
>> --- a/arch/arm64/include/asm/kvm_arm.h
>> +++ b/arch/arm64/include/asm/kvm_arm.h
>> @@ -171,10 +171,13 @@
>> #define HSTR_EL2_TTEE (1 << 16)
>> #define HSTR_EL2_T(x) (1 << x)
>>
>> +/* Hyp Coproccessor Trap Register Shifts */
>> +#define CPTR_EL2_TFP_SHIFT 10
>> +
>> /* Hyp Coprocessor Trap Register */
>> #define CPTR_EL2_TCPAC (1 << 31)
>> #define CPTR_EL2_TTA (1 << 20)
>> -#define CPTR_EL2_TFP (1 << 10)
>> +#define CPTR_EL2_TFP (1 << CPTR_EL2_TFP_SHIFT)
>>
>> /* Hyp Debug Configuration Register bits */
>> #define MDCR_EL2_TDRA (1 << 11)
>> diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S
>> index 5befd01..de0788f 100644
>> --- a/arch/arm64/kvm/hyp.S
>> +++ b/arch/arm64/kvm/hyp.S
>> @@ -673,6 +673,15 @@
>> tbz \tmp, #KVM_ARM64_DEBUG_DIRTY_SHIFT, \target
>> .endm
>>
>> +/*
>> + * Check cptr VFP/SIMD accessed bit, if set VFP/SIMD not accessed by guest.
>
> This comment doesn't really help me understand the function, may I
> suggest:
>
> Branch to target if CPTR_EL2.TFP bit is set (VFP/SIMD trapping enabled)
Yes actually describes what it does.
>
>> + */
>> +.macro skip_fpsimd_state tmp, target
>> + mrs \tmp, cptr_el2
>> + tbnz \tmp, #CPTR_EL2_TFP_SHIFT, \target
>> +.endm
>> +
>> +
>> .macro compute_debug_state target
>> // Compute debug state: If any of KDE, MDE or KVM_ARM64_DEBUG_DIRTY
>> // is set, we do a full save/restore cycle and disable trapping.
>> @@ -763,6 +772,7 @@
>> ldr x2, [x0, #VCPU_HCR_EL2]
>> msr hcr_el2, x2
>> mov x2, #CPTR_EL2_TTA
>> + orr x2, x2, #CPTR_EL2_TFP
>> msr cptr_el2, x2
>>
>> mov x2, #(1 << 15) // Trap CP15 Cr=15
>> @@ -785,7 +795,6 @@
>> .macro deactivate_traps
>> mov x2, #HCR_RW
>> msr hcr_el2, x2
>> - msr cptr_el2, xzr
>> msr hstr_el2, xzr
>>
>> mrs x2, mdcr_el2
>> @@ -912,6 +921,28 @@ __restore_fpsimd:
>> restore_fpsimd
>> ret
>>
>> +switch_to_guest_fpsimd:
>> + push x4, lr
>> +
>> + mrs x2, cptr_el2
>> + bic x2, x2, #CPTR_EL2_TFP
>> + msr cptr_el2, x2
>> +
>> + mrs x0, tpidr_el2
>> +
>> + ldr x2, [x0, #VCPU_HOST_CONTEXT]
>> + kern_hyp_va x2
>> + bl __save_fpsimd
>> +
>> + add x2, x0, #VCPU_CONTEXT
>> + bl __restore_fpsimd
>> +
>> + pop x4, lr
>> + pop x2, x3
>> + pop x0, x1
>> +
>> + eret
>> +
>> /*
>> * u64 __kvm_vcpu_run(struct kvm_vcpu *vcpu);
>> *
>> @@ -932,7 +963,6 @@ ENTRY(__kvm_vcpu_run)
>> kern_hyp_va x2
>>
>> save_host_regs
>> - bl __save_fpsimd
>> bl __save_sysregs
>>
>> compute_debug_state 1f
>> @@ -948,7 +978,6 @@ ENTRY(__kvm_vcpu_run)
>> add x2, x0, #VCPU_CONTEXT
>>
>> bl __restore_sysregs
>> - bl __restore_fpsimd
>>
>> skip_debug_state x3, 1f
>> bl __restore_debug
>> @@ -967,7 +996,9 @@ __kvm_vcpu_return:
>> add x2, x0, #VCPU_CONTEXT
>>
>> save_guest_regs
>> + skip_fpsimd_state x3, 1f
>> bl __save_fpsimd
>> +1:
>> bl __save_sysregs
>>
>> skip_debug_state x3, 1f
>> @@ -986,7 +1017,11 @@ __kvm_vcpu_return:
>> kern_hyp_va x2
>>
>> bl __restore_sysregs
>> + skip_fpsimd_state x3, 1f
>> bl __restore_fpsimd
>> +1:
>> + /* Clear FPSIMD and Trace trapping */
>> + msr cptr_el2, xzr
>
> why not simply move the deactivate_traps down here instead?
Putting deactivate_traps there trashes x2, setup earlier
to restore debug, host registers from host context
Do we want deactivate_traps to use another register and
move the macro there? Or leave as is?
- Mario
>
>>
>> skip_debug_state x3, 1f
>> // Clear the dirty flag for the next run, as all the state has
>> @@ -1201,6 +1236,11 @@ el1_trap:
>> * x1: ESR
>> * x2: ESR_EC
>> */
>> +
>> + /* Guest accessed VFP/SIMD registers, save host, restore Guest */
>> + cmp x2, #ESR_ELx_EC_FP_ASIMD
>> + b.eq switch_to_guest_fpsimd
>> +
>> cmp x2, #ESR_ELx_EC_DABT_LOW
>> mov x0, #ESR_ELx_EC_IABT_LOW
>> ccmp x2, x0, #4, ne
>> --
>> 1.7.9.5
>>
>
> Otherwise looks good,
> -Christoffer
>
next prev parent reply other threads:[~2015-07-02 21:51 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-25 0:04 [PATCH v3 0/2] arm/arm64: KVM: Optimize arm64 fp/simd, saves 30-50% on exits Mario Smarduch
2015-06-25 0:04 ` [PATCH v3 1/2] arm64: KVM: Optimize arm64 skip 30-50% vfp/simd save/restore " Mario Smarduch
2015-07-01 13:46 ` Christoffer Dall
2015-07-02 21:51 ` Mario Smarduch [this message]
2015-07-03 11:53 ` Christoffer Dall
2015-07-03 18:56 ` Mario Smarduch
2015-06-25 0:04 ` [PATCH v3 2/2] arm: KVM: keep arm vfp/simd exit handling consistent with arm64 Mario Smarduch
2015-07-01 13:50 ` Christoffer Dall
2015-07-01 9:49 ` [PATCH v3 0/2] arm/arm64: KVM: Optimize arm64 fp/simd, saves 30-50% on exits Christoffer Dall
2015-07-02 17:49 ` Mario Smarduch
2015-07-02 20:58 ` 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=5595B27D.90201@samsung.com \
--to=m.smarduch@samsung$(echo .)com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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