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

Re: [Xen-devel] [PATCH] x86: partially revert use of 2M mappings for hypervisor image



On 14/03/16 15:12, Jan Beulich wrote:
> As explained by Andrew in
> http://lists.xenproject.org/archives/html/xen-devel/2016-03/msg01380.html 
> that change makes the uncompressed xen.gz image too large for certain
> boot environments. As a result this change makes some of the effects of
> commits cf393624ee ("x86: use 2M superpages for text/data/bss
> mappings") and 53aa3dde17 ("x86: unilaterally remove .init mappings")
> conditional, restoring alternative previous code where necessary. This
> is so that xen.efi can still benefit from the new mechanisms, as it is
> unaffected by said limitations.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> ---
> The first, neater attempt (making the __2M_* symbols weak) failed:
> - older gcc doesn't access the weak symbols through .got
> - GOTPCREL relocations get treated just like PCREL ones by ld when
>   linking xen.efi
>
> --- a/xen/arch/x86/setup.c
> +++ b/xen/arch/x86/setup.c
> @@ -497,6 +497,17 @@ static void __init kexec_reserve_area(st
>  #endif
>  }
>  
> +static inline bool_t using_2M_mapping(void)
> +{
> +    return !l1_table_offset((unsigned long)__2M_text_end) &&
> +           !l1_table_offset((unsigned long)__2M_rodata_start) &&
> +           !l1_table_offset((unsigned long)__2M_rodata_end) &&
> +           !l1_table_offset((unsigned long)__2M_init_start) &&
> +           !l1_table_offset((unsigned long)__2M_init_end) &&
> +           !l1_table_offset((unsigned long)__2M_rwdata_start) &&
> +           !l1_table_offset((unsigned long)__2M_rwdata_end);

I would recommend

#ifdef EFI
return 1;
#else
return 0;
#endif

The compiler is unable to collapse that expression into a constant,
because it can only be evaluated at link time.

> +}
> +
>  static void noinline init_done(void)
>  {
>      void *va;
> @@ -509,10 +520,19 @@ static void noinline init_done(void)
>      for ( va = __init_begin; va < _p(__init_end); va += PAGE_SIZE )
>          clear_page(va);
>  
> -    /* Destroy Xen's mappings, and reuse the pages. */
> -    destroy_xen_mappings((unsigned long)&__2M_init_start,
> -                         (unsigned long)&__2M_init_end);
> -    init_xenheap_pages(__pa(__2M_init_start), __pa(__2M_init_end));
> +    if ( using_2M_mapping() )
> +    {
> +        /* Destroy Xen's mappings, and reuse the pages. */

I would be tempted to leave this comment back outside using_2M_mapping()
which reduces the size of this hunk.

> +        destroy_xen_mappings((unsigned long)&__2M_init_start,
> +                             (unsigned long)&__2M_init_end);
> +        init_xenheap_pages(__pa(__2M_init_start), __pa(__2M_init_end));
> +    }
> +    else
> +    {
> +        destroy_xen_mappings((unsigned long)&__init_begin,
> +                             (unsigned long)&__init_end);
> +        init_xenheap_pages(__pa(__init_begin), __pa(__init_end));
> +    }
>  
>      printk("Freed %ldkB init memory.\n", 
> (long)(__init_end-__init_begin)>>10);
>  
> @@ -922,6 +942,8 @@ void __init noreturn __start_xen(unsigne
>               * Undo the temporary-hooking of the l1_identmap.  
> __2M_text_start
>               * is contained in this PTE.
>               */
> +            BUG_ON(l2_table_offset((unsigned long)_erodata) ==
> +                   l2_table_offset((unsigned long)_stext));

Is this intentional to stay, or the remnants of debugging?

Irrespective of some of these minor tweaks, Reviewed-by: Andrew Cooper
<andrew.cooper3@xxxxxxxxxx>

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