Re: [PATCH v2 12/17] x86/virt/tdx: Reinitialize the Quoting extension after TDX module update

"Edgecombe, Rick P" <[email protected]> Mon, 27 Jul 2026 18:33:42 +0000
Newsgroups dev.linux.lists.linux-coco,org.kernel.vger.kvm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Thu, 2026-06-18 at 16:13 +0800, Xu Yilun wrote:
> From: Peter Fang <[email protected]>
> 
> Invoke TDH.QUOTE.INIT again after a runtime module update to trigger the
> necessary rekey procedure in the TDX module.
> 
> Keep the existing Quote buffer since memory allocation is not permitted
> during the update. Compatible TDX module updates must not increase the
> Quote buffer size, or an undersized buffer might cause Quote generation
> to fail. See [1] for module update details.
> 
> [1] Documentation/arch/x86/tdx.rst, Section "TDX module Runtime Update"
> 
> Signed-off-by: Peter Fang <[email protected]>
> ---
>  arch/x86/virt/vmx/tdx/tdx.c | 31 ++++++++++++++++++++++++++++---
>  1 file changed, 28 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
> index ac0da4966697..81e7b6b1dacb 100644
> --- a/arch/x86/virt/vmx/tdx/tdx.c
> +++ b/arch/x86/virt/vmx/tdx/tdx.c
> @@ -1353,8 +1353,11 @@ static __init int tdx_quote_create_buf(unsigned int
> npages,
>  	return -ENOMEM;
>  }
>  
> -/* Initialize quoting extension */
> -static __init int tdx_quote_init(void)
> +/*
> + * Initialize quoting extension.
> + * It also rekeys the TDX module after a runtime module update.
> + */
> +static int tdx_quote_init(void)
>  {
>  	struct tdx_module_args args = {};
>  	u64 r;
> @@ -1539,6 +1542,22 @@ static __init int init_tdx_module_extensions(void)
>  	return 0;
>  }
>  
> +static void update_tdx_quoting_extension(void)
> +{
> +	int ret;
> +
> +	if (tdx_addon_feature0 & TDX_FEATURES0_QUOTE) {
> +		/*
> +		 * The TDH.QUOTE.INIT call renews the quoting keys.
> +		 *
> +		 * A module update must not increase the quote buffer size,
> or
> +		 * quote generation may fail and break attestation.
> +		 */

It makes sense to explain why to call this again, but I'm not sure how this
comment helps.

> +		ret = tdx_quote_init();
> +		WARN_ON(ret);
> +	}

Since the caller of this function has an return code. Please justify why not to
return an error. 

> +}
> +
>  /*
>   * Mostly the same flow as init_tdx_module_extensions(), but rejects adding
>   * more memory.
> @@ -1561,7 +1580,13 @@ static int update_tdx_module_extensions(void)
>  	if (sysinfo_ext.memory_pool_required_pages)
>  		return -EFAULT;
>  
> -	return tdx_ext_init();
> +	ret = tdx_ext_init();
> +	if (ret)
> +		return ret;
> +
> +	update_tdx_quoting_extension();
> +
> +	return 0;
>  }
>  
>  static __init int init_tdx_module(void)