Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp3055067rdg; Tue, 17 Oct 2023 03:18:28 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHA6kN25RkM3iU2wdlTfvpdnJnmVk8hnaWEs0Lo0oPWX64V7FyjeRT+NmUYaTCNzS1IW1cQ X-Received: by 2002:a05:6808:215:b0:3ab:870d:2d49 with SMTP id l21-20020a056808021500b003ab870d2d49mr1992868oie.8.1697537908307; Tue, 17 Oct 2023 03:18:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697537908; cv=none; d=google.com; s=arc-20160816; b=g6QaNt+hiVzMVnzvg/DINUe1H2I5/Yipda0LVTqPhRNef8DwlRJPmoWHJ/cdbgbeSy 6GslqjKho5VcGjrbqFyDXusdylXRZAtjMDuql68DlpyejuMPt7WU46tpw5EgMUF6Aeig cdRP9qrQxGHQ1W4TFFUZaZtMsQiBUljnkeTIlV1g3ywTaUJZOyQZsv8xgdwXPg1Nuk2K GQ7fjgsO3Z4zzpj5QHlQzYbKs36ic4TVRqSvLB9p7CAT26GcpEjAWE3x2fHMwdWM2El7 EzrIZ1yaczTh89vGwDMMJYZH7lGkVC0W/h9pe+h5swVRFOFthvnzqAwsCaBhm/ANAhl4 jYFQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Ot3rKx/myW/gCVrPOFroU0f9+xzHUMUVqNg3JymofmY=; fh=WBgbLtMencYhgeHuu2sUs5b9THiYLgy17d2w1N+xuf4=; b=Ob4/JhqM4OPEGLtK4NSa6aOZTJ0bMJiGTHmxX0W7L482T3fasYDXf6r3DvirJy2pk1 gRBq39YsJzAfxSXP/0lUlJ+wr9ZZggL5B4dZKGEeOZkmyeqdx/rKFQ03IajuJDmAHEY6 rwWvQEENy6Ofc9wmSz2/jfekW1sxlhNGHUNZkg25LxXm6Glu2IjoDR5Z1exUkCFY94G6 KC698rbeFyZSfqmg4F/Ut/7VsrgkFrwW8clWT1cC+34GjEy01CjIFNt2TPD3OKgAPy6a cfyLGGEbqvgoIj0ZcygF7sEol5LccPkhG1VE/1318KWevvMOPdMF0fxcJGBBumBi9WDo sG+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CksM9hQe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 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 agentk.vger.email (agentk.vger.email. [23.128.96.32]) by mx.google.com with ESMTPS id j73-20020a638b4c000000b00578f7063adasi1455015pge.33.2023.10.17.03.18.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Oct 2023 03:18:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) client-ip=23.128.96.32; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CksM9hQe; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.32 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id D5B278036846; Tue, 17 Oct 2023 03:18:24 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343729AbjJQKSE (ORCPT + 99 others); Tue, 17 Oct 2023 06:18:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32844 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234953AbjJQKRh (ORCPT ); Tue, 17 Oct 2023 06:17:37 -0400 Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6252018B; Tue, 17 Oct 2023 03:16:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697537802; x=1729073802; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=GhpQPcS/CMbLQAkfvW4SzXqPwTDy2676TD+2Uq3ONjE=; b=CksM9hQe3IJhIDykDyO/au/pt/nAG/JER5NvgLptO5hA5im7aCEtT9S5 c2w5ZwG1mJq6KBzg10ubSH81W6mgJ83C+qyOey1yliyioamWQmrsPObiT 0Dwztog/4TrvggqbNBjXiLVyGK8OdZNGLYOuJbpWiafNkP3oee5qkUldw 9Y7O7ze5J910xXEQshAoVFer/aPykMlzY0uvHbMNaMqF2TjiH6tUtbvGv 8uC4y7AmfJL05qik4CVQDWxi6dUzj5KAow8ZZCwfaiV+zeNWZMQDPg2ni mV1xeHLjIgT9QLXrDbvipgy6pXf+c2gcFw96yk8w2zdmlaeD1GicCAb5+ g==; X-IronPort-AV: E=McAfee;i="6600,9927,10865"; a="471972507" X-IronPort-AV: E=Sophos;i="6.03,231,1694761200"; d="scan'208";a="471972507" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2023 03:16:42 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10865"; a="872503796" X-IronPort-AV: E=Sophos;i="6.03,231,1694761200"; d="scan'208";a="872503796" Received: from chowe-mobl.amr.corp.intel.com (HELO khuang2-desk.gar.corp.intel.com) ([10.255.229.64]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2023 03:16:36 -0700 From: Kai Huang To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: x86@kernel.org, dave.hansen@intel.com, kirill.shutemov@linux.intel.com, peterz@infradead.org, tony.luck@intel.com, tglx@linutronix.de, bp@alien8.de, mingo@redhat.com, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, rafael@kernel.org, david@redhat.com, dan.j.williams@intel.com, len.brown@intel.com, ak@linux.intel.com, isaku.yamahata@intel.com, ying.huang@intel.com, chao.gao@intel.com, sathyanarayanan.kuppuswamy@linux.intel.com, nik.borisov@suse.com, bagasdotme@gmail.com, sagis@google.com, imammedo@redhat.com, kai.huang@intel.com Subject: [PATCH v14 16/23] x86/virt/tdx: Initialize all TDMRs Date: Tue, 17 Oct 2023 23:14:40 +1300 Message-ID: <940fc8df2a1563ca94c0c4212fae997efd540444.1697532085.git.kai.huang@intel.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Tue, 17 Oct 2023 03:18:25 -0700 (PDT) After the global KeyID has been configured on all packages, initialize all TDMRs to make all TDX-usable memory regions that are passed to the TDX module become usable. This is the last step of initializing the TDX module. Initializing TDMRs can be time consuming on large memory systems as it involves initializing all metadata entries for all pages that can be used by TDX guests. Initializing different TDMRs can be parallelized. For now to keep it simple, just initialize all TDMRs one by one. It can be enhanced in the future. Signed-off-by: Kai Huang Reviewed-by: Isaku Yamahata Reviewed-by: Kirill A. Shutemov Reviewed-by: Yuan Yao --- v13 -> v14: - No change v12 -> v13: - Added Yuan's tag. v11 -> v12: - Added Kirill's tag v10 -> v11: - No update v9 -> v10: - Code change due to change static 'tdx_tdmr_list' to local 'tdmr_list'. v8 -> v9: - Improved changlog to explain why initializing TDMRs can take long time (Dave). - Improved comments around 'next-to-initialize' address (Dave). v7 -> v8: (Dave) - Changelog: - explicitly call out this is the last step of TDX module initialization. - Trimed down changelog by removing SEAMCALL name and details. - Removed/trimmed down unnecessary comments. - Other changes due to 'struct tdmr_info_list'. v6 -> v7: - Removed need_resched() check. -- Andi. --- arch/x86/virt/vmx/tdx/tdx.c | 60 ++++++++++++++++++++++++++++++++----- arch/x86/virt/vmx/tdx/tdx.h | 1 + 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c index fc816709ff55..4f55da1853a9 100644 --- a/arch/x86/virt/vmx/tdx/tdx.c +++ b/arch/x86/virt/vmx/tdx/tdx.c @@ -1005,6 +1005,56 @@ static int config_global_keyid(void) return ret; } +static int init_tdmr(struct tdmr_info *tdmr) +{ + u64 next; + + /* + * Initializing a TDMR can be time consuming. To avoid long + * SEAMCALLs, the TDX module may only initialize a part of the + * TDMR in each call. + */ + do { + struct tdx_module_args args = { + .rcx = tdmr->base, + }; + int ret; + + ret = seamcall_prerr_ret(TDH_SYS_TDMR_INIT, &args); + if (ret) + return ret; + /* + * RDX contains 'next-to-initialize' address if + * TDH.SYS.TDMR.INIT did not fully complete and + * should be retried. + */ + next = args.rdx; + cond_resched(); + /* Keep making SEAMCALLs until the TDMR is done */ + } while (next < tdmr->base + tdmr->size); + + return 0; +} + +static int init_tdmrs(struct tdmr_info_list *tdmr_list) +{ + int i; + + /* + * This operation is costly. It can be parallelized, + * but keep it simple for now. + */ + for (i = 0; i < tdmr_list->nr_consumed_tdmrs; i++) { + int ret; + + ret = init_tdmr(tdmr_entry(tdmr_list, i)); + if (ret) + return ret; + } + + return 0; +} + static int init_tdx_module(void) { struct tdsysinfo_struct *tdsysinfo; @@ -1080,14 +1130,8 @@ static int init_tdx_module(void) if (ret) goto out_reset_pamts; - /* - * TODO: - * - * - Initialize all TDMRs. - * - * Return error before all steps are done. - */ - ret = -EINVAL; + /* Initialize TDMRs to complete the TDX module initialization */ + ret = init_tdmrs(&tdmr_list); out_reset_pamts: if (ret) { /* diff --git a/arch/x86/virt/vmx/tdx/tdx.h b/arch/x86/virt/vmx/tdx/tdx.h index 2427ae40fc3c..6e41b0731e48 100644 --- a/arch/x86/virt/vmx/tdx/tdx.h +++ b/arch/x86/virt/vmx/tdx/tdx.h @@ -20,6 +20,7 @@ #define TDH_SYS_INFO 32 #define TDH_SYS_INIT 33 #define TDH_SYS_LP_INIT 35 +#define TDH_SYS_TDMR_INIT 36 #define TDH_SYS_CONFIG 45 struct cmr_info { -- 2.41.0