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

Re: [Xen-devel] [PATCH RFC 01/13] xen: use the hardware e820 map on Dom0



On Tuesday, December 24, 2013 6:20:50 am Roger Pau Monne wrote:
> We need to do some tweaking of the hardware e820 map, since the memory
> layout provided by Xen and the e820 map doesn't match.
> 
> This consists in clamping the e820 map so that regions above max_pfn
> are marked as unusuable.
> ---
>  sys/x86/xen/pv.c |   35 +++++++++++++++++++++++++++++++++--
>  1 files changed, 33 insertions(+), 2 deletions(-)
> 
> diff --git a/sys/x86/xen/pv.c b/sys/x86/xen/pv.c
> index 4f7415e..ab4afba 100644
> --- a/sys/x86/xen/pv.c
> +++ b/sys/x86/xen/pv.c
> @@ -297,17 +297,48 @@ static void
>  xen_pv_parse_memmap(caddr_t kmdp, vm_paddr_t *physmap, int *physmap_idx)
>  {
>       struct xen_memory_map memmap;
> +     unsigned long max_pfn = HYPERVISOR_start_info->nr_pages;
> +     u_int64_t mem_end = ptoa(max_pfn);
>       u_int32_t size;
> -     int rc;
> +     int rc, mem_op, i;

One minor nit is that it is preferred to not initalize variables in 
declarations style-wise.  Aside from that, this looks fine to me.

>       /* Fetch the E820 map from Xen */
>       memmap.nr_entries = MAX_E820_ENTRIES;
>       set_xen_guest_handle(memmap.buffer, xen_smap);
> -     rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
> +     mem_op = xen_initial_domain() ?
> +                     XENMEM_machine_memory_map :
> +                     XENMEM_memory_map;
> +     rc = HYPERVISOR_memory_op(mem_op, &memmap);
>       if (rc)
>               panic("unable to fetch Xen E820 memory map");
>       size = memmap.nr_entries * sizeof(xen_smap[0]);
>  
> +     /*
> +      * This should be improved, Xen provides us with a single
> +      * chunk of physical memory that goes from 0 to max_pfn,
> +      * and what we do here is clamp the HW memory map to make
> +      * sure regions above max_pfn are marked as reserved.
> +      *
> +      * TRTTD would be to move the memory not used because of
> +      * the holes in the HW memory map to the now clamped regions
> +      * using XENMEM_{decrease/increase}_reservation.
> +      */
> +     for (i = 0; i < memmap.nr_entries; i++) {
> +             u_int64_t end = xen_smap[i].base + xen_smap[i].length;
> +             if (xen_smap[i].type == SMAP_TYPE_MEMORY) {
> +                     if (xen_smap[i].base > mem_end) {
> +                             /* Mark as reserved */
> +                             xen_smap[i].type = SMAP_TYPE_RESERVED;
> +                             continue;
> +                     }
> +                     if (end > mem_end) {
> +                             /* Truncate region */
> +                             xen_smap[i].length -= end - mem_end;
> +                     }
> +             }
> +     }
> +
> +
>       bios_add_smap_entries(xen_smap, size, physmap, physmap_idx);
>  }
>  
> -- 
> 1.7.7.5 (Apple Git-26)
> 
> 

-- 
John Baldwin

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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