Use kvzalloc() to allocate KVM's buffer for SEV-ES's GHCB scratch area so that KVM falls back to __vmalloc() if physically contiguous memory isn't available. The buffer is purely a KVM software construct, i.e. there's no need for it to be physically contiguous, and at a max allowed size of 16kb it's just large enough that kzalloc() could feasibly fail due to memory fragmentation. Cc: Tom Lendacky <thomas.lendacky@xxxxxxx> Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> --- arch/x86/kvm/svm/sev.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c index ea8069c9b5cb..2d5a0eea27ea 100644 --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -2030,7 +2030,7 @@ void sev_free_vcpu(struct kvm_vcpu *vcpu) __free_page(virt_to_page(svm->vmsa)); if (svm->ghcb_sa_free) - kfree(svm->ghcb_sa); + kvfree(svm->ghcb_sa); } static void dump_ghcb(struct vcpu_svm *svm) @@ -2262,7 +2262,7 @@ void sev_es_unmap_ghcb(struct vcpu_svm *svm) svm->ghcb_sa_sync = false; } - kfree(svm->ghcb_sa); + kvfree(svm->ghcb_sa); svm->ghcb_sa = NULL; svm->ghcb_sa_free = false; } @@ -2350,7 +2350,7 @@ static int setup_vmgexit_scratch(struct vcpu_svm *svm, bool sync, u64 len) len, GHCB_SCRATCH_AREA_LIMIT); return -EINVAL; } - scratch_va = kzalloc(len, GFP_KERNEL_ACCOUNT); + scratch_va = kvzalloc(len, GFP_KERNEL_ACCOUNT); if (!scratch_va) return -ENOMEM; @@ -2358,7 +2358,7 @@ static int setup_vmgexit_scratch(struct vcpu_svm *svm, bool sync, u64 len) /* Unable to copy scratch area from guest */ pr_err("vmgexit: kvm_read_guest for scratch area failed\n"); - kfree(scratch_va); + kvfree(scratch_va); return -EFAULT; } -- 2.34.0.rc0.344.g81b53c2807-goog