[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Ping: [PATCH] libxc/x86: fix page table creation for huge guests
Ping? >>> On 28.08.13 at 16:58, "Jan Beulich" <JBeulich@xxxxxxxx> wrote: > The switch-over logic from one page directory to the next was wrong; > it needs to be deferred until we actually reach the last page within > a given region, instead of being done when the last entry of a page > directory gets started with. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > > --- a/tools/libxc/xc_dom_x86.c > +++ b/tools/libxc/xc_dom_x86.c > @@ -251,7 +251,7 @@ static int setup_pgtables_x86_32_pae(str > l3_pgentry_64_t *l3tab; > l2_pgentry_64_t *l2tab = NULL; > l1_pgentry_64_t *l1tab = NULL; > - unsigned long l3off, l2off, l1off; > + unsigned long l3off, l2off = 0, l1off; > xen_vaddr_t addr; > xen_pfn_t pgpfn; > xen_pfn_t l3mfn = xc_dom_p2m_guest(dom, l3pfn); > @@ -299,8 +299,6 @@ static int setup_pgtables_x86_32_pae(str > l2off = l2_table_offset_pae(addr); > l2tab[l2off] = > pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; > - if ( l2off == (L2_PAGETABLE_ENTRIES_PAE - 1) ) > - l2tab = NULL; > l1pfn++; > } > > @@ -312,8 +310,13 @@ static int setup_pgtables_x86_32_pae(str > if ( (addr >= dom->pgtables_seg.vstart) && > (addr < dom->pgtables_seg.vend) ) > l1tab[l1off] &= ~_PAGE_RW; /* page tables are r/o */ > + > if ( l1off == (L1_PAGETABLE_ENTRIES_PAE - 1) ) > + { > l1tab = NULL; > + if ( l2off == (L2_PAGETABLE_ENTRIES_PAE - 1) ) > + l2tab = NULL; > + } > } > > if ( dom->virt_pgtab_end <= 0xc0000000 ) > @@ -360,7 +363,7 @@ static int setup_pgtables_x86_64(struct > l3_pgentry_64_t *l3tab = NULL; > l2_pgentry_64_t *l2tab = NULL; > l1_pgentry_64_t *l1tab = NULL; > - uint64_t l4off, l3off, l2off, l1off; > + uint64_t l4off, l3off = 0, l2off = 0, l1off; > uint64_t addr; > xen_pfn_t pgpfn; > > @@ -391,8 +394,6 @@ static int setup_pgtables_x86_64(struct > l3off = l3_table_offset_x86_64(addr); > l3tab[l3off] = > pfn_to_paddr(xc_dom_p2m_guest(dom, l2pfn)) | L3_PROT; > - if ( l3off == (L3_PAGETABLE_ENTRIES_X86_64 - 1) ) > - l3tab = NULL; > l2pfn++; > } > > @@ -405,8 +406,6 @@ static int setup_pgtables_x86_64(struct > l2off = l2_table_offset_x86_64(addr); > l2tab[l2off] = > pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; > - if ( l2off == (L2_PAGETABLE_ENTRIES_X86_64 - 1) ) > - l2tab = NULL; > l1pfn++; > } > > @@ -418,8 +417,17 @@ static int setup_pgtables_x86_64(struct > if ( (addr >= dom->pgtables_seg.vstart) && > (addr < dom->pgtables_seg.vend) ) > l1tab[l1off] &= ~_PAGE_RW; /* page tables are r/o */ > + > if ( l1off == (L1_PAGETABLE_ENTRIES_X86_64 - 1) ) > + { > l1tab = NULL; > + if ( l2off == (L2_PAGETABLE_ENTRIES_X86_64 - 1) ) > + { > + l2tab = NULL; > + if ( l3off == (L3_PAGETABLE_ENTRIES_X86_64 - 1) ) > + l3tab = NULL; > + } > + } > } > return 0; > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |