[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86: make map_domain_page_global() a simple wrapper around vmap()
On 02/07/2013 08:12, "Jan Beulich" <JBeulich@xxxxxxxx> wrote: > This is in order to reduce the number of fundamental mapping mechanisms > as well as to reduce the amount of code to be maintained. In the course > of this the virtual space available to vmap() is being grown from 16Gb > to 64Gb. > > Note that this requires callers of unmap_domain_page_global() to no > longer pass misaligned pointers - map_domain_page_global() returns page > size aligned pointers, so unmappinmg should be done accordingly. > unmap_vcpu_info() violated this and is being adjusted here. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Keir Fraser <keir@xxxxxxx> > --- a/xen/arch/x86/domain_page.c > +++ b/xen/arch/x86/domain_page.c > @@ -11,6 +11,7 @@ > #include <xen/perfc.h> > #include <xen/pfn.h> > #include <xen/sched.h> > +#include <xen/vmap.h> > #include <asm/current.h> > #include <asm/flushtlb.h> > #include <asm/hardirq.h> > @@ -310,18 +311,8 @@ int mapcache_vcpu_init(struct vcpu *v) > return 0; > } > > -#define GLOBALMAP_BITS (GLOBALMAP_GBYTES << (30 - PAGE_SHIFT)) > -static unsigned long inuse[BITS_TO_LONGS(GLOBALMAP_BITS)]; > -static unsigned long garbage[BITS_TO_LONGS(GLOBALMAP_BITS)]; > -static unsigned int inuse_cursor; > -static DEFINE_SPINLOCK(globalmap_lock); > - > void *map_domain_page_global(unsigned long mfn) > { > - l1_pgentry_t *pl1e; > - unsigned int idx, i; > - unsigned long va; > - > ASSERT(!in_irq() && local_irq_is_enabled()); > > #ifdef NDEBUG > @@ -329,59 +320,19 @@ void *map_domain_page_global(unsigned lo > return mfn_to_virt(mfn); > #endif > > - spin_lock(&globalmap_lock); > - > - idx = find_next_zero_bit(inuse, GLOBALMAP_BITS, inuse_cursor); > - va = GLOBALMAP_VIRT_START + pfn_to_paddr(idx); > - if ( unlikely(va >= GLOBALMAP_VIRT_END) ) > - { > - /* /First/, clean the garbage map and update the inuse list. */ > - for ( i = 0; i < ARRAY_SIZE(garbage); i++ ) > - inuse[i] &= ~xchg(&garbage[i], 0); > - > - /* /Second/, flush all TLBs to get rid of stale garbage mappings. */ > - flush_tlb_all(); > - > - idx = find_first_zero_bit(inuse, GLOBALMAP_BITS); > - va = GLOBALMAP_VIRT_START + pfn_to_paddr(idx); > - if ( unlikely(va >= GLOBALMAP_VIRT_END) ) > - { > - spin_unlock(&globalmap_lock); > - return NULL; > - } > - } > - > - set_bit(idx, inuse); > - inuse_cursor = idx + 1; > - > - pl1e = virt_to_xen_l1e(va); > - > - spin_unlock(&globalmap_lock); > - > - if ( !pl1e ) > - return NULL; > - l1e_write(pl1e, l1e_from_pfn(mfn, __PAGE_HYPERVISOR)); > - > - return (void *)va; > + return vmap(&mfn, 1); > } > > void unmap_domain_page_global(const void *ptr) > { > unsigned long va = (unsigned long)ptr; > - l1_pgentry_t *pl1e; > > if ( va >= DIRECTMAP_VIRT_START ) > return; > > - ASSERT(va >= GLOBALMAP_VIRT_START && va < GLOBALMAP_VIRT_END); > - > - /* /First/, we zap the PTE. */ > - pl1e = virt_to_xen_l1e(va); > - BUG_ON(!pl1e); > - l1e_write(pl1e, l1e_empty()); > + ASSERT(va >= VMAP_VIRT_START && va < VMAP_VIRT_END); > > - /* /Second/, we add to the garbage map. */ > - set_bit(PFN_DOWN(va - GLOBALMAP_VIRT_START), garbage); > + vunmap(ptr); > } > > /* Translate a map-domain-page'd address to the underlying MFN */ > @@ -393,7 +344,7 @@ unsigned long domain_page_map_to_mfn(con > if ( va >= DIRECTMAP_VIRT_START ) > return virt_to_mfn(ptr); > > - if ( va >= GLOBALMAP_VIRT_START && va < GLOBALMAP_VIRT_END ) > + if ( va >= VMAP_VIRT_START && va < VMAP_VIRT_END ) > { > pl1e = virt_to_xen_l1e(va); > BUG_ON(!pl1e); > --- a/xen/common/domain.c > +++ b/xen/common/domain.c > @@ -958,7 +958,8 @@ void unmap_vcpu_info(struct vcpu *v) > return; > > mfn = v->vcpu_info_mfn; > - unmap_domain_page_global(v->vcpu_info); > + unmap_domain_page_global((void *) > + ((unsigned long)v->vcpu_info & PAGE_MASK)); > > v->vcpu_info = &dummy_vcpu_info; > v->vcpu_info_mfn = INVALID_MFN; > --- a/xen/include/asm-x86/config.h > +++ b/xen/include/asm-x86/config.h > @@ -146,17 +146,15 @@ extern unsigned char boot_edid_info[128] > * Per-domain mappings (e.g., GDT, LDT). > * 0xffff828000000000 - 0xffff82bfffffffff [256GB, 2^38 bytes, PML4:261] > * Machine-to-phys translation table. > - * 0xffff82c000000000 - 0xffff82c3ffffffff [16GB, 2^34 bytes, PML4:261] > + * 0xffff82c000000000 - 0xffff82cfffffffff [64GB, 2^36 bytes, PML4:261] > * vmap()/ioremap()/fixmap area. > - * 0xffff82c400000000 - 0xffff82c43fffffff [1GB, 2^30 bytes, PML4:261] > - * Global domain page map area. > - * 0xffff82c440000000 - 0xffff82c47fffffff [1GB, 2^30 bytes, PML4:261] > + * 0xffff82d000000000 - 0xffff82d03fffffff [1GB, 2^30 bytes, PML4:261] > * Compatibility machine-to-phys translation table. > - * 0xffff82c480000000 - 0xffff82c4bfffffff [1GB, 2^30 bytes, PML4:261] > + * 0xffff82d040000000 - 0xffff82d07fffffff [1GB, 2^30 bytes, PML4:261] > * High read-only compatibility machine-to-phys translation table. > - * 0xffff82c4c0000000 - 0xffff82c4ffffffff [1GB, 2^30 bytes, PML4:261] > + * 0xffff82d080000000 - 0xffff82d0bfffffff [1GB, 2^30 bytes, PML4:261] > * Xen text, static data, bss. > - * 0xffff82c500000000 - 0xffff82dffbffffff [108GB - 64MB, PML4:261] > + * 0xffff82d0c0000000 - 0xffff82dffbffffff [61GB - 64MB, PML4:261] > * Reserved for future use. > * 0xffff82dffc000000 - 0xffff82dfffffffff [64MB, 2^26 bytes, PML4:261] > * Super-page information array. > @@ -220,15 +218,11 @@ extern unsigned char boot_edid_info[128] > /* Slot 261: machine-to-phys conversion table (256GB). */ > #define RDWR_MPT_VIRT_START (PML4_ADDR(261)) > #define RDWR_MPT_VIRT_END (RDWR_MPT_VIRT_START + MPT_VIRT_SIZE) > -/* Slot 261: vmap()/ioremap()/fixmap area (16GB). */ > +/* Slot 261: vmap()/ioremap()/fixmap area (64GB). */ > #define VMAP_VIRT_START RDWR_MPT_VIRT_END > -#define VMAP_VIRT_END (VMAP_VIRT_START + GB(16)) > -/* Slot 261: global domain page map area (1GB). */ > -#define GLOBALMAP_GBYTES 1 > -#define GLOBALMAP_VIRT_START VMAP_VIRT_END > -#define GLOBALMAP_VIRT_END (GLOBALMAP_VIRT_START + > (GLOBALMAP_GBYTES<<30)) > +#define VMAP_VIRT_END (VMAP_VIRT_START + GB(64)) > /* Slot 261: compatibility machine-to-phys conversion table (1GB). */ > -#define RDWR_COMPAT_MPT_VIRT_START GLOBALMAP_VIRT_END > +#define RDWR_COMPAT_MPT_VIRT_START VMAP_VIRT_END > #define RDWR_COMPAT_MPT_VIRT_END (RDWR_COMPAT_MPT_VIRT_START + GB(1)) > /* Slot 261: high read-only compat machine-to-phys conversion table (1GB). */ > #define HIRO_COMPAT_MPT_VIRT_START RDWR_COMPAT_MPT_VIRT_END > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |