Instead of repeatedly calling kmalloc() to allocate the per-cpu VFP state, use alloc_percpu()/free_percpu(). Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> --- arch/arm/kvm/arm.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 4e12da8..8d8bf72 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -51,7 +51,7 @@ __asm__(".arch_extension virt"); #endif static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page); -static DEFINE_PER_CPU(struct vfp_hard_struct *, kvm_host_vfp_state); +static struct vfp_hard_struct __percpu *kvm_host_vfp_state; /* Per-CPU variable containing the currently running vcpu. */ static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu); @@ -323,7 +323,7 @@ void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) { vcpu->cpu = cpu; - vcpu->arch.vfp_host = __get_cpu_var(kvm_host_vfp_state); + vcpu->arch.vfp_host = this_cpu_ptr(kvm_host_vfp_state); /* * Check whether this vcpu requires the cache to be flushed on @@ -963,17 +963,17 @@ static int init_hyp_mode(void) /* * Map the host VFP structures */ + kvm_host_vfp_state = alloc_percpu(struct vfp_hard_struct); + if (!kvm_host_vfp_state) { + err = -ENOMEM; + kvm_err("Cannot allocate host VFP state\n"); + goto out_free_mappings; + } + for_each_possible_cpu(cpu) { struct vfp_hard_struct *vfp; - vfp = kmalloc(sizeof(*vfp), GFP_KERNEL); - if (!vfp) { - kvm_err("Not enough memory for vfp struct\n"); - goto out_free_vfp; - } - - memset(vfp, 0, sizeof(*vfp)); - per_cpu(kvm_host_vfp_state, cpu) = vfp; + vfp = per_cpu_ptr(kvm_host_vfp_state, cpu); err = create_hyp_mappings(vfp, vfp + 1); if (err) { @@ -998,8 +998,7 @@ static int init_hyp_mode(void) return 0; out_free_vfp: - for_each_possible_cpu(cpu) - kfree(per_cpu(kvm_host_vfp_state, cpu)); + free_percpu(kvm_host_vfp_state); out_free_mappings: free_hyp_pmds(); out_free_stack_pages: @@ -1086,9 +1085,8 @@ void kvm_arch_exit(void) exit_hyp_mode(); free_hyp_pmds(); + free_percpu(kvm_host_vfp_state); for_each_possible_cpu(cpu) { - kfree(per_cpu(kvm_host_vfp_state, cpu)); - per_cpu(kvm_host_vfp_state, cpu) = NULL; free_page(per_cpu(kvm_arm_hyp_stack_page, cpu)); per_cpu(kvm_arm_hyp_stack_page, cpu) = 0; } -- 1.7.11.4 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm