Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp4936860pxb; Wed, 20 Apr 2022 13:30:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzC/KJspzQpgCl2xuhf/GYFPRbNxjIOdTEqjxygbekJvuBe7JSIAwF+46MMRVSYSlMnAbKY X-Received: by 2002:a05:6402:190d:b0:424:494:e217 with SMTP id e13-20020a056402190d00b004240494e217mr9857242edz.82.1650486612182; Wed, 20 Apr 2022 13:30:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650486612; cv=none; d=google.com; s=arc-20160816; b=OIt65esidtqzk1vcorFyHAgKG8kL7WGLtQwogAZ2okOHBhnvqA4jQLFnnv7H/0+Tsw 0nre2hkiPPfRCCX+qvo+zt8p86qLvie8NtkxzLy3aD5yG8l7pGSnwh5ucYWMLacFSVVW ps0Wb7Q6pOWOlWxklHW6g+q2X4BXvYQxLDQJjy5NNb3nk4hbt38FVRPGzgWuOORk47AH kfOea5+dSMs3t7U7v2b420DTyUGEp8zE6pxoeDmUyDVAALbqPs+/8YlEoNdqS+bAqgIB 0Chy8OgeXL2VukmxaTjDVOJFkGkp0nUuixTeGLuKxFSWY6Khah1zJCsIHvqZ04qZNBnY V2RA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=CBGaUDo2U82i4VtTI6RpFp11+FIZb3bCMWEH+ZF2/WA=; b=ZTl9pMeppFbCZbHp0QcMsOCTekbl17cOkIDki7IV9msBacuoP6Ic/sv59aGCc8/6r+ 32I52LyHPhabZ2bIlgYvcqviJOcdjs/pheg6jjO72kAfHf9nxLNrat0dCUv0pjiDd2Iz OyE6MTIDUIqkexkwLq/+X+BdL9tTl7YdlMdDvaew0sPYgMbz4I50E7UW7zg7MEuu0ZYq joHltg1xXGp3jLsy6GoCoOoMAD2uNHm1Q7gb1h1QagzfVAv/L9AEbFlL8C9DWTrGEKAJ pUnTUnDH5Ep9hy/fAPmJEl0DcbUolXFopIv2TWa/kcDT8h8KOp2B9RTLwpP4BbOJVAVh FpvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=iUfOVHrm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z7-20020a1709060f0700b006e00177759csi2460076eji.885.2022.04.20.13.29.31; Wed, 20 Apr 2022 13:30:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=iUfOVHrm; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1359251AbiDTDZs (ORCPT + 99 others); Tue, 19 Apr 2022 23:25:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53286 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1359239AbiDTDZp (ORCPT ); Tue, 19 Apr 2022 23:25:45 -0400 Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3932421E2C; Tue, 19 Apr 2022 20:23:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1650424981; x=1681960981; h=date:from:to:cc:subject:message-id:references: mime-version:in-reply-to; bh=1AiC9VeveMPhro24gHqzjyeU34rUd2EVyr+r3itMve4=; b=iUfOVHrmqmBRjJ3bzkShScz8IUtZ5GaGCaxA7HbL6XPn9bfkhfvYSMvp UMozJuBSCJ3MxYW+xpcvTI48R1ahJvCLOMTYSmF1KN6VwNUwiQVjJCm08 k4gx6wE+AoCcTfj/l1IT0sVmtnQ7t0mJSbY5nKg5oSuMJyZFPevHL0pNF 8EbazH8M3gSoLoOPMy4E5QyytLJF9Ti+tUq1n/jaZWxVq+7QHrb8RLrs8 qdUBdP9f5KTERxd0v4tRNBLtRKz4/gu1tHmwF+HBP3QB1V0FMwV07YTgx yvKJpLwnn7Fv4eVu3dfqrYyFcmhQuSJDze+xzi2gdlf2zfqmHmrZNGi+6 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10322"; a="251234129" X-IronPort-AV: E=Sophos;i="5.90,274,1643702400"; d="scan'208";a="251234129" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Apr 2022 20:23:00 -0700 X-IronPort-AV: E=Sophos;i="5.90,274,1643702400"; d="scan'208";a="727317671" Received: from gao-cwp.sh.intel.com (HELO gao-cwp) ([10.239.159.23]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Apr 2022 20:22:55 -0700 Date: Wed, 20 Apr 2022 11:22:51 +0800 From: Chao Gao To: Zeng Guang Cc: Paolo Bonzini , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , kvm@vger.kernel.org, Dave Hansen , Tony Luck , Kan Liang , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Kim Phillips , Jarkko Sakkinen , Jethro Beekman , Kai Huang , x86@kernel.org, linux-kernel@vger.kernel.org, Robert Hu Subject: Re: [PATCH v9 8/9] KVM: x86: Allow userspace set maximum VCPU id for VM Message-ID: <20220420032245.GA14083@gao-cwp> References: <20220419154444.11888-1-guang.zeng@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220419154444.11888-1-guang.zeng@intel.com> User-Agent: Mutt/1.9.4 (2018-02-28) X-Spam-Status: No, score=-5.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Apr 19, 2022 at 11:44:44PM +0800, Zeng Guang wrote: >Introduce new max_vcpu_ids in KVM for x86 architecture. Userspace >can assign maximum possible vcpu id for current VM session using >KVM_CAP_MAX_VCPU_ID of KVM_ENABLE_CAP ioctl(). > >This is done for x86 only because the sole use case is to guide >memory allocation for PID-pointer table, a structure needed to >enable VMX IPI. > >By default, max_vcpu_ids set as KVM_MAX_VCPU_IDS. > >Suggested-by: Sean Christopherson >Reviewed-by: Maxim Levitsky >Signed-off-by: Zeng Guang >--- > Documentation/virt/kvm/api.rst | 18 ++++++++++++++++++ > arch/x86/include/asm/kvm_host.h | 6 ++++++ > arch/x86/kvm/x86.c | 25 ++++++++++++++++++++++++- > 3 files changed, 48 insertions(+), 1 deletion(-) > >diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst >index d13fa6600467..0c6ad2d8bea0 100644 >--- a/Documentation/virt/kvm/api.rst >+++ b/Documentation/virt/kvm/api.rst >@@ -7136,6 +7136,24 @@ The valid bits in cap.args[0] are: > IA32_MISC_ENABLE[bit 18] is cleared. > =================================== ============================================ > >+7.32 KVM_CAP_MAX_VCPU_ID >+------------------------ >+ >+:Architectures: x86 >+:Target: VM >+:Parameters: args[0] - maximum APIC ID value set for current VM >+:Returns: 0 on success, -EINVAL if args[0] is beyond KVM_MAX_VCPU_IDS >+ supported in KVM or if it has been settled. >+ >+Userspace is able to calculate the limit to APIC ID values from designated CPU >+topology. This capability allows userspace to specify maximum possible APIC ID >+assigned for current VM session prior to the creation of vCPUs. By design, it >+can set only once and doesn't accept change any more. KVM will manage memory >+allocation of VM-scope structures which depends on the value of APIC ID. >+ >+Calling KVM_CHECK_EXTENSION for this capability returns the value of maximum APIC >+ID that KVM supports at runtime. It sets as KVM_MAX_VCPU_IDS by default. >+ > 8. Other capabilities. > ====================== > >diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h >index d23e80a56eb8..cdd14033988d 100644 >--- a/arch/x86/include/asm/kvm_host.h >+++ b/arch/x86/include/asm/kvm_host.h >@@ -1238,6 +1238,12 @@ struct kvm_arch { > hpa_t hv_root_tdp; > spinlock_t hv_root_tdp_lock; > #endif >+ /* >+ * VM-scope maximum vCPU ID. Used to determine the size of structures >+ * that increase along with the maximum vCPU ID, in which case, using >+ * the global KVM_MAX_VCPU_IDS may lead to significant memory waste. >+ */ >+ u32 max_vcpu_ids; > }; > > struct kvm_vm_stat { >diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c >index 277a0da8c290..744e88a71b63 100644 >--- a/arch/x86/kvm/x86.c >+++ b/arch/x86/kvm/x86.c >@@ -4320,7 +4320,10 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) > r = KVM_MAX_VCPUS; > break; > case KVM_CAP_MAX_VCPU_ID: >- r = KVM_MAX_VCPU_IDS; >+ if (!kvm->arch.max_vcpu_ids) >+ r = KVM_MAX_VCPU_IDS; >+ else >+ r = kvm->arch.max_vcpu_ids; > break; > case KVM_CAP_PV_MMU: /* obsolete */ > r = 0; >@@ -6064,6 +6067,20 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm, > } > mutex_unlock(&kvm->lock); > break; >+ case KVM_CAP_MAX_VCPU_ID: >+ r = -EINVAL; >+ if (cap->args[0] > KVM_MAX_VCPU_IDS) >+ break; >+ >+ mutex_lock(&kvm->lock); >+ if (kvm->arch.max_vcpu_ids == cap->args[0]) { >+ r = 0; >+ } else if (!kvm->arch.max_vcpu_ids) { >+ kvm->arch.max_vcpu_ids = cap->args[0]; >+ r = 0; >+ } >+ mutex_unlock(&kvm->lock); >+ break; It would be better to have a kselftest to exercise this capability. For example, 1. launch a VM. 2. set the max vCPU ID via KVM_CAP_MAX_VCPU_ID 3. read the max vCPU ID to check if the value written is returned. 4. create a vCPU which has apic id larger than the maximum. 5. try to change the max vCPU ID after set once. ... This test can be the last patch of this series or posted separately.