[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH for-4.11] x86/dom0: add extra RAM regions as RESERVED for PVH memory map



On Thu, 3 May 2018 10:56:40 +0100
Roger Pau Monne <roger.pau@xxxxxxxxxx> wrote:

>When running as PVH Dom0 the native memory map is used in order to
>craft a tailored memory map for Dom0 taking into account it's memory
>limit.
>
>Dom0 memory is always going to be smaller than the total amount
>of memory present on the host, so in order to prevent Dom0 from
>relocating PCI BARs over RAM regions mark all the RAM regions not
>available to Dom0 as RESERVED in the memory map.
>---
>NB: I haven't seen any system where Dom0 would relocate the BARs over
>RAM regions, but AFAICT given the current memory map provided to Dom0
>this is a possibility that should be avoided.

Guest OSes typically use information from ACPI to learn where PCI
BARs can (or cannot) be relocated.
AFAIK Linux kernel discard this information only if being told
"pci=nocrs", so the E820 approach should be extra checked if it will
actually override ACPI-provided PCI information in all possible
cases. Not sure how DSDT is used on PVH though.

>I also think this should be included in the 4.11 release because it
>only modifies PVH Dom0 builder code, and that's still experimental, so
>there's no chance of breaking a supported feature.
>---
> xen/arch/x86/hvm/dom0_build.c | 25 +++++++++++++++++--------
> 1 file changed, 17 insertions(+), 8 deletions(-)
>
>diff --git a/xen/arch/x86/hvm/dom0_build.c
>b/xen/arch/x86/hvm/dom0_build.c index b237508072..9a441ab4cf 100644
>--- a/xen/arch/x86/hvm/dom0_build.c
>+++ b/xen/arch/x86/hvm/dom0_build.c
>@@ -314,8 +314,10 @@ static __init void pvh_setup_e820(struct domain
>*d, unsigned long nr_pages)
> 
>     /*
>      * Craft the e820 memory map for Dom0 based on the hardware e820
> map.
>+     * Add an extra entry in case we have to split a RAM entry into a
>RAM and a
>+     * RESERVED one in order to truncate it.
>      */
>-    d->arch.e820 = xzalloc_array(struct e820entry, e820.nr_map);
>+    d->arch.e820 = xzalloc_array(struct e820entry, e820.nr_map + 1);
>     if ( !d->arch.e820 )
>         panic("Unable to allocate memory for Dom0 e820 map");
>     entry_guest = d->arch.e820;
>@@ -323,19 +325,20 @@ static __init void pvh_setup_e820(struct domain
>*d, unsigned long nr_pages)
>     /* Clamp e820 memory map to match the memory assigned to Dom0 */
>     for ( i = 0, entry = e820.map; i < e820.nr_map; i++, entry++ )
>     {
>+        *entry_guest = *entry;
>+
>         if ( entry->type != E820_RAM )
>-        {
>-            *entry_guest = *entry;
>             goto next;
>-        }
> 
>         if ( nr_pages == cur_pages )
>         {
>             /*
>-             * We already have all the assigned memory,
>-             * skip this entry
>+             * We already have all the requested memory, turn this
>RAM region
>+             * into a RESERVED region in order to prevent Dom0 from
>placing
>+             * BARs in this area.
>              */
>-            continue;
>+            entry_guest->type = E820_RESERVED;
>+            goto next;
>         }
> 
>         /*
>@@ -358,6 +361,12 @@ static __init void pvh_setup_e820(struct domain
>*d, unsigned long nr_pages)
>         {
>             /* Truncate region */
>             entry_guest->size = (nr_pages - cur_pages) << PAGE_SHIFT;
>+            /* Add the remaining of the RAM region as RESERVED. */
>+            entry_guest++;
>+            d->arch.nr_e820++;
>+            entry_guest->type = E820_RESERVED;
>+            entry_guest->addr = start + ((nr_pages - cur_pages) <<
>PAGE_SHIFT);
>+            entry_guest->size = end - entry_guest->addr;
>             cur_pages = nr_pages;
>         }
>         else
>@@ -367,9 +376,9 @@ static __init void pvh_setup_e820(struct domain
>*d, unsigned long nr_pages)
>  next:
>         d->arch.nr_e820++;
>         entry_guest++;
>+        ASSERT(d->arch.nr_e820 <= e820.nr_map + 1);
>     }
>     ASSERT(cur_pages == nr_pages);
>-    ASSERT(d->arch.nr_e820 <= e820.nr_map);
> }
> 
> static int __init pvh_setup_p2m(struct domain *d)


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.