From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.remote-ip=192.198.163.11 ARC-Seal: i=2; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=fail; t=1793696366; b=GGIje+Et7eu9rnZCTb0Km5wVUE9JwBX5Ib0I0JZseF3BpM6O3COTX51R9WUH2qztnk0R 5f+7GyD4N7vAJ/TMUoDK/FYMGkPGmAzeIqooheCt8uk2KllRqd5KRtcG3EvOZEum5tmQD UAZbWMvi3mgLYpyVq4DpuCBdoY02kfTomdn1cl8tOi3hssIi0hp2aYUE6URn5bhoS8ZhC k0TXcUBdQceTgHjH8PqT/NZpuDorkI1k6GOtn07fHwBqegn0WtxygcZnemErchOFSVXQ0 crhKsmsznrxP578gNBlvANSH+RdcPiRg29Vf1ewSgmARprcD289GMA220jQR2eu8V/g== ARC-Message-Signature: i=2; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793696366; h=DMARC-Filter:DKIM-Signature:X-CSE-ConnectionGUID:X-CSE-MsgGUID: X-IronPort-AV:X-IronPort-AV:Received:X-CSE-ConnectionGUID: X-CSE-MsgGUID:X-ExtLoop1:X-IronPort-AV:Received:Received:Received: Received:Received:Received:Date:From:To:CC:Subject:Message-ID: References:Content-Type:Content-Disposition:Content-Transfer-Encoding: In-Reply-To:X-ClientProxiedBy:MIME-Version:X-MS-PublicTrafficType: X-MS-TrafficTypeDiagnostic:X-MS-Office365-Filtering-Correlation-Id: X-MS-Exchange-SenderADCheck:X-MS-Exchange-AntiSpam-Relay: X-Microsoft-Antispam:X-Microsoft-Antispam-Message-Info: X-Forefront-Antispam-Report: X-MS-Exchange-AntiSpam-MessageData-ChunkCount: X-MS-Exchange-AntiSpam-MessageData-0:X-Exchange-RoutingPolicyChecked: X-MS-Exchange-CrossTenant-Network-Message-Id: X-MS-Exchange-CrossTenant-AuthSource:X-MS-Exchange-CrossTenant-AuthAs: X-MS-Exchange-CrossTenant-OriginalArrivalTime: X-MS-Exchange-CrossTenant-FromEntityHeader: X-MS-Exchange-CrossTenant-Id:X-MS-Exchange-CrossTenant-MailboxType: X-MS-Exchange-CrossTenant-UserPrincipalName: X-MS-Exchange-Transport-CrossTenantHeadersStamped:X-OriginatorOrg; bh=sVsFDiC4Psuu8gpLH1EHDRG8oBGi84X9amRLYO9m1h4=; b=sGDVWWbvabSw9QemcmtEcaNr+OibBkSuY4aBJwLbTnrUgJnJTRi/aVlPQyZywc38O9nf BwxXTbPgMzC0xEjzQSrAfLBTClKYFEfeui+9U6US4T5e6+SoZs4sz4WJIMnsWICF4MxGM ycPII1ROLCMaReaXJLcM8Pu8QiZgaIjoSGWt5IA5vtdQP5LNI1W/64nZ7yqT2nu4j5v5X c6VYmTYrojjL5dHW6HjHI62SdGtulAQ9RH09q5zIfbDtW0R2BOKSLTDmuBM90L962HGPd Bzg5bS6dJDdzh7a+WOomLeKUBkoR4se6g9t02Ci7/GkzOXbrNEDyjbBFX31zQAkRMHw== ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=C8WQ+ofo; arc=fail smtp.remote-ip=192.198.163.11 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.11]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 24A9F606A324 for ; Tue, 3 Nov 2026 08:59:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 24A9F606A324 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=C8WQ+ofo DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1793696366; x=1825232366; h=date:from:to:cc:subject:message-id:references: content-transfer-encoding:in-reply-to:mime-version; bh=XidyXXGIPcADK+/o9ovIrcRn1fNJHgoKEvvy74yPQbE=; b=C8WQ+ofoi6gyhQEqKd+CA4BqmTPi2R/c+XcfPKb4xoYsRbp1K86Bn57h FOzGXnbNZ1ERSH7DuoZeEApDN14rCAmd+vE87hNuObNJlh7/xwXDg7pIo V6IZ6gS1KiNLCFJpHKmotM+sKaaNta4gZcoXT5Tu1+1H3gschQOJmq414 8JSq45yoiapak3sU5AMyIiIYYkG1maOvri3Iy8Yo657Txpb1uSnm5m6pF OKz64KXLMdZjnE3tnOZGFWPVu3AVgtOm4lXymhouD+bggfsLQMfijIHG7 XNPViavRpV+qyfFCF7t4ayt5piYvtx1QgsX4HIhr3RMrtelHQloacZNj7 Q==; X-CSE-ConnectionGUID: 4+cCMoXxS3y/JZGOEvySlQ== X-CSE-MsgGUID: 8xmpp+vyQrG0G4MYaLZPOg== X-IronPort-AV: E=McAfee;i="6800,10657,11954"; a="2319378" X-IronPort-AV: E=Sophos;i="6.27,192,1787036400"; d="scan'208";a="2319378" Received: from fmviesa011.fm.intel.com ([10.60.135.151]) by fmvoesa105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Nov 2026 00:57:49 -0800 X-CSE-ConnectionGUID: V+kkPV/rQCqJYSLDD3yLMw== X-CSE-MsgGUID: 3QeSjGVHT9G+2irX+e7rxA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.27,192,1787036400"; d="scan'208";a="8152490" Received: from orsmsx902.amr.corp.intel.com ([10.22.229.24]) by fmviesa011.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Nov 2026 00:57:48 -0800 Received: from ORSMSX901.amr.corp.intel.com (10.22.229.23) by ORSMSX902.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.56; Tue, 3 Nov 2026 00:57:47 -0800 Received: from ORSEDG901.ED.cps.intel.com (10.7.248.11) by ORSMSX901.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.56 via Frontend Transport; Tue, 3 Nov 2026 00:57:47 -0800 Received: from SN4PR2101CU001.outbound.protection.outlook.com (40.93.195.42) by edgegateway.intel.com (134.134.137.111) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.56; Tue, 3 Nov 2026 00:57:47 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ajQTLAKgZyytBNAk7rsCGlFPbCBf3Qfgmg1qg+XLT/iDQM815LIxnQlgQxEL911/PTbULOy9nLbNLfVOxD/E5xjcSomxY71Uyn2D6+yZZCNyCHESJ+gK+EDoXVEKzKtmhh4Zp5IskKhJkfOFH/w5OFRogk3Qca7pqctsXGMc1vkoq2XIIsY+zoME7PkEuELtqCHRk8qQayt6+Bh9f6KJluXXC1xibcIN0RVwj73Z6QRlr6cCaWjiy0+OQAZWZJkTNJmivp6karClWDr1apKZo3jc9r8PDHKCoAXMiv+/NHSC0TiNWVfqaCeoGJyXawEU9L1/bQS2mVhzRXE4PtSZ0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=XFkYlFiTTerDlRp9NeLc5u648AW1LqHejgtaSsOB1Kk=; b=eu4x3xwMshShEMHbK3R/72mkULKS7LQ9TQxFWgHjLCBgeSPVaC4WL2QPOHUcN6ZG/lCnVsLY42tll7557gA+5H0JoY+WFMfMHJ1fN1zOj6D6bcR7t3wYGw5gjYsM4eAbq6JpQU5kNMPinQeLRheJ+wGL1OUcyvSERpv33qqxgPO5gIGJGZx0exaW+FmtYHATFBwb3zh5hbCBeFEN1hJs9cEBHwmjoQZRQFaDBOH2a0VmRjfvPsopaU2JQnZWPOuKyF5Orqp3Gdw/9TeQe+6b8G3vM2yDV6h3ujnH5bntrsBSVXpVv8vqjmBBySSpIYntMeXMTI/G/uQt4TjjhKSq+A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from IA0PR11MB8380.namprd11.prod.outlook.com (2603:10b6:208:485::21) by CH3PR11MB7763.namprd11.prod.outlook.com (2603:10b6:610:145::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.569.12; Tue, 3 Nov 2026 08:57:45 +0000 Received: from IA0PR11MB8380.namprd11.prod.outlook.com ([fe80::ea8e:eec4:f8d3:f95d]) by IA0PR11MB8380.namprd11.prod.outlook.com ([fe80::ea8e:eec4:f8d3:f95d%5]) with mapi id 15.21.0569.011; Tue, 3 Nov 2026 08:57:44 +0000 Date: Tue, 3 Nov 2026 16:57:34 +0800 From: Chao Gao To: "Edgecombe, Rick P" CC: "kvm@vger.kernel.org" , "linux-coco@lists.linux.dev" , "linux-kernel@vger.kernel.org" , "Van De Ven, Arjan" , "Xu, Yilun" , "dave.hansen@linux.intel.com" , "x86@kernel.org" , "kas@kernel.org" , "hpa@zytor.com" , "mingo@redhat.com" , "bp@alien8.de" , "tglx@kernel.org" Subject: Re: [RFC PATCH v1 2/3] x86/virt/seamldr: Support large TDX module binaries Message-ID: References: <20261030085304.3886520-1-chao.gao@intel.com> <20261030085304.3886520-3-chao.gao@intel.com> <396de152b28fc1be18bfd61fd0ee7501c188e661.camel@intel.com> Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <396de152b28fc1be18bfd61fd0ee7501c188e661.camel@intel.com> X-ClientProxiedBy: PS2PR01CA0054.apcprd01.prod.exchangelabs.com (2603:1096:300:57::18) To IA0PR11MB8380.namprd11.prod.outlook.com (2603:10b6:208:485::21) X-Mailing-List: linux-coco@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: IA0PR11MB8380:EE_|CH3PR11MB7763:EE_ X-MS-Office365-Filtering-Correlation-Id: 9bfa585d-8d8f-424a-237a-08df3988866e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|376014|7416014|1800799024|366016|11063799006|4143699003|56012099006|261009223027099003|261028144727099003|261026140227099003|261022105027099003|261026121527099003|261022075727099003|10067099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: gM7kUdHYuWhLQnM/BtWKUMYeOljHm5K6Qo8UeH5GPtDSttBsrnLV+gBTlFJkh1oPHhd1vWiLVZnqt7jKAfq+ZVMg1+OqK2ccJ1tR5+ZisLpzHXikEkY9mD9wuFZAOksDqKpt5xaDYl9awTHjZBjOYFuJgtQdvgYg8Ub4JLP6jLH9vahOvU4p8okIa3DUh0u3+HFZCYwJ8XookmnQbpkKTzMr9muTrajDejkdRhpdI93zj8Zzao78qOQ2ZCqy18KGyaffe2EFlGV/iit1Cz0LOvVUQNKQF3TNtgeZ5aIJq2YAZvvEf65hv+/9fYnJ7QnMeNGvJ/wFB/2VNqRbJwckYYSI/7lNfjaXv2cEx9VkrzqapShgnxcNkj7fHlAiNFSTaZuoTCHQ2CYuIxDauiZlGaN3r4SWHDAIiRx48LOXpk6CZ5pAawIzGYuXzLCnUvQ7yrP88e3DGccLRmn23+siTcVdSl4YNmtoilA/leoFDlrPVuN3H1ta3cO1UEAbe8hqWDhEnvl0Rwu+KXQ8mqcWOB0G0J1TgpmgdaLzsHz/3hDQV9Rekf29p56m2uSxJoXegw8zg6Nr4/Bh3Xd9wWpWAMFC4xs+sCuE17FrvAn1nzbHLwmKHJczkpGgZtVhn+m5tmPeiHt3lOfGcQ4543Jpy+2sNRdYnqJzq4CjymxLY4k= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:IA0PR11MB8380.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(376014)(7416014)(1800799024)(366016)(11063799006)(4143699003)(56012099006)(261009223027099003)(261028144727099003)(261026140227099003)(261022105027099003)(261026121527099003)(261022075727099003)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?iso-8859-1?Q?Ljlm6Yw6Lxwdzi+Ok0Z4aBup2toOzGEzoOJmK8ECpm9Tk9wOO4o1/gwrbz?= =?iso-8859-1?Q?r+MOyzT5L84I059w0Mi5vNH+F09ZrmXTV1svgygghNEba75ll/2ueNHY5O?= =?iso-8859-1?Q?76a9N0jz6iYJGmh3JjSU0p/B2gGOjTOdZqjqE1r7n/5kzrylRWxYaHSFRg?= =?iso-8859-1?Q?izlYt1DeVjlGP+CoaiTlDz41wkZSlb7rT/dPUt1jC6mgFEVffQuWp6vg5b?= =?iso-8859-1?Q?WTYsSdXuhOYcT2Dm4stgffaIVU0auKJv4zRHp8CVgDuXZX1vmTQBgqo1YU?= =?iso-8859-1?Q?w4dUHyx+zEgozDtip/d+J7vPI0w0FBzEgQz1pyBgHQGvuCx6FzpgoCUQ/2?= =?iso-8859-1?Q?AWDlrhyXDhH98kqOCDnAD9Tk1Rup10FFf5svkalwgMZH+q3Z9Bfct/aYo/?= =?iso-8859-1?Q?NEbVAjJmGOWVOo9UKBmql2tEpYjhQwgUv25YlQr0yG95x+gBd/4+UwDpB9?= =?iso-8859-1?Q?FALAYIItlxXfsPQZvmEoXXXb/TiHT5H9ACq1HtEDbzxgon2D2wjQPD1Mhn?= =?iso-8859-1?Q?PHrf16YvWfgXiYIUFEkVryWoB1lKElW3hKMz5aOTYYZ/bwSTs9XLedosiN?= =?iso-8859-1?Q?m60XKQ2jq65V7cA4smfcztcoeiwKFHfChYzPQQ3c4AlSkIqKjoHXByHMXI?= =?iso-8859-1?Q?X7o9qIQQFbQdrQmVexS+zklHP4XpcT/9CbQgIXBI6qabDsmAAppTQR8aXv?= =?iso-8859-1?Q?dCGJOnd4l98vzXAHSNb3bsoHpUhegFFMAtIauA0iQN6mYyFxCgnqbdZ9md?= =?iso-8859-1?Q?Te28B6yl4jy3k56nI9BGyG1UGeKW9My08cM++Cfjwxhw8pB1Od7NujvGyX?= =?iso-8859-1?Q?hiC1NUodbNHjzg47o5UdsNEbUVUWCWDKWt1K8uF+4zplkZABDwZsmca4/H?= =?iso-8859-1?Q?9/m2fEgK575S1Q4yN0OTAU0/2qMBiBI8HiIhXkVzJuQSYfg54FQ6xjMox1?= =?iso-8859-1?Q?plYowIsFY4b9lcXvU5wbCa9JpugXvQU6PP63CCTa9oQAlad+xBmL3nXRGJ?= =?iso-8859-1?Q?dBCXzyao0mHnye0jsACJpxT1ry8EPLxxnlP99pj2LYruBJriHa7+Z3r8Xa?= =?iso-8859-1?Q?gNePnTpdOl+V9sJfpjEH4gReeWd+KnrlKXXrAJ+dTPNb6NzgsOPUCO752u?= =?iso-8859-1?Q?FzOR6ojW5gNqaemQKdFBnPAYGDm+aJFJbGQ9JUTyJdwC3nzKXAQ0ZYgyYw?= =?iso-8859-1?Q?/UDeZHv8jvYqAyGYCrt4NqNj3jEN6i2FFkQRDHsR/LovZmyJdBNtmFiI/w?= =?iso-8859-1?Q?K2j8uPC5xEEQ7slbfONlTFKqbsOYtByuEB10iBe52eE22ubPup0kCU6iYZ?= =?iso-8859-1?Q?Lut3pRdkOSWiReEaZx8DaWPGugTC5TJlvUk7fenA+scts3xQdWlkeWpAws?= =?iso-8859-1?Q?2YEkhZJ3JxDFPbfHIgrLjvGcX6oGpzc1JMSBXWLtn2Gu9VUUFBJBTGQfDE?= =?iso-8859-1?Q?ztz06OPlJIjrEi5B2S4CE9hrriTyOrQ50dYrDObI7me1iuYWBIJ/D4GtKC?= =?iso-8859-1?Q?6Dh3FBbCyLFTKKAcR7YiBSBhSWIqxMkcXfY8WTmM5RnsMqXjsgLK52261k?= =?iso-8859-1?Q?6lgiuBVsXrg5CxamO5On6WSo6l+KtnITan9fpfQl5IvBLSLOYwB859dZWQ?= =?iso-8859-1?Q?By9ugpnZ8wyCf9lOygH3UdDPbKhQiMKTcWrGvL9rVc83/qc4tjK9dcGYCn?= =?iso-8859-1?Q?5mlgLUM3QNg87mqlE4QToD5Bw/QSd+TYvdICYcDkeP6lEr4CGxRLR+4wNs?= =?iso-8859-1?Q?hQDnoTIPANJXKRKsbjfUoDSyS4VLHHMjEgNPgN5JxKCeomFhMN/bLgRJFH?= =?iso-8859-1?Q?/lv0s4xhbQ=3D=3D?= X-Exchange-RoutingPolicyChecked: eQxNZZFksSxFqYAgbMtM/jWJ6Yx/k4qASsrgzyvyoCf2laFgawRAF/aGPKYUG3yI2Me0KLTDfX1g5bz7RDW4dWDKE+rS9v/PMvlWkkg6r2tBCP6iqe4BNLXGxbVMIQau98vk9jjqgaae/HzCazNXomgxRjPYyVwBWvUesuM7TTJuPPR05008o1HfVDU+wrUF7zGPkgRC1uDAMGuV6TwvTr7yRl9uIXiYsboHxIEcZxNefi4XiHie5rL9POX341bmhjPt2S6MBA7RvAFJOUL5POk4bdn8X+FOf+Y4gdmq99FOgW4f0ncf6pUGJ2v5Ic8R5v/LWFPCDcgWYvf5d40ngg== X-MS-Exchange-CrossTenant-Network-Message-Id: 9bfa585d-8d8f-424a-237a-08df3988866e X-MS-Exchange-CrossTenant-AuthSource: IA0PR11MB8380.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Nov 2026 08:57:44.6564 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: FNXrmJ58ePPj5NuiU8BY/3z0vkO0l2foHfAHFGLJtLIh03tYCl1Mhn1fHBs/K+ocZu33O7Wx3PvPiHBYKfQs0g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR11MB7763 X-OriginatorOrg: intel.com >> +/* >> + * Like populate_pa_list(), but skip entries pointing to the next page. >> + */ >> +static void populate_module_pa_list(struct seamldr_params *params, >> +     const u8 *vmalloc_addr, u32 >> vmalloc_len_pages) >> +{ >> + u64 *pa_list = params->module_pages_pa_list; >> + int i, j; >> + >> + for (i = 0, j = 0; i < vmalloc_len_pages; i++, j++) { >> + unsigned long offset = i * PAGE_SIZE; >> + unsigned long pfn = vmalloc_to_pfn(&vmalloc_addr[offset]); >> + >> + /* >> + * Skip non-zero entries. They point to the next page and >> + * are populated during allocation. >> + */ >> + if (pa_list[j]) >> + j++; > >We know what position in the page this should be right? Can we do some modulus >and skip it that way? Feels less hacky. Yes, the link is always the last entry of a page. how about: /* * The last entry of each page points to the next chain * page. */ if (PAGE_ALIGNED(&pa_list[j + 1])) j++; > >> + >> + pa_list[j] = pfn << PAGE_SHIFT; >> + } >> +} >> + >> +static struct seamldr_params *alloc_seamldr_params(u32 nr_module_pages) >> +{ >> + struct seamldr_params *params; >> + u32 nr_chain_pages; >> + u32 nr_direct; >> + u64 *link; >> + >> + /* >> + * Number of module pages that fit directly in > >"fit directly" feels like adding jargon where there doesn't need to be. [...] > >> + * module_pages_pa_list[]. Minus one as the last entry is >> + * reserved to point to the first chain page. >> + */ >> + nr_direct = SEAMLDR_NR_MODULE_PA_ENTRIES - 1; >> + >> + /* Calculate the number of extra chain pages needed. */ >> + nr_chain_pages = 0; >> + if (nr_module_pages > nr_direct) { >> + u32 nr_left = nr_module_pages - nr_direct; >> + >> + nr_chain_pages = DIV_ROUND_UP(nr_left, >> SEAMLDR_NR_CHAIN_PA_ENTRIES); > >Left pages, module pages, direct pages and chain pages. It's a lot... [...] > >> + } >> + >> + params = kzalloc_flex(*params, chain_pages, nr_chain_pages); >> + if (!params) >> + return NULL; >> + >> + /* Link all the chain pages. */ >> + link = ¶ms->module_pages_pa_list[nr_direct]; >> + for (int i = 0; i < nr_chain_pages; i++) { >> + struct chain_page *page = ¶ms->chain_pages[i]; >> + >> + *link = __pa(page); >> + link = &page->next_page_pa; >> + } >> + >> + return params; >> +} > >This all seems like more than should be needed. Most of the complexity came from sizing the allocation exactly. If we over-allocate a little instead, the size calculation becomes much simpler. Making module_pages_pa_list[] a flexible array also removes the need to treat its entries differently from those in the chain pages. And linking the pages while filling in the module page addresses removes the separate linking loop. We could even fold populate_module_pa_list() into populate_pa_list(). That works because sigstruct_pages_pa_list[] never reaches the end of a page. It would save a function, but it looks a bit hacky for the sigstruct pages, because the spec defines links only for the module page list. I am not sure which is better. Do you have a preference? diff --git a/arch/x86/virt/vmx/tdx/seamldr.c b/arch/x86/virt/vmx/tdx/seamldr.c index b1137ca6150d..cd4a00a7b02e 100644 --- a/arch/x86/virt/vmx/tdx/seamldr.c +++ b/arch/x86/virt/vmx/tdx/seamldr.c /* @@ -48,11 +54,9 @@ struct seamldr_params { u64 sigstruct_pages_pa_list[SEAMLDR_MAX_NR_SIG_PAGES]; u8 reserved[104]; u64 module_nr_pages; - u64 module_pages_pa_list[SEAMLDR_MAX_NR_MODULE_PAGES]; + u64 module_pages_pa_list[]; } __packed; -static_assert(sizeof(struct seamldr_params) == 4096); - /* * Serialize P-SEAMLDR calls since the hardware only allows a single CPU to * interact with P-SEAMLDR simultaneously. Use raw version as the calls can @@ -143,6 +147,55 @@ static void populate_pa_list(u64 *pa_list, const u8 *vmalloc_addr, u32 vmalloc_l } } +/* + * Like populate_pa_list(), but skip entries pointing to the next page. + */ +static void populate_module_pa_list(struct seamldr_params *params, + const u8 *vmalloc_addr, u32 vmalloc_len_pages) +{ + u64 *pa_list = params->module_pages_pa_list; + int i, j; + + for (i = 0, j = 0; i < vmalloc_len_pages; i++, j++) { + unsigned long offset = i * PAGE_SIZE; + unsigned long pfn = vmalloc_to_pfn(&vmalloc_addr[offset]); + + /* + * The last entry of each page points to the next chain + * page. + */ + if (PAGE_ALIGNED(&pa_list[j + 1])) { + pa_list[j] = __pa(&pa_list[j + 1]); + j++; + } + + pa_list[j] = pfn << PAGE_SHIFT; + } +} + +static struct seamldr_params *alloc_seamldr_params(u32 nr_module_pages) +{ + struct seamldr_params *params; + u32 nr_pages; + + if (nr_module_pages > SEAMLDR_MAX_NR_MODULE_PAGES) + return ERR_PTR(-EINVAL); + + /* + * One page for 'struct seamldr_params', plus chain pages that + * each hold 511 module page addresses and a link to the next + * page. Ignoring the addresses held in the first page + * over-allocates a little. + */ + nr_pages = 1 + DIV_ROUND_UP(nr_module_pages, 511); + + params = kzalloc(nr_pages * PAGE_SIZE, GFP_KERNEL); + if (!params) + return ERR_PTR(-ENOMEM); + + return params; +} +