From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B34F9C71136 for ; Thu, 12 Jun 2025 00:37:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To: From:Subject:Message-ID:References:Mime-Version:In-Reply-To:Date: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=fjGDTFzoOPTHOIiqFgNMI96VBH4N7QEJybjbvNpN00c=; b=gEUDrHFMj8Y7UrdngsnSWKvbCg 28t4y750mIs+O6161UqVbBp1547CoGbBenWHC1NK8QWYP5ikz1hWkHFTprgOeeLNlr+4qkHoG4Pm2 8CihNLK9L10Iez0I8duN9wAQr7WnHLX9XH7CeIfbbtm6PEX+RXEx0SYHTwiFvkuOZLek16neZzn2M np56iZD15Qv1sEdtNkiLYIcIA2nvbBuJD3B/0I7OVSbRZVW/RT8wxDPBuJAPQWDBv27v7v1Knsgyx HTYwiiCK2z9gU+6+4IZKmEcDTrbttzGFsHoQqliz7BHOrjB5IjRABY1GoNciBG686f4PUQONnAK10 LWHU1sWQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uPVwW-0000000BnX3-1gI2; Thu, 12 Jun 2025 00:37:20 +0000 Received: from mail-pf1-x44a.google.com ([2607:f8b0:4864:20::44a]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uPUE5-0000000BX9X-3Q0O for linux-arm-kernel@lists.infradead.org; Wed, 11 Jun 2025 22:47:22 +0000 Received: by mail-pf1-x44a.google.com with SMTP id d2e1a72fcca58-742c03c0272so396276b3a.1 for ; Wed, 11 Jun 2025 15:47:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1749682040; x=1750286840; darn=lists.infradead.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=fjGDTFzoOPTHOIiqFgNMI96VBH4N7QEJybjbvNpN00c=; b=D2gEb2TbdHe2wWk6j9r9Sgdur1CucKsFHGt40IdkxmN58OaT36c8BHPL8OYsaErreR ZaAXBnJcf9LY9YLDXCdbMdgWqB7hFiyz+PHGH3/nKPk0i9rdRmhGRBB0doUbMRHeHh8x uR/q7g+BgvWQ7JCGP3lIMFo1718TD3XrkdRC0Jb2GTtl8r3SQERFwPwrD2bnM/zKPWqW 1P7TREpTZV2kIGo9PQAqHtxqL1fZF1lHM6cw8dsgPgt/wjlg2+U05wAY4cogpbz9kH2p L+eOiS++66SEiABVVhBEnvro3sAd/HxmF22AGDHGOyq6RKJKlgTJbpjwLFdhYYoKCaHT ZzxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749682040; x=1750286840; 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=fjGDTFzoOPTHOIiqFgNMI96VBH4N7QEJybjbvNpN00c=; b=aH//DMzAPSbhq+ToWGp4ZyRYZbRTyX7Sy1r9TWB/woLm6MTAmc/s65YtZP3J8HKXre kOZKwHiJF0LQBmdbdK0bbLhf6KD5Lc6yIbiejxavKx0XrxChEXLDjVxue2sgMlycESvh 2MLzqkQcNm3CJPPGb9y9xjqevV9gbKdXuOBf/ltDcIhVYp9H0Bdm0jMBkdUCRf1Ppstm w1YuQ1HS1sWyYglu70RkMtCLrgA7fj/TZs6Vj1URbVG1VxuC9L/qn7gTUs5i232hqpsR 4oXhJZBQg7s55kC7HnL39pCK5gVe3VGnGh+CHjJZVI6OoDhKr9TI5Z7IapUrBYkmp6Ww 9kmQ== X-Gm-Message-State: AOJu0YxQ9hGTzEbrG8jVycEQM4Mq+o//BvNG3zV+XcwwwnUagval4bw5 Q7RbDKiufAGOldb5xdW6xiU/ySZCGZ2R27u8pYEeXioH5dNybtaxxBKqvx2up3M5NDhLhkYekue YLNT02g== X-Google-Smtp-Source: AGHT+IGecZq8RM5h9tJ+sa6mCIHJXtBSp+Ntypd+iUzFZkPpDRHr5SZ8PChIvutcjWxMiCNgxwsIm8TNC5o= X-Received: from pfbay26.prod.google.com ([2002:a05:6a00:301a:b0:746:223d:ebdc]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:9a3:b0:736:43d6:f008 with SMTP id d2e1a72fcca58-7486cdf41e9mr7104627b3a.12.1749682040461; Wed, 11 Jun 2025 15:47:20 -0700 (PDT) Date: Wed, 11 Jun 2025 15:45:17 -0700 In-Reply-To: <20250611224604.313496-2-seanjc@google.com> Mime-Version: 1.0 References: <20250611224604.313496-2-seanjc@google.com> X-Mailer: git-send-email 2.50.0.rc1.591.g9c95f17f64-goog Message-ID: <20250611224604.313496-16-seanjc@google.com> Subject: [PATCH v3 14/62] KVM: SVM: Track AVIC tables as natively sized pointers, not "struct pages" From: Sean Christopherson To: Marc Zyngier , Oliver Upton , Sean Christopherson , Paolo Bonzini , Joerg Roedel , David Woodhouse , Lu Baolu Cc: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, 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-Type: text/plain; charset="UTF-8" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250611_154721_859263_D6F25C82 X-CRM114-Status: GOOD ( 18.78 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Sean Christopherson Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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; - 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); 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 = -ENOMEM; struct kvm_svm *kvm_svm = to_kvm_svm(kvm); struct kvm_svm *k2; - struct page *p_page; - struct page *l_page; u32 vm_id; if (!enable_apicv) return 0; - /* Allocating physical APIC ID table (4KB) */ - p_page = alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO); - if (!p_page) + kvm_svm->avic_physical_id_table = (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT); + if (!kvm_svm->avic_physical_id_table) goto free_avic; - kvm_svm->avic_physical_id_table_page = p_page; - - /* Allocating logical APIC ID table (4KB) */ - l_page = alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO); - if (!l_page) + kvm_svm->avic_logical_id_table = (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT); + if (!kvm_svm->avic_logical_id_table) goto free_avic; - kvm_svm->avic_logical_id_table_page = l_page; - spin_lock_irqsave(&svm_vm_data_hash_lock, flags); again: vm_id = next_vm_id = (next_vm_id + 1) & AVIC_VM_ID_MASK; @@ -242,12 +232,10 @@ static phys_addr_t avic_get_backing_page_address(struct vcpu_svm *svm) void avic_init_vmcb(struct vcpu_svm *svm, struct vmcb *vmcb) { struct kvm_svm *kvm_svm = to_kvm_svm(svm->vcpu.kvm); - phys_addr_t lpa = __sme_set(page_to_phys(kvm_svm->avic_logical_id_table_page)); - phys_addr_t ppa = __sme_set(page_to_phys(kvm_svm->avic_physical_id_table_page)); vmcb->control.avic_backing_page = avic_get_backing_page_address(svm); - vmcb->control.avic_logical_id = lpa; - vmcb->control.avic_physical_id = ppa; + vmcb->control.avic_logical_id = __sme_set(__pa(kvm_svm->avic_logical_id_table)); + vmcb->control.avic_physical_id = __sme_set(__pa(kvm_svm->avic_physical_id_table)); vmcb->control.avic_vapic_bar = APIC_DEFAULT_PHYS_BASE; 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 = to_kvm_svm(vcpu->kvm); struct vcpu_svm *svm = to_svm(vcpu); u32 id = vcpu->vcpu_id; - u64 *table, new_entry; + u64 new_entry; /* * 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; } - 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); if (WARN_ON_ONCE(!vcpu->arch.apic->regs)) return -EINVAL; @@ -297,18 +285,16 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) return ret; } - /* Setting AVIC backing page address in the phy APIC ID table */ - table = 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)); + /* Setting AVIC backing page address in the phy APIC ID table */ new_entry = 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); - svm->avic_physical_id_cache = &table[id]; + svm->avic_physical_id_cache = &kvm_svm->avic_physical_id_table[id]; 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 = NULL; else - avic_logical_id_table = page_address(kvm_svm->avic_logical_id_table_page); + avic_logical_id_table = kvm_svm->avic_logical_id_table; /* * AVIC is inhibited if vCPUs aren't mapped 1:1 with logical @@ -544,7 +530,6 @@ unsigned long avic_vcpu_get_apicv_inhibit_reasons(struct kvm_vcpu *vcpu) static u32 *avic_get_logical_id_entry(struct kvm_vcpu *vcpu, u32 ldr, bool flat) { struct kvm_svm *kvm_svm = to_kvm_svm(vcpu->kvm); - u32 *logical_apic_id_table; u32 cluster, index; ldr = 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 += (cluster << 2); - logical_apic_id_table = (u32 *) page_address(kvm_svm->avic_logical_id_table_page); - - return &logical_apic_id_table[index]; + return &kvm_svm->avic_logical_id_table[index]; } static void avic_ldr_write(struct kvm_vcpu *vcpu, u8 g_physical_id, u32 ldr) 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 { /* 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; struct kvm_sev_info sev_info; -- 2.50.0.rc1.591.g9c95f17f64-goog