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

Re: [Xen-devel] [PATCH 4/6] x86/shadow: widen reference count



On 12/12/2017 03:07 PM, Jan Beulich wrote:
> Utilize as many of the bits available in the union as possible, without
> (just to be on the safe side) colliding with any of the bits outside of
> PGT_type_mask.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
> 
> --- a/xen/arch/x86/mm/shadow/private.h
> +++ b/xen/arch/x86/mm/shadow/private.h
> @@ -510,7 +510,7 @@ void sh_destroy_shadow(struct domain *d,
>   * Returns 0 for failure, 1 for success. */
>  static inline int sh_get_ref(struct domain *d, mfn_t smfn, paddr_t entry_pa)
>  {
> -    u32 x, nx;
> +    unsigned long x, nx;
>      struct page_info *sp = mfn_to_page(smfn);
>  
>      ASSERT(mfn_valid(smfn));
> @@ -519,7 +519,7 @@ static inline int sh_get_ref(struct doma
>      x = sp->u.sh.count;
>      nx = x + 1;
>  
> -    if ( unlikely(nx >= (1U << PAGE_SH_REFCOUNT_WIDTH)) )
> +    if ( unlikely(nx >= (1UL << PAGE_SH_REFCOUNT_WIDTH)) )
>      {
>          SHADOW_PRINTK("shadow ref overflow, gmfn=%lx smfn=%lx\n",
>                         __backpointer(sp), mfn_x(smfn));
> @@ -543,7 +543,7 @@ static inline int sh_get_ref(struct doma
>   * physical address of the shadow entry that held this reference. */
>  static inline void sh_put_ref(struct domain *d, mfn_t smfn, paddr_t entry_pa)
>  {
> -    u32 x, nx;
> +    unsigned long x, nx;
>      struct page_info *sp = mfn_to_page(smfn);
>  
>      ASSERT(mfn_valid(smfn));
> @@ -561,8 +561,8 @@ static inline void sh_put_ref(struct dom
>  
>      if ( unlikely(x == 0) )
>      {
> -        SHADOW_ERROR("shadow ref underflow, smfn=%lx oc=%08x t=%#x\n",
> -                     mfn_x(smfn), sp->u.sh.count, sp->u.sh.type);
> +        SHADOW_ERROR("shadow ref underflow, smfn=%lx oc=%#lx t=%#x\n",
> +                     mfn_x(smfn), sp->u.sh.count + 0UL, sp->u.sh.type);
>          BUG();
>      }
>  
> --- a/xen/include/asm-x86/mm.h
> +++ b/xen/include/asm-x86/mm.h
> @@ -18,6 +18,77 @@
>   */
>  #define PFN_ORDER(_pfn) ((_pfn)->v.free.order)
>  
> +#define PG_shift(idx)   (BITS_PER_LONG - (idx))
> +#define PG_mask(x, idx) (x ## UL << PG_shift(idx))
> +
> + /* The following page types are MUTUALLY EXCLUSIVE. */
> +#define PGT_none          PG_mask(0, 3)  /* no special uses of this page   */
> +#define PGT_l1_page_table PG_mask(1, 3)  /* using as an L1 page table?     */
> +#define PGT_l2_page_table PG_mask(2, 3)  /* using as an L2 page table?     */
> +#define PGT_l3_page_table PG_mask(3, 3)  /* using as an L3 page table?     */
> +#define PGT_l4_page_table PG_mask(4, 3)  /* using as an L4 page table?     */
> +#define PGT_seg_desc_page PG_mask(5, 3)  /* using this page in a GDT/LDT?  */
> +#define PGT_shared_page   PG_mask(6, 3)  /* CoW sharable page              */
> +#define PGT_writable_page PG_mask(7, 3)  /* has writable mappings?         */
> +#define PGT_type_mask     PG_mask(7, 3)  /* Bits 61-63.                    */
> +
> + /* Page is locked? */
> +#define _PGT_locked       PG_shift(4)
> +#define PGT_locked        PG_mask(1, 4)
> + /* Owning guest has pinned this page to its current type? */
> +#define _PGT_pinned       PG_shift(5)
> +#define PGT_pinned        PG_mask(1, 5)
> + /* Has this page been validated for use as its current type? */
> +#define _PGT_validated    PG_shift(6)
> +#define PGT_validated     PG_mask(1, 6)
> + /* PAE only: is this an L2 page directory containing Xen-private mappings? 
> */
> +#define _PGT_pae_xen_l2   PG_shift(7)
> +#define PGT_pae_xen_l2    PG_mask(1, 7)
> +/* Has this page been *partially* validated for use as its current type? */
> +#define _PGT_partial      PG_shift(8)
> +#define PGT_partial       PG_mask(1, 8)
> +
> + /* Count of uses of this frame as its current type. */
> +#define PGT_count_width   PG_shift(8)
> +#define PGT_count_mask    ((1UL<<PGT_count_width)-1)
> +
> +/* Are the 'type mask' bits identical? */
> +#define PGT_type_equal(x, y) (!(((x) ^ (y)) & PGT_type_mask))
> +
> + /* Cleared when the owning guest 'frees' this page. */
> +#define _PGC_allocated    PG_shift(1)
> +#define PGC_allocated     PG_mask(1, 1)
> + /* Page is Xen heap? */
> +#define _PGC_xen_heap     PG_shift(2)
> +#define PGC_xen_heap      PG_mask(1, 2)
> + /* Set when is using a page as a page table */
> +#define _PGC_page_table   PG_shift(3)
> +#define PGC_page_table    PG_mask(1, 3)
> + /* 3-bit PAT/PCD/PWT cache-attribute hint. */
> +#define PGC_cacheattr_base PG_shift(6)
> +#define PGC_cacheattr_mask PG_mask(7, 6)
> + /* Page is broken? */
> +#define _PGC_broken       PG_shift(7)
> +#define PGC_broken        PG_mask(1, 7)
> + /* Mutually-exclusive page states: { inuse, offlining, offlined, free }. */
> +#define PGC_state         PG_mask(3, 9)
> +#define PGC_state_inuse   PG_mask(0, 9)
> +#define PGC_state_offlining PG_mask(1, 9)
> +#define PGC_state_offlined PG_mask(2, 9)
> +#define PGC_state_free    PG_mask(3, 9)
> +#define page_state_is(pg, st) (((pg)->count_info&PGC_state) == 
> PGC_state_##st)
> +
> + /* Count of references to this frame. */
> +#define PGC_count_width   PG_shift(9)
> +#define PGC_count_mask    ((1UL<<PGC_count_width)-1)
> +
> +/*
> + * Page needs to be scrubbed. Since this bit can only be set on a page that 
> is
> + * free (i.e. in PGC_state_free) we can reuse PGC_allocated bit.
> + */
> +#define _PGC_need_scrub   _PGC_allocated
> +#define PGC_need_scrub    PGC_allocated
> +
>  #ifndef CONFIG_BIGMEM
>  /*
>   * This definition is solely for the use in struct page_info (and
> @@ -82,7 +153,7 @@ struct page_info
>              unsigned long type:5;   /* What kind of shadow is this? */
>              unsigned long pinned:1; /* Is the shadow pinned? */
>              unsigned long head:1;   /* Is this the first page of the shadow? 
> */
> -#define PAGE_SH_REFCOUNT_WIDTH 25
> +#define PAGE_SH_REFCOUNT_WIDTH (PGT_count_width - 7)
>              unsigned long count:PAGE_SH_REFCOUNT_WIDTH; /* Reference count */
>          } sh;
>  
> @@ -198,77 +269,6 @@ struct page_info
>  
>  #undef __pdx_t
>  
> -#define PG_shift(idx)   (BITS_PER_LONG - (idx))
> -#define PG_mask(x, idx) (x ## UL << PG_shift(idx))
> -
> - /* The following page types are MUTUALLY EXCLUSIVE. */
> -#define PGT_none          PG_mask(0, 3)  /* no special uses of this page   */
> -#define PGT_l1_page_table PG_mask(1, 3)  /* using as an L1 page table?     */
> -#define PGT_l2_page_table PG_mask(2, 3)  /* using as an L2 page table?     */
> -#define PGT_l3_page_table PG_mask(3, 3)  /* using as an L3 page table?     */
> -#define PGT_l4_page_table PG_mask(4, 3)  /* using as an L4 page table?     */
> -#define PGT_seg_desc_page PG_mask(5, 3)  /* using this page in a GDT/LDT?  */
> -#define PGT_shared_page   PG_mask(6, 3)  /* CoW sharable page              */
> -#define PGT_writable_page PG_mask(7, 3)  /* has writable mappings?         */
> -#define PGT_type_mask     PG_mask(7, 3)  /* Bits 61-63.                    */
> -
> - /* Page is locked? */
> -#define _PGT_locked       PG_shift(4)
> -#define PGT_locked        PG_mask(1, 4)
> - /* Owning guest has pinned this page to its current type? */
> -#define _PGT_pinned       PG_shift(5)
> -#define PGT_pinned        PG_mask(1, 5)
> - /* Has this page been validated for use as its current type? */
> -#define _PGT_validated    PG_shift(6)
> -#define PGT_validated     PG_mask(1, 6)
> - /* PAE only: is this an L2 page directory containing Xen-private mappings? 
> */
> -#define _PGT_pae_xen_l2   PG_shift(7)
> -#define PGT_pae_xen_l2    PG_mask(1, 7)
> -/* Has this page been *partially* validated for use as its current type? */
> -#define _PGT_partial      PG_shift(8)
> -#define PGT_partial       PG_mask(1, 8)
> -
> - /* Count of uses of this frame as its current type. */
> -#define PGT_count_width   PG_shift(8)
> -#define PGT_count_mask    ((1UL<<PGT_count_width)-1)
> -
> -/* Are the 'type mask' bits identical? */
> -#define PGT_type_equal(x, y) (!(((x) ^ (y)) & PGT_type_mask))
> -
> - /* Cleared when the owning guest 'frees' this page. */
> -#define _PGC_allocated    PG_shift(1)
> -#define PGC_allocated     PG_mask(1, 1)
> - /* Page is Xen heap? */
> -#define _PGC_xen_heap     PG_shift(2)
> -#define PGC_xen_heap      PG_mask(1, 2)
> - /* Set when is using a page as a page table */
> -#define _PGC_page_table   PG_shift(3)
> -#define PGC_page_table    PG_mask(1, 3)
> - /* 3-bit PAT/PCD/PWT cache-attribute hint. */
> -#define PGC_cacheattr_base PG_shift(6)
> -#define PGC_cacheattr_mask PG_mask(7, 6)
> - /* Page is broken? */
> -#define _PGC_broken       PG_shift(7)
> -#define PGC_broken        PG_mask(1, 7)
> - /* Mutually-exclusive page states: { inuse, offlining, offlined, free }. */
> -#define PGC_state         PG_mask(3, 9)
> -#define PGC_state_inuse   PG_mask(0, 9)
> -#define PGC_state_offlining PG_mask(1, 9)
> -#define PGC_state_offlined PG_mask(2, 9)
> -#define PGC_state_free    PG_mask(3, 9)
> -#define page_state_is(pg, st) (((pg)->count_info&PGC_state) == 
> PGC_state_##st)

What's the point of moving this code?  And are there any important changes?

It would be a lot easier to review if you separated code motion from
code changes; but if you don't want to do that, you need to make it
clear what you're doing in your changelog.

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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