- fix super page frame table setup for memory hotplug case (should
create full table, or else the hotplug code would need to do the
necessary table population)
- simplify super page frame table setup (can re-use frame table setup
code)
- slightly streamline frame table setup code
- fix (tighten) a BUG_ON() and an ASSERT() condition
- fix spage <-> pdx conversion macros (they had no users so far, and
hence no-one noticed how broken they were)
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -182,28 +182,6 @@ static uint32_t base_disallow_mask;
!is_hvm_domain(d)) ? \
L1_DISALLOW_MASK : (L1_DISALLOW_MASK & ~PAGE_CACHE_ATTRS))
-static void __init init_spagetable(void)
-{
- unsigned long s, start = SPAGETABLE_VIRT_START;
- unsigned long end = SPAGETABLE_VIRT_END;
- unsigned long step, mfn;
- unsigned int max_entries;
-
- step = 1UL << PAGETABLE_ORDER;
- max_entries = (max_pdx + ((1UL<<SUPERPAGE_ORDER)-1)) >>
SUPERPAGE_ORDER;
- end = start + (((max_entries * sizeof(*spage_table)) +
- ((1UL<<SUPERPAGE_SHIFT)-1)) &
(~((1UL<<SUPERPAGE_SHIFT)-1)));
-
- for (s = start; s < end; s += step << PAGE_SHIFT)
- {
- mfn = alloc_boot_pages(step, step);
- if ( !mfn )
- panic("Not enough memory for spage table");
- map_pages_to_xen(s, mfn, step, PAGE_HYPERVISOR);
- }
- memset((void *)start, 0, end - start);
-}
-
static void __init init_frametable_chunk(void *start, void *end)
{
unsigned long s = (unsigned long)start;
@@ -232,15 +210,25 @@ static void __init init_frametable_chunk
}
memset(start, 0, end - start);
- memset(end, -1, s - (unsigned long)end);
+ memset(end, -1, s - e);
+}
+
+static void __init init_spagetable(void)
+{
+ BUILD_BUG_ON(XEN_VIRT_END > SPAGETABLE_VIRT_START);
+
+ init_frametable_chunk(spage_table,
+ mem_hotplug ? (void *)SPAGETABLE_VIRT_END
+ : pdx_to_spage(max_pdx - 1) + 1);
}
void __init init_frametable(void)
{
unsigned int sidx, eidx, nidx;
unsigned int max_idx = (max_pdx + PDX_GROUP_COUNT - 1) / PDX_GROUP_COUNT;
+ struct page_info *end_pg, *top_pg;
- BUILD_BUG_ON(XEN_VIRT_END > FRAMETABLE_VIRT_END);
+ BUILD_BUG_ON(XEN_VIRT_END > FRAMETABLE_VIRT_START);
BUILD_BUG_ON(FRAMETABLE_VIRT_START & ((1UL << L2_PAGETABLE_SHIFT)
- 1));
for ( sidx = 0; ; sidx = nidx )
@@ -252,17 +240,13 @@ void __init init_frametable(void)
init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT),
pdx_to_page(eidx * PDX_GROUP_COUNT));
}
- if ( !mem_hotplug )
- init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT),
- pdx_to_page(max_pdx - 1) + 1);
- else
- {
- init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT),
- pdx_to_page(max_idx * PDX_GROUP_COUNT - 1) + 1);
- memset(pdx_to_page(max_pdx), -1,
- (unsigned long)pdx_to_page(max_idx * PDX_GROUP_COUNT) -
- (unsigned long)pdx_to_page(max_pdx));
- }
+
+ end_pg = pdx_to_page(max_pdx - 1) + 1;
+ top_pg = mem_hotplug ? pdx_to_page(max_idx * PDX_GROUP_COUNT - 1) + 1
+ : end_pg;
+ init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT), top_pg);
+ memset(end_pg, -1, (unsigned long)top_pg - (unsigned long)end_pg);
+
if (opt_allow_superpage)
init_spagetable();
}
--- a/xen/include/asm-x86/mm.h
+++ b/xen/include/asm-x86/mm.h
@@ -301,7 +301,7 @@ static inline struct page_info *__virt_t
static inline void *__page_to_virt(const struct page_info *pg)
{
- ASSERT((unsigned long)pg - FRAMETABLE_VIRT_START < FRAMETABLE_VIRT_END);
+ ASSERT((unsigned long)pg - FRAMETABLE_VIRT_START < FRAMETABLE_SIZE);
/*
* (sizeof(*pg) & -sizeof(*pg)) selects the LS bit of sizeof(*pg). The
* division and re-multiplication avoids one shift when sizeof(*pg) is a
--- a/xen/include/asm-x86/x86_64/page.h
+++ b/xen/include/asm-x86/x86_64/page.h
@@ -46,8 +46,8 @@ extern void pfn_pdx_hole_setup(unsigned
#define page_to_pdx(pg) ((pg) - frame_table)
#define pdx_to_page(pdx) (frame_table + (pdx))
-#define spage_to_pdx(spg) ((spg>>(SUPERPAGE_SHIFT-PAGE_SHIFT)) -
spage_table)
-#define pdx_to_spage(pdx) (spage_table +
((pdx)<<(SUPERPAGE_SHIFT-PAGE_SHIFT)))
+#define spage_to_pdx(spg) (((spg) -
spage_table)<<(SUPERPAGE_SHIFT-PAGE_SHIFT))
+#define pdx_to_spage(pdx) (spage_table +
((pdx)>>(SUPERPAGE_SHIFT-PAGE_SHIFT)))
/*
* Note: These are solely for the use by page_{get,set}_owner(), and
* therefore don''t need to handle the XEN_VIRT_{START,END}
range.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
On 10/12/2012 10:24, "Jan Beulich" <JBeulich@suse.com> wrote:> - fix super page frame table setup for memory hotplug case (should > create full table, or else the hotplug code would need to do the > necessary table population) > - simplify super page frame table setup (can re-use frame table setup > code) > - slightly streamline frame table setup code > - fix (tighten) a BUG_ON() and an ASSERT() condition > - fix spage <-> pdx conversion macros (they had no users so far, and > hence no-one noticed how broken they were) > > Signed-off-by: Jan Beulich <jbeulich@suse.com>Acked-by: Keir Fraser <keir@xen.org>> --- a/xen/arch/x86/mm.c > +++ b/xen/arch/x86/mm.c > @@ -182,28 +182,6 @@ static uint32_t base_disallow_mask; > !is_hvm_domain(d)) ? \ > L1_DISALLOW_MASK : (L1_DISALLOW_MASK & ~PAGE_CACHE_ATTRS)) > > -static void __init init_spagetable(void) > -{ > - unsigned long s, start = SPAGETABLE_VIRT_START; > - unsigned long end = SPAGETABLE_VIRT_END; > - unsigned long step, mfn; > - unsigned int max_entries; > - > - step = 1UL << PAGETABLE_ORDER; > - max_entries = (max_pdx + ((1UL<<SUPERPAGE_ORDER)-1)) >> SUPERPAGE_ORDER; > - end = start + (((max_entries * sizeof(*spage_table)) + > - ((1UL<<SUPERPAGE_SHIFT)-1)) & > (~((1UL<<SUPERPAGE_SHIFT)-1))); > - > - for (s = start; s < end; s += step << PAGE_SHIFT) > - { > - mfn = alloc_boot_pages(step, step); > - if ( !mfn ) > - panic("Not enough memory for spage table"); > - map_pages_to_xen(s, mfn, step, PAGE_HYPERVISOR); > - } > - memset((void *)start, 0, end - start); > -} > - > static void __init init_frametable_chunk(void *start, void *end) > { > unsigned long s = (unsigned long)start; > @@ -232,15 +210,25 @@ static void __init init_frametable_chunk > } > > memset(start, 0, end - start); > - memset(end, -1, s - (unsigned long)end); > + memset(end, -1, s - e); > +} > + > +static void __init init_spagetable(void) > +{ > + BUILD_BUG_ON(XEN_VIRT_END > SPAGETABLE_VIRT_START); > + > + init_frametable_chunk(spage_table, > + mem_hotplug ? (void *)SPAGETABLE_VIRT_END > + : pdx_to_spage(max_pdx - 1) + 1); > } > > void __init init_frametable(void) > { > unsigned int sidx, eidx, nidx; > unsigned int max_idx = (max_pdx + PDX_GROUP_COUNT - 1) / PDX_GROUP_COUNT; > + struct page_info *end_pg, *top_pg; > > - BUILD_BUG_ON(XEN_VIRT_END > FRAMETABLE_VIRT_END); > + BUILD_BUG_ON(XEN_VIRT_END > FRAMETABLE_VIRT_START); > BUILD_BUG_ON(FRAMETABLE_VIRT_START & ((1UL << L2_PAGETABLE_SHIFT) - 1)); > > for ( sidx = 0; ; sidx = nidx ) > @@ -252,17 +240,13 @@ void __init init_frametable(void) > init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT), > pdx_to_page(eidx * PDX_GROUP_COUNT)); > } > - if ( !mem_hotplug ) > - init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT), > - pdx_to_page(max_pdx - 1) + 1); > - else > - { > - init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT), > - pdx_to_page(max_idx * PDX_GROUP_COUNT - 1) + > 1); > - memset(pdx_to_page(max_pdx), -1, > - (unsigned long)pdx_to_page(max_idx * PDX_GROUP_COUNT) - > - (unsigned long)pdx_to_page(max_pdx)); > - } > + > + end_pg = pdx_to_page(max_pdx - 1) + 1; > + top_pg = mem_hotplug ? pdx_to_page(max_idx * PDX_GROUP_COUNT - 1) + 1 > + : end_pg; > + init_frametable_chunk(pdx_to_page(sidx * PDX_GROUP_COUNT), top_pg); > + memset(end_pg, -1, (unsigned long)top_pg - (unsigned long)end_pg); > + > if (opt_allow_superpage) > init_spagetable(); > } > --- a/xen/include/asm-x86/mm.h > +++ b/xen/include/asm-x86/mm.h > @@ -301,7 +301,7 @@ static inline struct page_info *__virt_t > > static inline void *__page_to_virt(const struct page_info *pg) > { > - ASSERT((unsigned long)pg - FRAMETABLE_VIRT_START < FRAMETABLE_VIRT_END); > + ASSERT((unsigned long)pg - FRAMETABLE_VIRT_START < FRAMETABLE_SIZE); > /* > * (sizeof(*pg) & -sizeof(*pg)) selects the LS bit of sizeof(*pg). The > * division and re-multiplication avoids one shift when sizeof(*pg) is a > --- a/xen/include/asm-x86/x86_64/page.h > +++ b/xen/include/asm-x86/x86_64/page.h > @@ -46,8 +46,8 @@ extern void pfn_pdx_hole_setup(unsigned > > #define page_to_pdx(pg) ((pg) - frame_table) > #define pdx_to_page(pdx) (frame_table + (pdx)) > -#define spage_to_pdx(spg) ((spg>>(SUPERPAGE_SHIFT-PAGE_SHIFT)) - spage_table) > -#define pdx_to_spage(pdx) (spage_table + > ((pdx)<<(SUPERPAGE_SHIFT-PAGE_SHIFT))) > +#define spage_to_pdx(spg) (((spg) - > spage_table)<<(SUPERPAGE_SHIFT-PAGE_SHIFT)) > +#define pdx_to_spage(pdx) (spage_table + > ((pdx)>>(SUPERPAGE_SHIFT-PAGE_SHIFT))) > /* > * Note: These are solely for the use by page_{get,set}_owner(), and > * therefore don''t need to handle the XEN_VIRT_{START,END} range. > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel