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

Re: [Xen-devel] [PATCH] x86/32on64: fix physical address restriction


  • To: Jan Beulich <jbeulich@xxxxxxxxxx>, <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Keir Fraser <keir.fraser@xxxxxxxxxxxxx>
  • Date: Thu, 12 Jun 2008 16:06:16 +0100
  • Delivery-date: Thu, 12 Jun 2008 08:06:59 -0700
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: AcjMndxrGyjXDDiREd2vlgAX8io7RQ==
  • Thread-topic: [Xen-devel] [PATCH] x86/32on64: fix physical address restriction

I tweaked this before checking in as c/s 17836. Please take a look and see
whether it looks okay to you. If so I'll also backport to xen-3.2-testing.

 -- Keir

On 12/6/08 15:28, "Jan Beulich" <jbeulich@xxxxxxxxxx> wrote:

> The allocation bit size setting wasn't working anymore after the recent
> fix to properly use PAGE_SHIFT instead of PAGE_SIZE. This was because
> the bit size implies a power-of-two range that's accessible, but if all
> memory is accessible anyway (and its upper boundary is not a power of
> two), the domain would either be needlessly restricted or wouldn't be
> able to allocate as much memory as was intended for it (specifically
> the case for Dom0 without dom0_mem= boot parameter). Consequently,
> don't restrict the bit width if all memory can be accessed.
> 
> To avoid needing to adjust this code in two places in the future (it
> may need further touching when memory hotplug gets supported), fold the
> logic into a function.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
> 
> Index: 2008-06-12/xen/arch/x86/domain.c
> ===================================================================
> --- 2008-06-12.orig/xen/arch/x86/domain.c 2008-06-12 09:02:00.000000000 +0200
> +++ 2008-06-12/xen/arch/x86/domain.c 2008-06-12 09:07:02.000000000 +0200
> @@ -349,11 +349,7 @@ int switch_compat(struct domain *d)
>                                   FIRST_RESERVED_GDT_PAGE)] = gdt_l1e;
>      }
>  
> -    d->arch.physaddr_bitsize =
> -        /* 2^n entries can be contained in guest's p2m mapping space */
> -        fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 3
> -        /* 2^n pages -> 2^(n+PAGE_SHIFT) bits */
> -        + PAGE_SHIFT;
> +    domain_set_alloc_bitsize(d);
>  
>      return 0;
>  
> Index: 2008-06-12/xen/arch/x86/domain_build.c
> ===================================================================
> --- 2008-06-12.orig/xen/arch/x86/domain_build.c 2008-06-10 18:00:41.000000000
> +0200
> +++ 2008-06-12/xen/arch/x86/domain_build.c 2008-06-12 09:08:19.000000000 +0200
> @@ -353,14 +353,7 @@ int __init construct_dom0(
>  #endif
>      }
>  
> -#if defined(__x86_64__)
> -    if ( is_pv_32on64_domain(d) )
> -        d->arch.physaddr_bitsize =
> -            /* 2^n entries can be contained in guest's p2m mapping space */
> -            fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 3
> -            /* 2^n pages -> 2^(n+PAGE_SHIFT) bits */
> -            + PAGE_SHIFT;
> -#endif
> +    domain_set_alloc_bitsize(d);
>  
>      /*
>       * Why do we need this? The number of page-table frames depends on the
> Index: 2008-06-12/xen/arch/x86/x86_64/mm.c
> ===================================================================
> --- 2008-06-12.orig/xen/arch/x86/x86_64/mm.c 2008-06-10 18:00:41.000000000
> +0200
> +++ 2008-06-12/xen/arch/x86/x86_64/mm.c 2008-06-12 09:07:42.000000000 +0200
> @@ -470,9 +470,21 @@ int check_descriptor(const struct domain
>      return 0;
>  }
>  
> +void domain_set_alloc_bitsize(struct domain *d)
> +{
> +    if ( !is_pv_32on64_domain(d)
> +         || HYPERVISOR_COMPAT_VIRT_START(d) > __HYPERVISOR_COMPAT_VIRT_START
> )
> +        return;
> +    d->arch.physaddr_bitsize =
> +        /* 2^n entries can be contained in guest's p2m mapping space */
> +        fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 3
> +        /* 2^n pages -> 2^(n+PAGE_SHIFT) bits */
> +        + PAGE_SHIFT;
> +}
> +
>  unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits)
>  {
> -    if ( (d == NULL) || !is_pv_32on64_domain(d) )
> +    if ( d == NULL || d->arch.physaddr_bitsize == 0 )
>          return bits;
>      return min(d->arch.physaddr_bitsize, bits);
>  }
> Index: 2008-06-12/xen/include/asm-x86/mm.h
> ===================================================================
> --- 2008-06-12.orig/xen/include/asm-x86/mm.h 2008-05-09 09:48:32.000000000
> +0200
> +++ 2008-06-12/xen/include/asm-x86/mm.h 2008-06-12 09:06:20.000000000 +0200
> @@ -343,9 +343,11 @@ int map_ldt_shadow_page(unsigned int);
>  
>  #ifdef CONFIG_COMPAT
>  int setup_arg_xlat_area(struct vcpu *, l4_pgentry_t *);
> +void domain_set_alloc_bitsize(struct domain *d);
>  unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits);
>  #else
>  # define setup_arg_xlat_area(vcpu, l4tab) 0
> +# define domain_set_alloc_bitsize(d) ((void)0)
>  # define domain_clamp_alloc_bitsize(d, b) (b)
>  #endif
>  
> 
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



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