[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: IOCTL_PRIVCMD_MMAPBATCH on Xen 4.13.0
On 15/05/2020 21:29, Manuel Bouyer wrote: > Hello, > NetBSD works as dom0 up to Xen 4.11. I'm trying to get it working > on 4.13.0. I added the support for gntdev operations, but I'm stuck with > privcmd IOCTL_PRIVCMD_MMAPBATCH. It seems to work fine for PV and PVH domUs, > but with HVM domUs, MMU_NORMAL_PT_UPDATE returns -22 (EINVAL) and > qemu-dm dumps core (as expected; the page is not mapped). > Of course this works fine in 4.11 > > In the Xen kernel, I tracked it down to arch/x86/mm.c near line 2229, > in mod_l1_entry(): > /* Translate foreign guest address. */ > if ( cmd != MMU_PT_UPDATE_NO_TRANSLATE && > paging_mode_translate(pg_dom) ) > { > p2m_type_t p2mt; > p2m_query_t q = l1e_get_flags(nl1e) & _PAGE_RW ? > P2M_ALLOC | P2M_UNSHARE : P2M_ALLOC; > > page = get_page_from_gfn(pg_dom, l1e_get_pfn(nl1e), &p2mt, q); > > if ( p2m_is_paged(p2mt) ) > { > if ( page ) > put_page(page); > p2m_mem_paging_populate(pg_dom, l1e_get_pfn(nl1e)); > return -ENOENT; > } > > if ( p2mt == p2m_ram_paging_in && !page ) > return -ENOENT; > > /* Did our attempt to unshare fail? */ > if ( (q & P2M_UNSHARE) && p2m_is_shared(p2mt) ) > { > /* We could not have obtained a page ref. */ > ASSERT(!page); > /* And mem_sharing_notify has already been called. */ > return -ENOMEM; > } > > if ( !page ) { > gdprintk(XENLOG_WARNING, "translate but no page\n"); > return -EINVAL; > } > nl1e = l1e_from_page(page, l1e_get_flags(nl1e)); > } > > the gdprintk() I added in the ( !page) case fires, so this is the > cause of the EINVAL. > Is it expected for a HVM domU ? If so, how should the dom0 code be > changed to get it working ? I failed to see where our code is different > from linux ... What is qemu doing at the time? Is it by any chance trying to map the IOREQ server frame? ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |