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

Re: [Xen-devel] Linux 4.4 boot crash on xen 4.5.3 with dom0_mem == max



On 17/05/16 22:50, Ed Swierk wrote:
> I added some more instrumentation and discovered that the result of
> xen_count_remap_pages() (0x85dea) is one less than the actual number
> of pages remapped by xen_set_identity_and_remap() (0x85deb).
> 
> The two functions differ in their handling of a xen_e820_map entry
> whose size is not a multiple of the page size.  The entry starting at
> 0x68000 has size 0x33400.  xen_count_remap_pages() rounds up when
> computing the end_pfn (to 0x9c), while xen_set_identity_and_remap()
> rounds down (to 0x9b).  Thus xen_count_remap_pages() counts the
> remapped space following the entry as one page smaller than the other
> function does.
> 
> (Confusingly, the "BIOS-provided physical RAM map" shows both the
> start and end addresses rounded down to page boundaries, rather than
> the addresses actually provided by the BIOS.)
> 
> [    0.000000] xen_count_remap_pages i=0 addr=0x0 size=0x60000 start_pfn=0x0 
> end_pfn=0x0
> [    0.000000] xen_count_remap_pages i=0 plus end_pfn=0x60 type=0x1
> [    0.000000] xen_count_remap_pages i=1 addr=0x60000 size=0x8000 
> start_pfn=0x60 end_pfn=0x60
> [    0.000000] xen_count_remap_pages i=1 plus end_pfn=0x68 type=0x2
> [    0.000000] xen_count_remap_pages i=2 addr=0x68000 size=0x33400 
> start_pfn=0x68 end_pfn=0x68
> [    0.000000] xen_count_remap_pages i=2 plus end_pfn=0x9c type=0x1
> [    0.000000] xen_count_remap_pages i=3 addr=0x100000 size=0x759fe000 
> start_pfn=0x100 end_pfn=0x9c
> [    0.000000] xen_count_remap_pages i=3 plus end_pfn=0x75afe type=0x1
> [    0.000000] xen_count_remap_pages i=4 addr=0x75bab000 size=0x464b000 
> start_pfn=0x75bab end_pfn=0x75afe
> [    0.000000] xen_count_remap_pages i=4 plus end_pfn=0x7a1f6 type=0x1
> [    0.000000] xen_count_remap_pages i=5 addr=0x7b7d7000 size=0x29000 
> start_pfn=0x7b7d7 end_pfn=0x7a1f6
> [    0.000000] xen_count_remap_pages i=5 plus end_pfn=0x7b800 type=0x1
> [    0.000000] xen_count_remap_pages i=6 addr=0x7bf00000 size=0x100000 
> start_pfn=0x7bf00 end_pfn=0x7b800
> [    0.000000] xen_count_remap_pages i=6 plus end_pfn=0x7c000 type=0x1
> [    0.000000] xen_count_remap_pages i=7 addr=0xc7ffc000 size=0x1000 
> start_pfn=0xc7ffc end_pfn=0x7c000
> [    0.000000] xen_count_remap_pages i=7 plus end_pfn=0xc7ffd type=0x2
> [    0.000000] xen_count_remap_pages i=8 addr=0xfbffc000 size=0x1000 
> start_pfn=0xfbffc end_pfn=0xc7ffd
> [    0.000000] xen_count_remap_pages i=8 plus end_pfn=0xfbffd type=0x2
> [    0.000000] xen_count_remap_pages i=9 addr=0xfec00000 size=0x2000 
> start_pfn=0xfec00 end_pfn=0xfbffd
> [    0.000000] xen_count_remap_pages i=9 plus end_pfn=0xfec02 type=0x2
> [    0.000000] xen_count_remap_pages i=10 addr=0xfec40000 size=0x1000 
> start_pfn=0xfec40 end_pfn=0xfec02
> [    0.000000] xen_count_remap_pages i=10 plus end_pfn=0xfec41 type=0x2
> [    0.000000] xen_count_remap_pages i=11 addr=0xfed20000 size=0x10000 
> start_pfn=0xfed20 end_pfn=0xfec41
> [    0.000000] xen_count_remap_pages i=11 plus end_pfn=0xfed30 type=0x1
> [    0.000000] xen_count_remap_pages i=12 addr=0xfee00000 size=0x100000 
> start_pfn=0xfee00 end_pfn=0xfed30
> [    0.000000] xen_count_remap_pages i=12 plus end_pfn=0xfef00 type=0x2
> [    0.000000] xen_count_remap_pages i=13 addr=0x100000000 size=0x1f80000000 
> start_pfn=0x100000 end_pfn=0xfef00
> [    0.000000] xen_count_remap_pages i=13 plus end_pfn=0x480000 type=0x1
> [    0.000000] xen_count_remap_pages(max_pfn=0x480000) == 0x85dea
> [    0.000000] max_pages 0x505dea
> [    0.000000] xen_add_extra_mem(480000, 85dea)
> [    0.000000] memblock_reserve(0x480000000, 0x85dea000)
> [    0.000000] xen_set_identity_and_remap i=0 addr=0x0 size=0x60000 type=0x1
> [    0.000000] xen_set_identity_and_remap i=1 addr=0x60000 size=0x8000 
> type=0x2
> [    0.000000] xen_set_identity_and_remap i=2 addr=0x68000 size=0x33400 
> type=0x1
> [    0.000000] xen_set_identity_and_remap_chunk start_pfn=0x60 end_pfn=0x68 
> nr_pages=0x480000 remap_pfn=0x480000
> [    0.000000] xen_set_identity_and_remap_chunk i=0x0 cur_pfn=0x60 left=0x8 
> size=0x8 remap_range_size=0x1c00000
> [    0.000000] xen_set_identity_and_remap i=3 addr=0x100000 size=0x759fe000 
> type=0x1
> [    0.000000] xen_set_identity_and_remap_chunk start_pfn=0x9b end_pfn=0x100 
> nr_pages=0x480000 remap_pfn=0x480008
> [    0.000000] xen_set_identity_and_remap_chunk i=0x0 cur_pfn=0x9b left=0x65 
> size=0x65 remap_range_size=0x1bffff8
> [    0.000000] xen_set_identity_and_remap i=4 addr=0x75bab000 size=0x464b000 
> type=0x1
> [    0.000000] xen_set_identity_and_remap_chunk start_pfn=0x75afe 
> end_pfn=0x75bab nr_pages=0x480000 remap_pfn=0x48006d
> [    0.000000] xen_set_identity_and_remap_chunk i=0x0 cur_pfn=0x75afe 
> left=0xad size=0xad remap_range_size=0x1bfff93
> [    0.000000] xen_set_identity_and_remap i=5 addr=0x7b7d7000 size=0x29000 
> type=0x1
> [    0.000000] xen_set_identity_and_remap_chunk start_pfn=0x7a1f6 
> end_pfn=0x7b7d7 nr_pages=0x480000 remap_pfn=0x48011a
> [    0.000000] xen_set_identity_and_remap_chunk i=0x0 cur_pfn=0x7a1f6 
> left=0x15e1 size=0x15e1 remap_range_size=0x1bffee6
> [    0.000000] xen_set_identity_and_remap i=6 addr=0x7bf00000 size=0x100000 
> type=0x1
> [    0.000000] xen_set_identity_and_remap_chunk start_pfn=0x7b800 
> end_pfn=0x7bf00 nr_pages=0x480000 remap_pfn=0x4816fb
> [    0.000000] xen_set_identity_and_remap_chunk i=0x0 cur_pfn=0x7b800 
> left=0x700 size=0x700 remap_range_size=0x1bfe905
> [    0.000000] xen_set_identity_and_remap i=7 addr=0xc7ffc000 size=0x1000 
> type=0x2
> [    0.000000] xen_set_identity_and_remap i=8 addr=0xfbffc000 size=0x1000 
> type=0x2
> [    0.000000] xen_set_identity_and_remap i=9 addr=0xfec00000 size=0x2000 
> type=0x2
> [    0.000000] xen_set_identity_and_remap i=10 addr=0xfec40000 size=0x1000 
> type=0x2
> [    0.000000] xen_set_identity_and_remap i=11 addr=0xfed20000 size=0x10000 
> type=0x1
> [    0.000000] xen_set_identity_and_remap_chunk start_pfn=0x7c000 
> end_pfn=0xfed20 nr_pages=0x480000 remap_pfn=0x481dfb
> [    0.000000] xen_set_identity_and_remap_chunk i=0x0 cur_pfn=0x7c000 
> left=0x82d20 size=0x82d20 remap_range_size=0x1bfe205
> [    0.000000] xen_set_identity_and_remap i=12 addr=0xfee00000 size=0x100000 
> type=0x2
> [    0.000000] xen_set_identity_and_remap i=13 addr=0x100000000 
> size=0x1f80000000 type=0x1
> [    0.000000] xen_set_identity_and_remap_chunk start_pfn=0xfed30 
> end_pfn=0x100000 nr_pages=0x480000 remap_pfn=0x504b1b
> [    0.000000] xen_set_identity_and_remap_chunk i=0x0 cur_pfn=0xfed30 
> left=0x12d0 size=0x12d0 remap_range_size=0x1b7b4e5
> [    0.000000] Released 0 page(s)
> [    0.000000] e820: BIOS-provided physical RAM map:
> [    0.000000] Xen: [mem 0x0000000000000000-0x000000000005ffff] usable
> [    0.000000] Xen: [mem 0x0000000000060000-0x0000000000067fff] reserved
> [    0.000000] Xen: [mem 0x0000000000068000-0x000000000009afff] usable
> [    0.000000] Xen: [mem 0x00000000000a0000-0x00000000000fffff] reserved
> [    0.000000] Xen: [mem 0x0000000000100000-0x0000000075afdfff] usable
> [    0.000000] Xen: [mem 0x0000000075bab000-0x000000007a1f5fff] usable
> [    0.000000] Xen: [mem 0x000000007b7d7000-0x000000007b7fffff] usable
> [    0.000000] Xen: [mem 0x000000007bf00000-0x000000007bffffff] usable
> [    0.000000] Xen: [mem 0x00000000c7ffc000-0x00000000c7ffcfff] reserved
> [    0.000000] Xen: [mem 0x00000000fbffc000-0x00000000fbffcfff] reserved
> [    0.000000] Xen: [mem 0x00000000fec00000-0x00000000fec01fff] reserved
> [    0.000000] Xen: [mem 0x00000000fec40000-0x00000000fec40fff] reserved
> [    0.000000] Xen: [mem 0x00000000fed20000-0x00000000fed2ffff] usable
> [    0.000000] Xen: [mem 0x00000000fee00000-0x00000000feefffff] reserved
> [    0.000000] Xen: [mem 0x0000000100000000-0x0000000505de9fff] usable
> [    0.000000] bootconsole [xenboot0] enabled
> [    0.000000] debug: ignoring loglevel setting.
> [    0.000000] NX (Execute Disable) protection: active
> [    0.000000] e820: user-defined physical RAM map:
> [    0.000000] user: [mem 0x0000000000000000-0x000000000005ffff] usable
> [    0.000000] user: [mem 0x0000000000060000-0x0000000000067fff] reserved
> [    0.000000] user: [mem 0x0000000000068000-0x000000000009afff] usable
> [    0.000000] user: [mem 0x00000000000a0000-0x00000000000fffff] reserved
> [    0.000000] user: [mem 0x0000000000100000-0x0000000075afdfff] usable
> [    0.000000] user: [mem 0x0000000075bab000-0x000000007a1f5fff] usable
> [    0.000000] user: [mem 0x000000007b7d7000-0x000000007b7fffff] usable
> [    0.000000] user: [mem 0x000000007bf00000-0x000000007bffffff] usable
> [    0.000000] user: [mem 0x0000000080000000-0x000000008fffffff] reserved
> [    0.000000] user: [mem 0x00000000c7ffc000-0x00000000c7ffcfff] reserved
> [    0.000000] user: [mem 0x00000000fbffc000-0x00000000fbffcfff] reserved
> [    0.000000] user: [mem 0x00000000fec00000-0x00000000fec01fff] reserved
> [    0.000000] user: [mem 0x00000000fec40000-0x00000000fec40fff] reserved
> [    0.000000] user: [mem 0x00000000fed20000-0x00000000fed2ffff] usable
> [    0.000000] user: [mem 0x00000000fee00000-0x00000000feefffff] reserved
> [    0.000000] user: [mem 0x0000000100000000-0x0000000505de9fff] usable
> 
> It seems to me we'd be better off with just one function counting
> remapped pages rather than two, so as an experiment I tried combining
> them.  The patch below adds a do_remap argument to
> xen_set_identity_and_remap() that tells it whether to do the actual
> remapping or just return the number pages that would be remapped.
> This change fixes the crash on my system.

But it is wrong.

> diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
> index 7ab2951..2746b7b 100644
> --- a/arch/x86/xen/setup.c
> +++ b/arch/x86/xen/setup.c
> @@ -438,11 +438,13 @@ static unsigned long __init 
> xen_set_identity_and_remap_chunk(
>       return remap_pfn;
>  }
>  
> -static void __init xen_set_identity_and_remap(unsigned long nr_pages)
> +static unsigned long __init xen_set_identity_and_remap(unsigned long 
> nr_pages,
> +                                           int do_remap)
>  {
>       phys_addr_t start = 0;
>       unsigned long last_pfn = nr_pages;
>       const struct e820entry *entry = xen_e820_map;
> +     unsigned long remap_pages = 0;
>       int i;
>  
>       /*
> @@ -465,15 +467,21 @@ static void __init xen_set_identity_and_remap(unsigned 
> long nr_pages)
>                       if (entry->type == E820_RAM)
>                               end_pfn = PFN_UP(entry->addr);
>  
> -                     if (start_pfn < end_pfn)
> -                             last_pfn = xen_set_identity_and_remap_chunk(
> -                                             start_pfn, end_pfn, nr_pages,
> -                                             last_pfn);
> +                     if (start_pfn < end_pfn) {
> +                             if (do_remap)
> +                                     last_pfn = 
> xen_set_identity_and_remap_chunk(
> +                                                     start_pfn, end_pfn, 
> nr_pages,
> +                                                     last_pfn);
> +                             remap_pages += end_pfn - start_pfn;
> +                     }
>                       start = end;

You fail to skip counting remap_pages above nr_pages.

>               }
>       }
>  
> -     pr_info("Released %ld page(s)\n", xen_released_pages);
> +     if (do_remap)
> +             pr_info("Released %ld page(s)\n", xen_released_pages);
> +
> +     return remap_pages;
>  }


Juergen


_______________________________________________
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®.