Message ID | 59DF59870200007800185560@prv-mh.provo.novell.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 12/10/17 11:01, Jan Beulich wrote: > Don't accept anything other than r/w RAM pages and move the paged-out > check into the (unlikely) error path following that check. > > Signed-off-by: Jan Beulich <jbeulich@suse.com> How does dom0 boot with this change in place? You appear to have prohibited mapping MMIO frames. ~Andrew > > --- a/xen/arch/x86/mm.c > +++ b/xen/arch/x86/mm.c > @@ -3507,18 +3507,18 @@ long do_mmu_update( > gmfn = req.ptr >> PAGE_SHIFT; > page = get_page_from_gfn(pt_owner, gmfn, &p2mt, P2M_ALLOC); > > - if ( p2m_is_paged(p2mt) ) > + if ( unlikely(!page) || p2mt != p2m_ram_rw ) > { > - ASSERT(!page); > - p2m_mem_paging_populate(pt_owner, gmfn); > - rc = -ENOENT; > - break; > - } > - > - if ( unlikely(!page) ) > - { > - gdprintk(XENLOG_WARNING, > - "Could not get page for normal update\n"); > + if ( page ) > + put_page(page); > + if ( p2m_is_paged(p2mt) ) > + { > + p2m_mem_paging_populate(pt_owner, gmfn); > + rc = -ENOENT; > + } > + else > + gdprintk(XENLOG_WARNING, > + "Could not get page for normal update\n"); > break; > } > > > >
>>> On 12.10.17 at 13:31, <andrew.cooper3@citrix.com> wrote: > On 12/10/17 11:01, Jan Beulich wrote: >> Don't accept anything other than r/w RAM pages and move the paged-out >> check into the (unlikely) error path following that check. >> >> Signed-off-by: Jan Beulich <jbeulich@suse.com> > > How does dom0 boot with this change in place? You appear to have > prohibited mapping MMIO frames. The page in question is a page table one, which can't be MMIO. Dom0 is booting fine. Jan >> --- a/xen/arch/x86/mm.c >> +++ b/xen/arch/x86/mm.c >> @@ -3507,18 +3507,18 @@ long do_mmu_update( >> gmfn = req.ptr >> PAGE_SHIFT; >> page = get_page_from_gfn(pt_owner, gmfn, &p2mt, P2M_ALLOC); >> >> - if ( p2m_is_paged(p2mt) ) >> + if ( unlikely(!page) || p2mt != p2m_ram_rw ) >> { >> - ASSERT(!page); >> - p2m_mem_paging_populate(pt_owner, gmfn); >> - rc = -ENOENT; >> - break; >> - } >> - >> - if ( unlikely(!page) ) >> - { >> - gdprintk(XENLOG_WARNING, >> - "Could not get page for normal update\n"); >> + if ( page ) >> + put_page(page); >> + if ( p2m_is_paged(p2mt) ) >> + { >> + p2m_mem_paging_populate(pt_owner, gmfn); >> + rc = -ENOENT; >> + } >> + else >> + gdprintk(XENLOG_WARNING, >> + "Could not get page for normal update\n"); >> break; >> } >> >> >> >>
--- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -3507,18 +3507,18 @@ long do_mmu_update( gmfn = req.ptr >> PAGE_SHIFT; page = get_page_from_gfn(pt_owner, gmfn, &p2mt, P2M_ALLOC); - if ( p2m_is_paged(p2mt) ) + if ( unlikely(!page) || p2mt != p2m_ram_rw ) { - ASSERT(!page); - p2m_mem_paging_populate(pt_owner, gmfn); - rc = -ENOENT; - break; - } - - if ( unlikely(!page) ) - { - gdprintk(XENLOG_WARNING, - "Could not get page for normal update\n"); + if ( page ) + put_page(page); + if ( p2m_is_paged(p2mt) ) + { + p2m_mem_paging_populate(pt_owner, gmfn); + rc = -ENOENT; + } + else + gdprintk(XENLOG_WARNING, + "Could not get page for normal update\n"); break; }
Don't accept anything other than r/w RAM pages and move the paged-out check into the (unlikely) error path following that check. Signed-off-by: Jan Beulich <jbeulich@suse.com>