All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Huang, Kai" <kai.huang@intel.com>
To: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	"Hansen, Dave" <dave.hansen@intel.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: "Luck, Tony" <tony.luck@intel.com>,
	"bagasdotme@gmail.com" <bagasdotme@gmail.com>,
	"ak@linux.intel.com" <ak@linux.intel.com>,
	"Wysocki, Rafael J" <rafael.j.wysocki@intel.com>,
	"kirill.shutemov@linux.intel.com"
	<kirill.shutemov@linux.intel.com>, "Christopherson,,
	Sean" <seanjc@google.com>,
	"Chatre, Reinette" <reinette.chatre@intel.com>,
	"pbonzini@redhat.com" <pbonzini@redhat.com>,
	"linux-mm@kvack.org" <linux-mm@kvack.org>,
	"Yamahata, Isaku" <isaku.yamahata@intel.com>,
	"Shahar, Sagi" <sagis@google.com>,
	"imammedo@redhat.com" <imammedo@redhat.com>,
	"Gao, Chao" <chao.gao@intel.com>,
	"Brown, Len" <len.brown@intel.com>,
	"peterz@infradead.org" <peterz@infradead.org>,
	"sathyanarayanan.kuppuswamy@linux.intel.com" 
	<sathyanarayanan.kuppuswamy@linux.intel.com>,
	"Huang, Ying" <ying.huang@intel.com>,
	"Williams, Dan J" <dan.j.williams@intel.com>
Subject: Re: [PATCH v7 10/20] x86/virt/tdx: Use all system memory when initializing TDX module as TDX memory
Date: Thu, 24 Nov 2022 02:27:28 +0000	[thread overview]
Message-ID: <8b317553b1ab9821fd570d146619f535f9f6cc2f.camel@intel.com> (raw)
In-Reply-To: <8e6803f5-bec6-843d-f3c4-75006ffd0d2f@intel.com>

On Wed, 2022-11-23 at 17:22 -0800, Hansen, Dave wrote:
> On 11/23/22 17:04, Huang, Kai wrote:
> > On Tue, 2022-11-22 at 16:21 -0800, Dave Hansen wrote:
> > > > +struct tdx_memblock {
> > > > +   struct list_head list;
> > > > +   unsigned long start_pfn;
> > > > +   unsigned long end_pfn;
> > > > +   int nid;
> > > > +};
> > > 
> > > Why does the nid matter?
> > 
> > It is used to find the node for the PAMT allocation for a given TDMR.
> 
> ... which is in this patch?
> 
> You can't just plop unused and unmentioned nuggets in the code.  Remove
> it until it is needed.

OK. I'll move to the PAMT allocation patch.

