From nobody Fri Sep 19 02:19:36 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1302C352A1 for ; Wed, 30 Nov 2022 23:16:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229763AbiK3XQU (ORCPT ); Wed, 30 Nov 2022 18:16:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230143AbiK3XPC (ORCPT ); Wed, 30 Nov 2022 18:15:02 -0500 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB063A1A26 for ; Wed, 30 Nov 2022 15:11:16 -0800 (PST) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-3d0465d32deso60321467b3.20 for ; Wed, 30 Nov 2022 15:11:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; 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=53xJtsXwAsu74EweEvqLfwwo7zzTtOoMYgP2NXGBEKw=; b=pSTNuIvDzqWnjZTy4TWEvDb45JzvrqoAq5tphcGqjnpEcv+R/E8uYQMST763yB4Xzg GkjPiFx7QlczEj89uSRUJy1png4jJ9iumTum3a/8jGXB1FnzXD35IJr9mI2whDJDhum0 qqGEC2oYlXUbEoxJq0t7seuQA6WP2YG6MJ6xz4hTptg9EaGLExMA91pOMDzEebdIi476 ahiRNeQ8UwgfXn5rGMohKmKN/szmS9AmNNZW9RQV9eetqIRLS1npGSVnlb5ZtYYiTmP+ 65N61m0sWNWw60bzjuPOHysag10RaRkCocITH75cYqgtvbV64S2g0ywUnBBLVcnK+ahX iwfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=53xJtsXwAsu74EweEvqLfwwo7zzTtOoMYgP2NXGBEKw=; b=QGyRg5a0wr+ANINerpag+fLV50iX+vxlPInpSsCMNv+r7F2qZyI/kTCy6nEwUh5aqr SbAPJU2YUjwO9Z+FTl0QnFSo3Q4t0w8s2aOJ5uIxp1+8NSrO6+vj98y1lz9jF7zd0YjI 5yvb0QVkO+9j+uOo6bKW+LXtNtt9iXMf216TKWmfX5ziCwE6GSWMIKFAOFD5kAy2USG4 /FDh7/f8WPdFhD5/8eydsbUiZGBe6yxjls9qxgrqtiL8uptloTSDxrD1YEFVQqH4A8g4 MMrLGfMqyHca0aBrxcjHI3GE17fV8KkcdTHL/44PYHG8CHKhwW14VcS+TtkVkHgYic0d MGJg== X-Gm-Message-State: ANoB5pn5td3JftvpH7hv5wY3lHTfi91cxgSMD6+KMusWqEIZduiBimWQ sMyehB22s6Zh984xWVuO8sMjtLywz0Q= X-Google-Smtp-Source: AA0mqf62G3WEsILjLTjpGVsE3QUTfdWzqwQbUzQ3G5NPce2lGkYDgeTJs0U0N9V7g53Te4Rh8/MCAEMDECQ= X-Received: from zagreus.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5c37]) (user=seanjc job=sendgmr) by 2002:a25:ab05:0:b0:6ca:1823:ab0d with SMTP id u5-20020a25ab05000000b006ca1823ab0dmr47624596ybi.99.1669849845153; Wed, 30 Nov 2022 15:10:45 -0800 (PST) Reply-To: Sean Christopherson Date: Wed, 30 Nov 2022 23:09:23 +0000 In-Reply-To: <20221130230934.1014142-1-seanjc@google.com> Mime-Version: 1.0 References: <20221130230934.1014142-1-seanjc@google.com> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221130230934.1014142-40-seanjc@google.com> Subject: [PATCH v2 39/50] KVM: x86: Move CPU compat checks hook to kvm_x86_ops (from kvm_x86_init_ops) From: Sean Christopherson To: Paolo Bonzini , Marc Zyngier , Huacai Chen , Aleksandar Markovic , Anup Patel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Matthew Rosato , Eric Farman , Sean Christopherson , Vitaly Kuznetsov , David Woodhouse , Paul Durrant Cc: James Morse , Alexandru Elisei , Suzuki K Poulose , Oliver Upton , Atish Patra , David Hildenbrand , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvmarm@lists.cs.columbia.edu, linux-mips@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, Yuan Yao , Cornelia Huck , Isaku Yamahata , "=?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?=" , Fabiano Rosas , Michael Ellerman , Kai Huang , Chao Gao , Thomas Gleixner Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the .check_processor_compatibility() callback from kvm_x86_init_ops to kvm_x86_ops to allow a future patch to do compatibility checks during CPU hotplug. Do kvm_ops_update() before compat checks so that static_call() can be used during compat checks. Signed-off-by: Sean Christopherson Reviewed-by: Kai Huang --- arch/x86/include/asm/kvm-x86-ops.h | 1 + arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/svm/svm.c | 5 +++-- arch/x86/kvm/vmx/vmx.c | 16 +++++++-------- arch/x86/kvm/x86.c | 31 +++++++++++------------------- 5 files changed, 25 insertions(+), 31 deletions(-) diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-= x86-ops.h index abccd51dcfca..dba2909e5ae2 100644 --- a/arch/x86/include/asm/kvm-x86-ops.h +++ b/arch/x86/include/asm/kvm-x86-ops.h @@ -14,6 +14,7 @@ BUILD_BUG_ON(1) * to make a definition optional, but in this case the default will * be __static_call_return0. */ +KVM_X86_OP(check_processor_compatibility) KVM_X86_OP(hardware_enable) KVM_X86_OP(hardware_disable) KVM_X86_OP(hardware_unsetup) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_hos= t.h index d79aedf70908..ba74fea6850b 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1518,6 +1518,8 @@ static inline u16 kvm_lapic_irq_dest_mode(bool dest_m= ode_logical) struct kvm_x86_ops { const char *name; =20 + int (*check_processor_compatibility)(void); + int (*hardware_enable)(void); void (*hardware_disable)(void); void (*hardware_unsetup)(void); @@ -1729,7 +1731,6 @@ struct kvm_x86_nested_ops { }; =20 struct kvm_x86_init_ops { - int (*check_processor_compatibility)(void); int (*hardware_setup)(void); unsigned int (*handle_intel_pt_intr)(void); =20 diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 9f94efcb9aa6..c2e95c0d9fd8 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -543,7 +543,7 @@ static bool kvm_is_svm_supported(void) return true; } =20 -static int __init svm_check_processor_compat(void) +static int svm_check_processor_compat(void) { if (!kvm_is_svm_supported()) return -EIO; @@ -4695,6 +4695,8 @@ static int svm_vm_init(struct kvm *kvm) static struct kvm_x86_ops svm_x86_ops __initdata =3D { .name =3D KBUILD_MODNAME, =20 + .check_processor_compatibility =3D svm_check_processor_compat, + .hardware_unsetup =3D svm_hardware_unsetup, .hardware_enable =3D svm_hardware_enable, .hardware_disable =3D svm_hardware_disable, @@ -5079,7 +5081,6 @@ static __init int svm_hardware_setup(void) =20 static struct kvm_x86_init_ops svm_init_ops __initdata =3D { .hardware_setup =3D svm_hardware_setup, - .check_processor_compatibility =3D svm_check_processor_compat, =20 .runtime_ops =3D &svm_x86_ops, .pmu_ops =3D &amd_pmu_ops, diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index 2a8a6e481c76..6416ed5b7f89 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -2520,8 +2520,7 @@ static bool cpu_has_perf_global_ctrl_bug(void) return false; } =20 -static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt, - u32 msr, u32 *result) +static int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt, u32 msr, u32 *res= ult) { u32 vmx_msr_low, vmx_msr_high; u32 ctl =3D ctl_min | ctl_opt; @@ -2539,7 +2538,7 @@ static __init int adjust_vmx_controls(u32 ctl_min, u3= 2 ctl_opt, return 0; } =20 -static __init u64 adjust_vmx_controls64(u64 ctl_opt, u32 msr) +static u64 adjust_vmx_controls64(u64 ctl_opt, u32 msr) { u64 allowed; =20 @@ -2548,8 +2547,8 @@ static __init u64 adjust_vmx_controls64(u64 ctl_opt, = u32 msr) return ctl_opt & allowed; } =20 -static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf, - struct vmx_capability *vmx_cap) +static int setup_vmcs_config(struct vmcs_config *vmcs_conf, + struct vmx_capability *vmx_cap) { u32 vmx_msr_low, vmx_msr_high; u32 _pin_based_exec_control =3D 0; @@ -2710,7 +2709,7 @@ static __init int setup_vmcs_config(struct vmcs_confi= g *vmcs_conf, return 0; } =20 -static bool __init kvm_is_vmx_supported(void) +static bool kvm_is_vmx_supported(void) { if (!cpu_has_vmx()) { pr_err("CPU doesn't support VMX\n"); @@ -2726,7 +2725,7 @@ static bool __init kvm_is_vmx_supported(void) return true; } =20 -static int __init vmx_check_processor_compat(void) +static int vmx_check_processor_compat(void) { struct vmcs_config vmcs_conf; struct vmx_capability vmx_cap; @@ -8104,6 +8103,8 @@ static void vmx_vm_destroy(struct kvm *kvm) static struct kvm_x86_ops vmx_x86_ops __initdata =3D { .name =3D KBUILD_MODNAME, =20 + .check_processor_compatibility =3D vmx_check_processor_compat, + .hardware_unsetup =3D vmx_hardware_unsetup, =20 .hardware_enable =3D vmx_hardware_enable, @@ -8501,7 +8502,6 @@ static __init int hardware_setup(void) } =20 static struct kvm_x86_init_ops vmx_init_ops __initdata =3D { - .check_processor_compatibility =3D vmx_check_processor_compat, .hardware_setup =3D hardware_setup, .handle_intel_pt_intr =3D NULL, =20 diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 5551f3552f08..ee9af412ffd4 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -9279,12 +9279,7 @@ static inline void kvm_ops_update(struct kvm_x86_ini= t_ops *ops) kvm_pmu_ops_update(ops->pmu_ops); } =20 -struct kvm_cpu_compat_check { - struct kvm_x86_init_ops *ops; - int *ret; -}; - -static int kvm_x86_check_processor_compatibility(struct kvm_x86_init_ops *= ops) +static int kvm_x86_check_processor_compatibility(void) { struct cpuinfo_x86 *c =3D &cpu_data(smp_processor_id()); =20 @@ -9294,19 +9289,16 @@ static int kvm_x86_check_processor_compatibility(st= ruct kvm_x86_init_ops *ops) __cr4_reserved_bits(cpu_has, &boot_cpu_data)) return -EIO; =20 - return ops->check_processor_compatibility(); + return static_call(kvm_x86_check_processor_compatibility)(); } =20 -static void kvm_x86_check_cpu_compat(void *data) +static void kvm_x86_check_cpu_compat(void *ret) { - struct kvm_cpu_compat_check *c =3D data; - - *c->ret =3D kvm_x86_check_processor_compatibility(c->ops); + *(int *)ret =3D kvm_x86_check_processor_compatibility(); } =20 static int __kvm_x86_vendor_init(struct kvm_x86_init_ops *ops) { - struct kvm_cpu_compat_check c; u64 host_pat; int r, cpu; =20 @@ -9377,12 +9369,12 @@ static int __kvm_x86_vendor_init(struct kvm_x86_ini= t_ops *ops) if (r !=3D 0) goto out_mmu_exit; =20 - c.ret =3D &r; - c.ops =3D ops; + kvm_ops_update(ops); + for_each_online_cpu(cpu) { - smp_call_function_single(cpu, kvm_x86_check_cpu_compat, &c, 1); + smp_call_function_single(cpu, kvm_x86_check_cpu_compat, &r, 1); if (r < 0) - goto out_hardware_unsetup; + goto out_unwind_ops; } =20 /* @@ -9390,8 +9382,6 @@ static int __kvm_x86_vendor_init(struct kvm_x86_init_= ops *ops) * absolutely necessary, as most operations from this point forward * require unwinding. */ - kvm_ops_update(ops); - kvm_timer_init(); =20 if (pi_inject_timer =3D=3D -1) @@ -9427,8 +9417,9 @@ static int __kvm_x86_vendor_init(struct kvm_x86_init_= ops *ops) kvm_init_msr_list(); return 0; =20 -out_hardware_unsetup: - ops->runtime_ops->hardware_unsetup(); +out_unwind_ops: + kvm_x86_ops.hardware_enable =3D NULL; + static_call(kvm_x86_hardware_unsetup)(); out_mmu_exit: kvm_mmu_vendor_module_exit(); out_free_percpu: --=20 2.38.1.584.g0f3c55d4c2-goog