From nobody Sun Dec 14 12:18:18 2025 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 310A72080F4 for ; Fri, 23 May 2025 01:00:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747962033; cv=none; b=un2K9Fk4npaFhUAUlMJqXBpKI1iYd5N53GaEVgmRfb7znVud1Eyxivy7IrgGeOYTftp1vIi1MW73kA2PrkXGjr5u1/m/fbqnTSE9hu3K8Eusm8KN7G+9e7ZmnxJeO0uBU/q/dMQhz4iN474OoCAPGwBJL0w87wTunXKbEC3VARw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747962033; c=relaxed/simple; bh=1u7yaWCSV8swor7EDb2Vzxng28EOGOs32xp2c0ARZ8M=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=EHKRBsFbJ66DSI1vwgiyW+LspWV0xoFV1cKs2ZyqvirBJs5KhX3AgcRQiHe82muTZ2NT4amVkZQUbbtkxxpN0IDznuruCW8I+a8uninGtelXEG9lF+DtzdqII9dTp9EI7jecXIX9qvD8ItwAb8kEF848Xhfr/6cYU++IelCqzUo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=14abEIiv; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--seanjc.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="14abEIiv" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-30eac9886ffso4645058a91.1 for ; Thu, 22 May 2025 18:00:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1747962031; x=1748566831; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=TWVWI0HB+j/yivqbFmMmYR1x9Y24z6jTPvGpz798n6o=; b=14abEIiv5opjbAde1BUd+QC3oZpNYvnuC8Ndzaq+7jIlDPbuWIrcuNvzZkrX6GFiih oNaN3+zg49OPGCxjVYekwPbdF0pMNNYE7IL81PerEJ4Y6k4MvM6bg1Wu8fois4aXjQZb kAl5Po0CWtLoYGCec6YQ6KTf7SHyOLAPU97Oxr1EHSNOMgKYlxpSBTS3XGhVQZ4qVr+F qGSR6XvxurB+zY5MDRpkLTjhaxQp9Xr3+jX+JkkCf9n5NQMJTwDsO7WCuB86McJ2izn5 MBBkDS3JUgT04tfQBvaVYF13ZW72Bh7W/Y4FD7KjW3fOldmc33LOy9mvxMcFipUjhde6 MWow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747962031; x=1748566831; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=TWVWI0HB+j/yivqbFmMmYR1x9Y24z6jTPvGpz798n6o=; b=CGunW2NyTpTiDVCrY87AbEWwOk9rAdRW0mLSTG/dIYNIQ1FJQO0FcJ2h19y2E4itjz nlp7TMzp8LxjcsiJaDYHg3pweDIfoxmz1wXseUrr7IBMtxR7d1ZEpa2bwx8iZXRV4QlC MTiLyG5UIosTxEdnpCGc2Vh5pgjLEaANEfLiE/xKNw7ulY7CRUHviBe8iUddbfgIEcT7 ypNjcOgFIukouDrQ/r7gl1AIDmkdNDqf5jZY6sx799ZY3JUc/sbOVYKxPv7zNglCoGXT 4QtgJ3cc3fazwV20npqIvY2OoheVwjFA7CeFGyS3IHx8AQkza+Mg13oEZkawKy5GUCN2 Cg+A== X-Forwarded-Encrypted: i=1; AJvYcCXj+PNXGq3nqq1gSv9wayM8UlOH/Thu5i2GmZYu7PRJeWHwhO06Pt4AwCqs4p4HaqZBAsN+UYCy4jEb/7g=@vger.kernel.org X-Gm-Message-State: AOJu0YyC57GkGF9Id6xH6nPwlPuKqOmoa/u5CN5SjusPcYzprNbVd60/ h54q0cnqWyYWSm7ED5dgh/M1Yca9C9GsSTigwLwZOU9w3QKm0ztuALwxv4440GnOtw/nLsXL2pS iDvi0Sw== X-Google-Smtp-Source: AGHT+IFAvtZwrOPujc8Jiezt5ZUqdB9goJmViesuN7rSLHyglpb7Gd0+oRTXrUjZLjFNcb4QeIdzixEWwiw= X-Received: from pjf14.prod.google.com ([2002:a17:90b:3f0e:b0:2fc:d77:541]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:1645:b0:2ee:94d1:7a89 with SMTP id 98e67ed59e1d1-310e96b6096mr1702204a91.1.1747962031141; Thu, 22 May 2025 18:00:31 -0700 (PDT) Reply-To: Sean Christopherson Date: Thu, 22 May 2025 17:59:17 -0700 In-Reply-To: <20250523010004.3240643-1-seanjc@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250523010004.3240643-1-seanjc@google.com> X-Mailer: git-send-email 2.49.0.1151.ga128411c76-goog Message-ID: <20250523010004.3240643-13-seanjc@google.com> Subject: [PATCH v2 12/59] KVM: SVM: Track AVIC tables as natively sized pointers, not "struct pages" From: Sean Christopherson To: Sean Christopherson , Paolo Bonzini , Joerg Roedel , David Woodhouse , Lu Baolu Cc: kvm@vger.kernel.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, Sairaj Kodilkar , Vasant Hegde , Maxim Levitsky , Joao Martins , Francesco Lavra , David Matlack Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allocate and track AVIC's logical and physical tables as u32 and u64 pointers respectively, as managing the pages as "struct page" pointers adds an almost absurd amount of boilerplate and complexity. E.g. with page_address() out of the way, svm->avic_physical_id_cache becomes completely superfluous, and will be removed in a future cleanup. No functional change intended. Tested-by: Sairaj Kodilkar Signed-off-by: Sean Christopherson --- arch/x86/kvm/svm/avic.c | 49 ++++++++++++++--------------------------- arch/x86/kvm/svm/svm.h | 4 ++-- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 948bab48083b..bf18b0b643d9 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -172,10 +172,8 @@ void avic_vm_destroy(struct kvm *kvm) if (!enable_apicv) return; =20 - if (kvm_svm->avic_logical_id_table_page) - __free_page(kvm_svm->avic_logical_id_table_page); - if (kvm_svm->avic_physical_id_table_page) - __free_page(kvm_svm->avic_physical_id_table_page); + free_page((unsigned long)kvm_svm->avic_logical_id_table); + free_page((unsigned long)kvm_svm->avic_physical_id_table); =20 spin_lock_irqsave(&svm_vm_data_hash_lock, flags); hash_del(&kvm_svm->hnode); @@ -188,27 +186,19 @@ int avic_vm_init(struct kvm *kvm) int err =3D -ENOMEM; struct kvm_svm *kvm_svm =3D to_kvm_svm(kvm); struct kvm_svm *k2; - struct page *p_page; - struct page *l_page; u32 vm_id; =20 if (!enable_apicv) return 0; =20 - /* Allocating physical APIC ID table (4KB) */ - p_page =3D alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO); - if (!p_page) + kvm_svm->avic_physical_id_table =3D (void *)get_zeroed_page(GFP_KERNEL_AC= COUNT); + if (!kvm_svm->avic_physical_id_table) goto free_avic; =20 - kvm_svm->avic_physical_id_table_page =3D p_page; - - /* Allocating logical APIC ID table (4KB) */ - l_page =3D alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO); - if (!l_page) + kvm_svm->avic_logical_id_table =3D (void *)get_zeroed_page(GFP_KERNEL_ACC= OUNT); + if (!kvm_svm->avic_logical_id_table) goto free_avic; =20 - kvm_svm->avic_logical_id_table_page =3D l_page; - spin_lock_irqsave(&svm_vm_data_hash_lock, flags); again: vm_id =3D next_vm_id =3D (next_vm_id + 1) & AVIC_VM_ID_MASK; @@ -242,12 +232,10 @@ static phys_addr_t avic_get_backing_page_address(stru= ct vcpu_svm *svm) void avic_init_vmcb(struct vcpu_svm *svm, struct vmcb *vmcb) { struct kvm_svm *kvm_svm =3D to_kvm_svm(svm->vcpu.kvm); - phys_addr_t lpa =3D __sme_set(page_to_phys(kvm_svm->avic_logical_id_table= _page)); - phys_addr_t ppa =3D __sme_set(page_to_phys(kvm_svm->avic_physical_id_tabl= e_page)); =20 vmcb->control.avic_backing_page =3D avic_get_backing_page_address(svm); - vmcb->control.avic_logical_id =3D lpa; - vmcb->control.avic_physical_id =3D ppa; + vmcb->control.avic_logical_id =3D __sme_set(__pa(kvm_svm->avic_logical_id= _table)); + vmcb->control.avic_physical_id =3D __sme_set(__pa(kvm_svm->avic_physical_= id_table)); vmcb->control.avic_vapic_bar =3D APIC_DEFAULT_PHYS_BASE; =20 if (kvm_apicv_activated(svm->vcpu.kvm)) @@ -261,7 +249,7 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) struct kvm_svm *kvm_svm =3D to_kvm_svm(vcpu->kvm); struct vcpu_svm *svm =3D to_svm(vcpu); u32 id =3D vcpu->vcpu_id; - u64 *table, new_entry; + u64 new_entry; =20 /* * Inhibit AVIC if the vCPU ID is bigger than what is supported by AVIC @@ -277,8 +265,8 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) return 0; } =20 - BUILD_BUG_ON((AVIC_MAX_PHYSICAL_ID + 1) * sizeof(*table) > PAGE_SIZE || - (X2AVIC_MAX_PHYSICAL_ID + 1) * sizeof(*table) > PAGE_SIZE); + BUILD_BUG_ON((AVIC_MAX_PHYSICAL_ID + 1) * sizeof(new_entry) > PAGE_SIZE || + (X2AVIC_MAX_PHYSICAL_ID + 1) * sizeof(new_entry) > PAGE_SIZE); =20 if (WARN_ON_ONCE(!vcpu->arch.apic->regs)) return -EINVAL; @@ -297,18 +285,16 @@ static int avic_init_backing_page(struct kvm_vcpu *vc= pu) return ret; } =20 - /* Setting AVIC backing page address in the phy APIC ID table */ - table =3D page_address(kvm_svm->avic_physical_id_table_page); - /* Note, fls64() returns the bit position, +1. */ BUILD_BUG_ON(__PHYSICAL_MASK_SHIFT > fls64(AVIC_PHYSICAL_ID_ENTRY_BACKING_PAGE_MASK)); =20 + /* Setting AVIC backing page address in the phy APIC ID table */ new_entry =3D avic_get_backing_page_address(svm) | AVIC_PHYSICAL_ID_ENTRY_VALID_MASK; - WRITE_ONCE(table[id], new_entry); + WRITE_ONCE(kvm_svm->avic_physical_id_table[id], new_entry); =20 - svm->avic_physical_id_cache =3D &table[id]; + svm->avic_physical_id_cache =3D &kvm_svm->avic_physical_id_table[id]; =20 return 0; } @@ -442,7 +428,7 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm,= struct kvm_lapic *source if (apic_x2apic_mode(source)) avic_logical_id_table =3D NULL; else - avic_logical_id_table =3D page_address(kvm_svm->avic_logical_id_table_p= age); + avic_logical_id_table =3D kvm_svm->avic_logical_id_table; =20 /* * AVIC is inhibited if vCPUs aren't mapped 1:1 with logical @@ -544,7 +530,6 @@ unsigned long avic_vcpu_get_apicv_inhibit_reasons(struc= t kvm_vcpu *vcpu) static u32 *avic_get_logical_id_entry(struct kvm_vcpu *vcpu, u32 ldr, bool= flat) { struct kvm_svm *kvm_svm =3D to_kvm_svm(vcpu->kvm); - u32 *logical_apic_id_table; u32 cluster, index; =20 ldr =3D GET_APIC_LOGICAL_ID(ldr); @@ -565,9 +550,7 @@ static u32 *avic_get_logical_id_entry(struct kvm_vcpu *= vcpu, u32 ldr, bool flat) return NULL; index +=3D (cluster << 2); =20 - logical_apic_id_table =3D (u32 *) page_address(kvm_svm->avic_logical_id_t= able_page); - - return &logical_apic_id_table[index]; + return &kvm_svm->avic_logical_id_table[index]; } =20 static void avic_ldr_write(struct kvm_vcpu *vcpu, u8 g_physical_id, u32 ld= r) diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h index 71e3c003580e..ec5d77d42a49 100644 --- a/arch/x86/kvm/svm/svm.h +++ b/arch/x86/kvm/svm/svm.h @@ -123,8 +123,8 @@ struct kvm_svm { =20 /* Struct members for AVIC */ u32 avic_vm_id; - struct page *avic_logical_id_table_page; - struct page *avic_physical_id_table_page; + u32 *avic_logical_id_table; + u64 *avic_physical_id_table; struct hlist_node hnode; =20 struct kvm_sev_info sev_info; --=20 2.49.0.1151.ga128411c76-goog