[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()


  • To: Jan Beulich <JBeulich@xxxxxxxx>, xen-devel <xen-devel@xxxxxxxxxxxxx>
  • From: Keir Fraser <keir.xen@xxxxxxxxx>
  • Date: Tue, 02 Jul 2013 08:56:15 +0100
  • Delivery-date: Tue, 02 Jul 2013 07:56:36 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xen.org>
  • Thread-index: Ac52+aBh8To7SUStO0WLqW/0OUFuRQ==
  • Thread-topic: [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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.