[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |