All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/32on64: fix physical address restriction
@ 2008-06-12 14:28 Jan Beulich
  2008-06-12 15:06 ` Keir Fraser
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Beulich @ 2008-06-12 14:28 UTC (permalink / raw)
  To: xen-devel

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@novell.com>

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
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86/32on64: fix physical address restriction
  2008-06-12 14:28 [PATCH] x86/32on64: fix physical address restriction Jan Beulich
@ 2008-06-12 15:06 ` Keir Fraser
  2008-06-12 15:46   ` [PATCH] x86/32on64: fix physical addressrestriction Jan Beulich
  0 siblings, 1 reply; 3+ messages in thread
From: Keir Fraser @ 2008-06-12 15:06 UTC (permalink / raw)
  To: Jan Beulich, xen-devel

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@novell.com> 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@novell.com>
> 
> 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@lists.xensource.com
> http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] x86/32on64: fix physical addressrestriction
  2008-06-12 15:06 ` Keir Fraser
@ 2008-06-12 15:46   ` Jan Beulich
  0 siblings, 0 replies; 3+ messages in thread
From: Jan Beulich @ 2008-06-12 15:46 UTC (permalink / raw)
  To: Keir Fraser; +Cc: xen-devel

>>> Keir Fraser <keir.fraser@eu.citrix.com> 12.06.08 17:06 >>>
>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.

Looks good - even better, because the calculation is now more correct - I
hadn't realized so far that the old calculation didn't account for the 2M
hole right below 4G.

Jan

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-06-12 15:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-12 14:28 [PATCH] x86/32on64: fix physical address restriction Jan Beulich
2008-06-12 15:06 ` Keir Fraser
2008-06-12 15:46   ` [PATCH] x86/32on64: fix physical addressrestriction Jan Beulich

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.