> 
> 
> > > > +/* Check whether the given pfn range is covered by any CMR or not. */
> > > > +static bool pfn_range_covered_by_cmr(unsigned long start_pfn,
> > > > +                                unsigned long end_pfn)
> > > > +{
> > > > +   int i;
> > > > +
> > > > +   for (i = 0; i < tdx_cmr_num; i++) {
> > > > +           struct cmr_info *cmr = &tdx_cmr_array[i];
> > > > +           unsigned long cmr_start_pfn;
> > > > +           unsigned long cmr_end_pfn;
> > > > +
> > > > +           cmr_start_pfn = cmr->base >> PAGE_SHIFT;
> > > > +           cmr_end_pfn = (cmr->base + cmr->size) >> PAGE_SHIFT;
> > > > +
> > > > +           if (start_pfn >= cmr_start_pfn && end_pfn <= cmr_end_pfn)
> > > > +                   return true;
> > > > +   }
> > > 
> > > What if the pfn range overlaps two CMRs?  It will never pass any
> > > individual overlap test and will return false.
> > 
> > We can only return true if the two CMRs are contiguous.
> > 
> > I cannot think out a reason that a reasonable BIOS could generate contiguous
> > CMRs.
> 
> Because it can?
> 
> We don't just try and randomly assign what we think is reasonable or
> not.  First and foremost, we need to ask whether the configuration in
> question is allowed by the spec.
> 
> Would it be a *valid* thing to have two adjacent CMRs?  Does the TDX
> module spec disallow it?

No the TDX module doesn't disallow it, IIUC.  The spec only says they don't
overlap.

> 
> > Perhaps one reason is two contiguous NUMA nodes?  For this case, memblock
> > has made sure no memory region could cross NUMA nodes, so the start_pfn/end_pfn
> > here should always be within one node.  Perhaps we can add a comment for this
> > case?
> 
> <cough> numa=off <cough>
> 
> > Anyway I am not sure whether it is worth to consider "contiguous CMRs" case.
> 
> I am sure.  You need to consider it.

OK.

Also, as mentioned in another reply to patch "Get information about TDX module
and TDX-capable memory", we can depend on TDH.SYS.CONFIG to return failure but
don't necessarily need to sanity check all memory regions are CMR memory.  This
way we can just removing above sanity check code here.

What do you think?

> 
> > > > + * and don't overlap.
> > > > + */
> > > > +static int add_tdx_memblock(unsigned long start_pfn, unsigned long end_pfn,
> > > > +                       int nid)
> > > > +{
> > > > +   struct tdx_memblock *tmb;
> > > > +
> > > > +   tmb = kmalloc(sizeof(*tmb), GFP_KERNEL);
> > > > +   if (!tmb)
> > > > +           return -ENOMEM;
> > > > +
> > > > +   INIT_LIST_HEAD(&tmb->list);
> > > > +   tmb->start_pfn = start_pfn;
> > > > +   tmb->end_pfn = end_pfn;
> > > > +   tmb->nid = nid;
> > > > +
> > > > +   list_add_tail(&tmb->list, &tdx_memlist);
> > > > +   return 0;
> > > > +}
> > > > +
> > > > +static void free_tdx_memory(void)
> > > 
> > > This is named a bit too generically.  How about free_tdx_memlist() or
> > > something?
> > 
> > Will use free_tdx_memlist().  Do you want to also change build_tdx_memory() to
> > build_tdx_memlist()?
> 
> Does it build a memlist?

Yes.


[...]

> 
> I actually wasn't asking about the for_each_mem_pfn_range() use.
> 
> > And here before skipping first 1MB, we add below:
> > 
> >                 /*
> >                  * The first 1MB is not reported as TDX covertible memory.
> >                  * Although the first 1MB is always reserved and won't end up
> >                  * to the page allocator, it is still in memblock's memory
> >                  * regions.  Skip them manually to exclude them as TDX memory.
> >                  */
> 
> That looks OK, with the spelling fixed.

Yes "covertible" -> "convertible".


[...]

> > > >  out:
> > > > +   /*
> > > > +    * Memory hotplug checks the hot-added memory region against the
> > > > +    * @tdx_memlist to see if the region is TDX memory.
> > > > +    *
> > > > +    * Do put_online_mems() here to make sure any modification to
> > > > +    * @tdx_memlist is done while holding the memory hotplug read
> > > > +    * lock, so that the memory hotplug path can just check the
> > > > +    * @tdx_memlist w/o holding the @tdx_module_lock which may cause
> > > > +    * deadlock.
> > > > +    */
> > > 
> > > I'm honestly not following any of that.
> > 
> > How about:
> > 
> >         /*
> >          * Make sure tdx_cc_memory_compatible() either sees a fixed set of
> >          * memory regions in @tdx_memlist, or an empty list.
> >          */
> 
> That's a comment for the lock side, not the unlock side.  It should be:
> 
> 	/*
> 	 * @tdx_memlist is written here and read at memory hotplug time.
> 	 * Lock out memory hotplug code while building it.
> 	 */

Thanks.

> 
> > > > +   put_online_mems();
> > > >     return ret;
> > > >  }
> > > > 
> > > > @@ -485,3 +645,26 @@ int tdx_enable(void)
> > > >     return ret;
> > > >  }
> > > >  EXPORT_SYMBOL_GPL(tdx_enable);
> > > > +
> > > > +/*
> > > > + * Check whether the given range is TDX memory.  Must be called between
> > > > + * mem_hotplug_begin()/mem_hotplug_done().
> > > > + */
> > > > +bool tdx_cc_memory_compatible(unsigned long start_pfn, unsigned long end_pfn)
> > > > +{
> > > > +   struct tdx_memblock *tmb;
> > > > +
> > > > +   /* Empty list means TDX isn't enabled successfully */
> > > > +   if (list_empty(&tdx_memlist))
> > > > +           return true;
> > > > +
> > > > +   list_for_each_entry(tmb, &tdx_memlist, list) {
> > > > +           /*
> > > > +            * The new range is TDX memory if it is fully covered
> > > > +            * by any TDX memory block.
> > > > +            */
> > > > +           if (start_pfn >= tmb->start_pfn && end_pfn <= tmb->end_pfn)
> > > > +                   return true;
> > > 
> > > Same bug.  What if the start/end_pfn range is covered by more than one
> > > tdx_memblock?
> > 
> > We may want to return true if tdx_memblocks are contiguous.
> > 
> > However I don't think this will happen?
> > 
> > tdx_memblock is from memblock, and when two memory regions in memblock are
> > contiguous, they must have different node, or flags.
> > 
> > My understanding is the hot-added memory region here cannot across NUMA nodes,
> > nor have different flags,  correct?
> 
> I'm not sure what flags are in this context.
> 

The flags in 'struct memblock_region':

enum memblock_flags {           
        MEMBLOCK_NONE           = 0x0,  /* No special request */
        MEMBLOCK_HOTPLUG        = 0x1,  /* hotpluggable region */              
        MEMBLOCK_MIRROR         = 0x2,  /* mirrored region */                  
        MEMBLOCK_NOMAP          = 0x4,  /* don't add to kernel direct mapping */
        MEMBLOCK_DRIVER_MANAGED = 0x8,  /* always detected via a driver */     
};      
        
/**                                                                            
 * struct memblock_region - represents a memory region                         
 * @base: base address of the region                                           
 * @size: size of the region                                                   
 * @flags: memory region attributes
 * @nid: NUMA node id
 */             
struct memblock_region {
        phys_addr_t base;
        phys_addr_t size;
        enum memblock_flags flags;
#ifdef CONFIG_NUMA
        int nid;
#endif  
};      



  reply	other threads:[~2022-11-24  2:27 UTC|newest]

Thread overview: 163+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-21  0:26 [PATCH v7 00/20] TDX host kernel support Kai Huang
2022-11-21  0:26 ` [PATCH v7 01/20] x86/tdx: Define TDX supported page sizes as macros Kai Huang
2022-11-21  2:52   ` Sathyanarayanan Kuppuswamy
2022-11-21  9:15     ` Huang, Kai
2022-11-21 17:23       ` Sathyanarayanan Kuppuswamy
2022-11-21 18:12     ` Dave Hansen
2022-11-21 23:48   ` Dave Hansen
2022-11-22  0:01     ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 02/20] x86/virt/tdx: Detect TDX during kernel boot Kai Huang
2022-11-21  3:07   ` Sathyanarayanan Kuppuswamy
2022-11-21  9:37     ` Huang, Kai
2022-11-21 23:57       ` Sathyanarayanan Kuppuswamy
2022-11-22  0:10   ` Dave Hansen
2022-11-22 11:28     ` Huang, Kai
2022-11-22 16:50       ` Dave Hansen
2022-11-22 23:21         ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 03/20] x86/virt/tdx: Disable TDX if X2APIC is not enabled Kai Huang
2022-11-21  3:51   ` Sathyanarayanan Kuppuswamy
2022-11-21  9:44     ` Huang, Kai
2022-11-21 22:00       ` Sathyanarayanan Kuppuswamy
2022-11-21 23:40         ` Huang, Kai
2022-11-21 23:46   ` Dave Hansen
2022-11-22  0:30     ` Huang, Kai
2022-11-22  0:44       ` Dave Hansen
2022-11-22  0:58         ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 04/20] x86/virt/tdx: Add skeleton to initialize TDX on demand Kai Huang
2022-11-22  9:02   ` Peter Zijlstra
2022-11-22 10:31     ` Thomas Gleixner
2022-11-22 15:35       ` Dave Hansen
2022-11-22 20:03         ` Thomas Gleixner
2022-11-22 20:11           ` Sean Christopherson
2022-11-23  0:30           ` Huang, Kai
2022-11-23  1:12             ` Huang, Kai
2022-11-23 11:05             ` Thomas Gleixner
2022-11-23 12:22               ` Huang, Kai
2022-11-22 18:05   ` Dave Hansen
2022-11-23 10:18     ` Huang, Kai
2022-11-23 16:58       ` Dave Hansen
2022-11-23 21:58         ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 05/20] x86/virt/tdx: Implement functions to make SEAMCALL Kai Huang
2022-11-22  9:06   ` Peter Zijlstra
2022-11-23  8:53     ` Huang, Kai
2022-11-22 18:20   ` Dave Hansen
2022-11-23 10:43     ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 06/20] x86/virt/tdx: Shut down TDX module in case of error Kai Huang
2022-11-22  9:10   ` Peter Zijlstra
2022-11-22  9:13   ` Peter Zijlstra
2022-11-22 15:14     ` Dave Hansen
2022-11-22 19:13       ` Peter Zijlstra
2022-11-22 19:24         ` Dave Hansen
2022-11-22 19:33           ` Peter Zijlstra
2022-11-23  1:14             ` Huang, Kai
2022-11-29 21:40             ` Dave Hansen
2022-11-30 11:09               ` Thomas Gleixner
2022-11-23  0:58           ` Huang, Kai
2022-11-23  1:04             ` Dave Hansen
2022-11-23  1:22               ` Huang, Kai
2022-11-23 16:20                 ` Sean Christopherson
2022-11-23 16:41                   ` Dave Hansen
2022-11-23 17:37                     ` Sean Christopherson
2022-11-23 18:18                       ` Dave Hansen
2022-11-23 19:03                         ` Sean Christopherson
2022-11-22  9:20   ` Peter Zijlstra
2022-11-22 15:06     ` Thomas Gleixner
2022-11-22 19:06       ` Peter Zijlstra
2022-11-22 19:31         ` Sean Christopherson
2022-11-23  9:39           ` Huang, Kai
2022-11-22 15:20     ` Dave Hansen
2022-11-22 16:52       ` Thomas Gleixner
2022-11-22 18:57   ` Dave Hansen
2022-11-22 19:14     ` Peter Zijlstra
2022-11-23  1:24       ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 07/20] x86/virt/tdx: Do TDX module global initialization Kai Huang
2022-11-22 19:14   ` Dave Hansen
2022-11-23 11:45     ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 08/20] x86/virt/tdx: Do logical-cpu scope TDX module initialization Kai Huang
2022-11-21  0:26 ` [PATCH v7 09/20] x86/virt/tdx: Get information about TDX module and TDX-capable memory Kai Huang
2022-11-22 23:39   ` Dave Hansen
2022-11-23 11:40     ` Huang, Kai
2022-11-23 16:44       ` Dave Hansen
2022-11-23 22:53         ` Huang, Kai
2022-12-02 11:19           ` Huang, Kai
2022-12-02 17:25             ` Dave Hansen
2022-12-02 21:57               ` Huang, Kai
2022-12-02 11:11     ` Huang, Kai
2022-12-02 17:06       ` Dave Hansen
2022-12-02 21:56         ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 10/20] x86/virt/tdx: Use all system memory when initializing TDX module as TDX memory Kai Huang
2022-11-21  5:37   ` Huang, Ying
2022-11-21  9:09     ` Huang, Kai
2022-11-22  1:54       ` Huang, Ying
2022-11-22  9:16         ` Huang, Kai
2022-11-24  0:47           ` Huang, Ying
2022-11-22 10:10   ` Peter Zijlstra
2022-11-22 11:40     ` Huang, Kai
2022-11-23  0:21   ` Dave Hansen
2022-11-23  9:29     ` Peter Zijlstra
2022-11-24  1:04     ` Huang, Kai
2022-11-24  1:22       ` Dave Hansen
2022-11-24  2:27         ` Huang, Kai [this message]
2022-11-24  1:50   ` Dan Williams
2022-11-24  9:06     ` Huang, Kai
2022-11-25  9:28       ` David Hildenbrand
2022-11-28  8:38         ` Huang, Kai
2022-11-28  8:43           ` David Hildenbrand
2022-11-28  9:21             ` Huang, Kai
2022-11-28  9:26               ` David Hildenbrand
2022-11-28  9:50                 ` Huang, Kai
2022-11-24  9:26     ` Peter Zijlstra
2022-11-24 10:02       ` Huang, Kai
2022-11-30 22:26         ` Dave Hansen
2022-11-21  0:26 ` [PATCH v7 11/20] x86/virt/tdx: Add placeholder to construct TDMRs to cover all TDX memory regions Kai Huang
2022-11-23 22:17   ` Dave Hansen
2022-11-24  9:51     ` Huang, Kai
2022-11-24 12:02     ` Huang, Kai
2022-11-28 15:59       ` Dave Hansen
2022-11-28 22:13         ` Huang, Kai
2022-11-28 22:19           ` Dave Hansen
2022-11-28 22:50             ` Huang, Kai
2022-12-07 11:47               ` Huang, Kai
2022-12-08 12:56                 ` Huang, Kai
2022-12-08 14:58                   ` Dave Hansen
2022-12-08 23:29                     ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 12/20] x86/virt/tdx: Create " Kai Huang
2022-11-23 22:41   ` Dave Hansen
2022-11-24 11:29     ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 13/20] x86/virt/tdx: Allocate and set up PAMTs for TDMRs Kai Huang
2022-11-23 22:57   ` Dave Hansen
2022-11-24 11:46     ` Huang, Kai
2022-11-28 16:39       ` Dave Hansen
2022-11-28 22:48         ` Huang, Kai
2022-11-28 22:56           ` Dave Hansen
2022-11-28 23:14             ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 14/20] x86/virt/tdx: Set up reserved areas for all TDMRs Kai Huang
2022-11-23 23:39   ` Dave Hansen
2022-11-28  9:14     ` Huang, Kai
2022-11-28 13:18       ` Dave Hansen
2022-11-28 22:24         ` Huang, Kai
2022-11-28 22:58           ` Dave Hansen
2022-11-28 23:10             ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 15/20] x86/virt/tdx: Reserve TDX module global KeyID Kai Huang
2022-11-23 23:40   ` Dave Hansen
2022-11-24 22:39     ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 16/20] x86/virt/tdx: Configure TDX module with TDMRs and " Kai Huang
2022-11-23 23:56   ` Dave Hansen
2022-11-25  0:59     ` Huang, Kai
2022-11-25  1:18       ` Dave Hansen
2022-11-25  1:44         ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 17/20] x86/virt/tdx: Configure global KeyID on all packages Kai Huang
2022-11-24  0:28   ` Dave Hansen
2022-11-24 22:28     ` Huang, Kai
2022-11-25  0:08       ` Huang, Kai
2022-11-30  3:35   ` Binbin Wu
2022-11-30  8:34     ` Huang, Kai
2022-11-30 14:04       ` kirill.shutemov
2022-11-30 15:13       ` Dave Hansen
2022-11-30 20:17         ` Huang, Kai
2022-11-30 17:37   ` Dave Hansen
2022-11-21  0:26 ` [PATCH v7 18/20] x86/virt/tdx: Initialize all TDMRs Kai Huang
2022-11-24  0:42   ` Dave Hansen
2022-11-25  2:27     ` Huang, Kai
2022-11-21  0:26 ` [PATCH v7 19/20] x86/virt/tdx: Flush cache in kexec() when TDX is enabled Kai Huang
2022-11-21  0:26 ` [PATCH v7 20/20] Documentation/x86: Add documentation for TDX host support Kai Huang

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=8b317553b1ab9821fd570d146619f535f9f6cc2f.camel@intel.com \
    --to=kai.huang@intel.com \
    --cc=ak@linux.intel.com \
    --cc=bagasdotme@gmail.com \
    --cc=chao.gao@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=imammedo@redhat.com \
    --cc=isaku.yamahata@intel.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=reinette.chatre@intel.com \
    --cc=sagis@google.com \
    --cc=sathyanarayanan.kuppuswamy@linux.intel.com \
    --cc=seanjc@google.com \
    --cc=tony.luck@intel.com \
    --cc=ying.huang@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.