kvm: x86: Avoid runtime allocation of xsave buffer
PATCH 1/1 kvm: x86: Avoid runtime allocation of xsave buffer
Keep a per-VCPU xsave buffer for kvm_put/get_xsave instead of continuously allocating and freeing it on state sync.
Signed-off-by Jan Kiszka <[email protected]>
--- target-i386/cpu.h | 3 ++- target-i386/kvm.c | 15 +++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-)
target-i386/cpu.h +2 -1
@@ -751,7 +751,8 @@ typedef struct CPUX86State {uint32_t cpuid_svm_features;bool tsc_valid;int tsc_khz; - +void *kvm_xsave_buf; +/* in order to simplify APIC support, we leave this pointer to the user */ struct DeviceState *apic_state;
target-i386/kvm.c +7 -8
@@ -516,6 +516,10 @@ int kvm_arch_init_vcpu(CPUState *env) } } +if (kvm_has_xsave ()) { + env->kvm_xsave_buf =qemu_memalign (4096 ,sizeof (struct kvm_xsave )); + } +return 0 ; }
@@ -769,15 +773,14 @@ static int kvm_put_fpu(CPUState *env)static int kvm_put_xsave (CPUState *env) { -int i, r; -struct kvm_xsave * xsave; +struct kvm_xsave * xsave = env->kvm_xsave_buf;uint16_t cwd, swd, twd; +int i, r;if (!kvm_has_xsave ()) {return kvm_put_fpu (env); } - xsave =qemu_memalign (4096 ,sizeof (struct kvm_xsave ));memset (xsave,0 ,sizeof (struct kvm_xsave )); twd =0 ; swd = env->fpus & ~(7 <<11 );
@@ -799,7 +802,6 @@ static int kvm_put_xsave(CPUState *env)memcpy (&xsave->region[XSAVE_YMMH_SPACE ], env->ymmh_regs,sizeof env->ymmh_regs); r =kvm_vcpu_ioctl (env,KVM_SET_XSAVE , xsave); -g_free (xsave);return r; }
@@ -976,7 +978,7 @@ static int kvm_get_fpu(CPUState *env)static int kvm_get_xsave (CPUState *env) { -struct kvm_xsave * xsave; +struct kvm_xsave * xsave = env->kvm_xsave_buf;int ret, i;uint16_t cwd, swd, twd;
@@ -984,10 +986,8 @@ static int kvm_get_xsave(CPUState *env)return kvm_get_fpu (env); } - xsave =qemu_memalign (4096 ,sizeof (struct kvm_xsave )); ret =kvm_vcpu_ioctl (env,KVM_GET_XSAVE , xsave);if (ret <0 ) { -g_free (xsave);return ret; }
@@ -1011,7 +1011,6 @@ static int kvm_get_xsave(CPUState *env) env->xstate_bv = *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV ];memcpy (env->ymmh_regs, &xsave->region[XSAVE_YMMH_SPACE ],sizeof env->ymmh_regs); -g_free (xsave);return 0 ; }
Signature · 1 line
1.7.3.4
Marcelo Tosatti
AppliedQuoted 8 lines · Jan Kiszka
Keep a per-VCPU xsave buffer for kvm_put/get_xsave instead of continuously allocating and freeing it on state sync.
Signed-off-by Jan Kiszka <[email protected]>--- target-i386/cpu.h | 3 ++- target-i386/kvm.c | 15 +++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-)
Applied both, thanks.