From: Peter Fang <peter.fang@intel.com>
To: Nikolay Borisov <nik.borisov@suse.com>
Cc: Xu Yilun <yilun.xu@linux.intel.com>, <x86@kernel.org>,
<kvm@vger.kernel.org>, <linux-coco@lists.linux.dev>,
<linux-kernel@vger.kernel.org>, <djbw@kernel.org>,
<kas@kernel.org>, <rick.p.edgecombe@intel.com>,
<yilun.xu@intel.com>, <xiaoyao.li@intel.com>,
<sohil.mehta@intel.com>, <adrian.hunter@intel.com>,
<kishen.maloor@intel.com>, <tony.lindgren@linux.intel.com>,
<baolu.lu@linux.intel.com>, <zhenzhong.duan@intel.com>,
<dave.hansen@intel.com>, <dave.hansen@linux.intel.com>,
<seanjc@google.com>
Subject: Re: [PATCH v2 08/17] x86/virt/tdx: Prepare Quote buffer during extension bringup
Date: Mon, 13 Jul 2026 03:19:54 -0700 [thread overview]
Message-ID: <20260713101944.GA3178326@pedri> (raw)
In-Reply-To: <d13c4073-b248-40ac-aa28-1c0dfc6b9043@suse.com>
On Wed, Jul 08, 2026 at 10:52:07AM +0300, Nikolay Borisov wrote:
>
>
> On 6/18/26 11:13, Xu Yilun wrote:
> > From: Peter Fang <peter.fang@intel.com>
> >
> > During TDX attestation, the TDX guest asks the host to generate a
> > signed, verifiable structure (a "Quote"). With the Quoting extension,
> > the TDX module returns the Quote in pages that the host shares via an
> > Extension-SEAMCALL.
>
> nit: Just say the host provides the pages to the TDX module, no need to
> specify if it's via an ext seamcall or some otherway. One can infer this
> from the code itself.
Good point. Thanks for the simplification.
>
> >
> > The SEAMCALL accepts the host buffer pages as a linked list of 4KB
> > "HPA_LINKED_LIST" nodes. Each entry holds the physical address of a 4KB
> > data page, except for the last entry, which points to the next node. The
> > TDX module reports the required Quote buffer size through a global
> > metadata field. See [1] for details.
>
> That HPA_LINKED_LIST is basically a linked list of arrays, each node into
> the linked list being the array, and each entry of that array being the HPA
> witht he last being a pointer to the next HPA_LINKED_LIST, so in a way a 2
> level data structure. Can you be more explicit and just say something along
> the lines of :
>
> "SEAMCALL accepts host buffer pages arranged in a custom data structure,
> consisting of nodes containing HPAs, arranged linearly, and each node is
> linked to the next one via the last entry"
Oh this is much easier to read. Thanks for the suggestion! I can
incorporate this.
>
> > +
> > +#define HPAS_PER_NODE (PAGE_SIZE / sizeof(u64))
> > +
> > +/*
> > + * Pass the quote buffer to the TDX module as an HPA linked list, where each
> > + * node holds 4KB page HPAs and the last entry points to the next node.
> > + */
> > +static __init int tdx_quote_create_buf(unsigned int npages,
> > + struct tdx_quote_data *qdata)
> > +{
> > + unsigned int nnodes;
> > + u64 *hpas;
> > + void *qbuf;
> > + int i, j;
> > +
> > + if (!npages)
> > + return -EINVAL;
> > +
> > + /*
> > + * Each node holds up to (HPAS_PER_NODE - 1) 4KB page HPAs.
> > + * The last entry of the node points to the next node.
> > + */
> > + nnodes = DIV_ROUND_UP(npages, HPAS_PER_NODE - 1);
> nit: It's somewhat arbitrary but num_nodes seems more explicit, saving 3
> chars is not worth it.
Sure, I can make this change.
> > +
> > + hpas = vmalloc_array(nnodes, PAGE_SIZE);
>
> hpas is basically the starting node, so name it "nodes". Also I'm slightly
> confused why you use vmalloc to allocate a contiguous address space when the
> nodes are linked in a list? I.e you keep referring to list in the changelog
> and the code seems to be working in an array chunks?
Hmm. I used the vmalloc family because I wanted to keep using hpas[i]
without switching to the next node's va. It felt a bit simpler to just
keep doing "i++". Maybe that actually hurts readability? I can replace
that part of the for loop with something like:
if (i == HPAS_PER_NODE - 1) {
next_node = kmalloc(PAGE_SIZE, GFP_KERNEL);
hpas[i] = virt_to_phys(next_node);
hpas = next_node;
i = 0;
}
And "hpas[i]" feels a bit closer to what the code does than "nodes[i]"?
It's filling this page with a bunch of HPAs.
>
> > + if (!hpas)
> > + return -ENOMEM;
> > +
> > + /*
> > + * ~0ULL is the list terminator for HPA_LINKED_LIST.
> > + *
> > + * Pre-fill the last node with 0xff bytes so that unused entries are
> > + * terminators. Overwrite populated entries later.
> > + */
> > + memset((u8 *)hpas + (nnodes - 1) * PAGE_SIZE, 0xff, PAGE_SIZE);
> > +
> > + qbuf = vcalloc(npages, PAGE_SIZE);
> > + if (!qbuf)
> > + goto out_nomem;
>
> 'qbuf' is rather arbitrary here. You simply pre-allocate a bunch of pages
> which you then initialize into the nodes. Can't this allocation be moved
> inside the loop itself, of course it will increase the number of allocs
> happening but this is during initialization so it's not performance
> critical, yes?
I see your point. It’s a bit subtle here. In patch 11, there is a
kvmemdup() that depends on this qbuf being virtually contiguous. Based
on feedback from other folks, I think I might change this and use
runtime quote buffers allocated with kmalloc(). That would also avoid
the TLB flushing penalty of vfree(). The free path would be a bit more
complicated, but that should be okay.
>
> > +
> > + /* Populate the linked list */
> > + for (i = 0, j = 0; j < npages; i++) {
>
> nit: This feedback was given before, but both variables can be defined in
> this loop.
Great suggestion. I can do that. Thanks.
>
>
next prev parent reply other threads:[~2026-07-13 10:20 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-18 8:13 [PATCH v2 00/17] Enable DICE-based TDX Quoting Extension Xu Yilun
2026-06-18 8:13 ` [PATCH v2 01/17] x86/virt/tdx: Embed version info in SEAMCALL leaf function definitions Xu Yilun
2026-06-18 14:45 ` Dave Hansen
2026-06-22 12:05 ` Xu Yilun
2026-06-18 8:13 ` [PATCH v2 02/17] x86/virt/tdx: Configure add-on features on TDX module init and update Xu Yilun
2026-06-18 15:04 ` Dave Hansen
2026-06-22 13:15 ` Xu Yilun
2026-06-24 12:00 ` Xu Yilun
2026-06-24 22:10 ` Peter Fang
2026-06-25 6:33 ` Xu Yilun
2026-06-23 8:43 ` Chao Gao
2026-06-25 10:50 ` Xu Yilun
2026-06-18 8:13 ` [PATCH v2 03/17] x86/virt/tdx: Detect if the extensions initialization is required Xu Yilun
2026-06-25 5:19 ` Tony Lindgren
2026-06-25 10:57 ` Xu Yilun
2026-06-29 6:33 ` Chao Gao
2026-06-30 11:10 ` Xu Yilun
2026-06-18 8:13 ` [PATCH v2 04/17] x86/virt/tdx: Add extra memory to TDX module for the extensions Xu Yilun
2026-06-18 8:54 ` sashiko-bot
2026-06-24 1:53 ` Xu Yilun
2026-06-29 7:56 ` Chao Gao
2026-06-30 10:27 ` Xu Yilun
2026-06-18 8:13 ` [PATCH v2 05/17] x86/virt/tdx: Make TDX module initialize " Xu Yilun
2026-06-18 8:54 ` sashiko-bot
2026-06-23 17:03 ` Xu Yilun
2026-06-18 8:13 ` [PATCH v2 06/17] x86/virt/tdx: Re-initialize the extensions on runtime TDX module update Xu Yilun
2026-06-18 8:58 ` sashiko-bot
2026-06-25 7:01 ` Xu Yilun
2026-06-29 8:12 ` Chao Gao
2026-06-30 11:14 ` Xu Yilun
2026-06-18 8:13 ` [PATCH v2 07/17] x86/virt/tdx: Initialize Quoting extension Xu Yilun
2026-06-18 8:50 ` sashiko-bot
2026-06-25 10:24 ` Peter Fang
2026-06-29 8:33 ` Chao Gao
2026-06-30 5:20 ` Peter Fang
2026-06-18 8:13 ` [PATCH v2 08/17] x86/virt/tdx: Prepare Quote buffer during extension bringup Xu Yilun
2026-06-25 6:08 ` Tony Lindgren
2026-06-30 4:12 ` Peter Fang
2026-07-01 19:56 ` Dave Hansen
2026-07-08 9:25 ` Peter Fang
2026-07-08 7:52 ` Nikolay Borisov
2026-07-13 10:19 ` Peter Fang [this message]
2026-06-18 8:13 ` [PATCH v2 09/17] x86/virt/tdx: Add interface to check Quoting availability Xu Yilun
2026-06-25 6:09 ` Tony Lindgren
2026-06-18 8:13 ` [PATCH v2 10/17] x86/virt/tdx: Move tdx_tdr_pa() up in the file Xu Yilun
2026-06-25 6:10 ` Tony Lindgren
2026-06-18 8:13 ` [PATCH v2 11/17] x86/virt/tdx: Add interface to generate a Quote Xu Yilun
2026-06-18 8:49 ` sashiko-bot
2026-06-30 15:28 ` Peter Fang
2026-06-25 6:05 ` Tony Lindgren
2026-06-30 4:22 ` Peter Fang
2026-06-18 8:13 ` [PATCH v2 12/17] x86/virt/tdx: Reinitialize the Quoting extension after TDX module update Xu Yilun
2026-06-25 6:12 ` Tony Lindgren
2026-06-18 8:13 ` [PATCH v2 13/17] x86/virt/tdx: Enable Quoting extension Xu Yilun
2026-06-25 6:13 ` Tony Lindgren
2026-06-18 8:13 ` [PATCH v2 14/17] x86/tdx: Move and rename Quote request structure Xu Yilun
2026-06-25 6:15 ` Tony Lindgren
2026-06-18 8:13 ` [PATCH v2 15/17] KVM: TDX: Factor out userspace return path from tdx_get_quote() Xu Yilun
2026-06-25 6:16 ` Tony Lindgren
2026-06-18 8:13 ` [PATCH v2 16/17] KVM: TDX: Add in-kernel Quote generation Xu Yilun
2026-06-18 9:03 ` sashiko-bot
2026-06-30 15:52 ` Peter Fang
2026-06-25 18:01 ` Sean Christopherson
2026-06-29 10:03 ` Peter Fang
2026-06-30 0:42 ` Sean Christopherson
2026-06-30 23:33 ` Edgecombe, Rick P
2026-07-01 0:24 ` Dan Williams (nvidia)
2026-07-01 17:25 ` Sean Christopherson
2026-07-01 18:45 ` Edgecombe, Rick P
2026-07-04 5:43 ` Peter Fang
2026-07-06 17:57 ` Sean Christopherson
2026-07-08 20:47 ` Dave Hansen
2026-07-08 21:16 ` Sean Christopherson
2026-07-08 22:09 ` Peter Fang
2026-07-08 22:28 ` Sean Christopherson
2026-07-08 23:38 ` Edgecombe, Rick P
2026-07-10 9:01 ` Nikolay Borisov
2026-07-10 9:38 ` Peter Fang
2026-07-08 21:37 ` Sean Christopherson
2026-07-10 12:52 ` Peter Fang
2026-07-10 14:48 ` Sean Christopherson
2026-07-10 22:59 ` Peter Fang
2026-06-18 8:13 ` [PATCH v2 17/17] KVM: TDX: Support event-notify interrupts only with userspace Quoting Xu Yilun
2026-06-25 6:28 ` Tony Lindgren
2026-06-30 6:36 ` Peter Fang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260713101944.GA3178326@pedri \
--to=peter.fang@intel.com \
--cc=adrian.hunter@intel.com \
--cc=baolu.lu@linux.intel.com \
--cc=dave.hansen@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=djbw@kernel.org \
--cc=kas@kernel.org \
--cc=kishen.maloor@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=nik.borisov@suse.com \
--cc=rick.p.edgecombe@intel.com \
--cc=seanjc@google.com \
--cc=sohil.mehta@intel.com \
--cc=tony.lindgren@linux.intel.com \
--cc=x86@kernel.org \
--cc=xiaoyao.li@intel.com \
--cc=yilun.xu@intel.com \
--cc=yilun.xu@linux.intel.com \
--cc=zhenzhong.duan@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.