[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |