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

Re: [Xen-devel] dom0 pvops boot crash on very ordinary Dell R310



 On 10/27/2010 09:04 AM, Ian Campbell wrote:
> On Wed, 2010-10-27 at 14:18 +0100, Ian Campbell wrote:
>>
>> IOW we are faulting on precisely one of the PFNs which we earlier
>> released. We released these because of a hole in the e820 between
>> 0xa0000-0x100000 which dom0 apparently manufactured. 
>>
>> IIRC in a PV domU we reserve some of the legacy address space to stop
>> old ISA drivers etc from getting at it. I suspect this is wrong for a
>> dom0 where we want the e820 to be more or less unmolested. I'll track
>> down the code in question and see if removing it for dom0 helps.
> More than the issue with unnecessarily reserving memory we simply can't
> trust the e820 to cover all the firmware tables here. I think it is
> better to simply not give any memory under 1M back to Xen in the domain
> 0 case.
>
> 8<-----------
>
> >From e25932748e354f5da3fbb5719fb17f9ca2e35f09 Mon Sep 17 00:00:00 2001
> From: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Date: Wed, 27 Oct 2010 17:02:25 +0100
> Subject: [PATCH] xen: do not release any memory under 1M in domain 0
>
> We already deliberately setup a 1-1 P2M for the region up to 1M in
> order to allow code which assumes this region is already mapped to
> work without having to convert everything to ioremap.
>

Looks good, but:

> Domain 0 should not return any apparently unused memory regions
> (reserved or otherwise) in this region to Xen since the e820 may not
> accurately reflect what the BIOS has stashed in this region.
>
> Similarly do not reserve the ISA range if we are domain 0 since it is
> not necessarily normal, usable memory in that case.
>
> Since we now assume that we have a (reasonably) sensible e820 map in
> domain 0 make a failure to obtain a machine memory map from the
> hypervisor fatal rather than struggling on with a made up map and
> suffering all the potential fallout.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
>  arch/x86/xen/setup.c |   32 +++++++++++++++++++++++++-------
>  1 files changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
> index 915b0c3..baad88c 100644
> --- a/arch/x86/xen/setup.c
> +++ b/arch/x86/xen/setup.c
> @@ -84,6 +84,22 @@ static unsigned long __init
> xen_release_chunk(phys_addr_t start_addr,
>       start = PFN_UP(start_addr);
>       end = PFN_DOWN(end_addr);
>  
> +     /*
> +      * Domain 0 maintains a 1-1 P2M mapping for the first megabyte
> +      * so do not return such memory to the hypervisor.
> +      *
> +      * This region can contain various firmware tables and the
> +      * like which are often assumed to be always mapped and
> +      * available via phys_to_virt.
> +      */
> +     if (xen_initial_domain()) {
> +             if (end < PFN_DOWN(0x100000UL))
> +                     return 0;
> +
> +             if (start < PFN_DOWN(0x100000UL))
> +                     start = PFN_DOWN(0x100000UL);

Use ISA_END_ADDRESS I think.

> +     }
> +
>       if (end <= start)
>               return 0;
>  
> @@ -163,6 +179,7 @@ char * __init xen_memory_setup(void)
>               XENMEM_memory_map;
>       rc = HYPERVISOR_memory_op(op, &memmap);
>       if (rc == -ENOSYS) {
> +             BUG_ON(xen_initial_domain());
>               memmap.nr_entries = 1;
>               map[0].addr = 0ULL;
>               map[0].size = mem_end;
> @@ -200,15 +217,16 @@ char * __init xen_memory_setup(void)
>       }
>  
>       /*
> -      * Even though this is normal, usable memory under Xen, reserve
> -      * ISA memory anyway because too many things think they can poke
> -      * about in there.
> +      * Even though this is normal, usable memory in a Xen domU,
> +      * reserve ISA memory anyway because too many things think
> +      * they can poke about in there.
>        *
> -      * In a dom0 kernel, this region is identity mapped with the
> -      * hardware ISA area, so it really is out of bounds.
> +      * In dom0 we use the host e820 and therefore do not need to
> +      * specially reserved anything.
>        */
> -     e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS -
> ISA_START_ADDRESS,
> -                     E820_RESERVED);
> +     if (!xen_initial_domain())
> +             e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS -
> ISA_START_ADDRESS,
> +                             E820_RESERVED);

What's the problem with making it unconditionally reserved even if the
host E820 doesn't?

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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