[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 16/22] vixen: pass grant table operations through to the outer Xen
On Sat, Jan 06, 2018 at 02:54:31PM -0800, Anthony Liguori wrote: > From: Anthony Liguori <aliguori@xxxxxxxxxx> > > The grant table is a region of guest memory that contains GMFNs > which in PV are MFNs but are PFNs in HVM. Since a Vixen guest MFN > is an HVM PFN, we can pass this table directly through to the outer > Xen which cuts down considerably on overhead. > > We do not forward most of the hypercalls since we only intend on > Vixen to be used for normal guests, not driver domains. > > Signed-off-by: Anthony Liguori <aliguori@xxxxxxxxxx> > --- > xen/common/grant_table.c | 131 > +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 131 insertions(+) > > diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c > index 250450b..b302fd0 100644 > --- a/xen/common/grant_table.c > +++ b/xen/common/grant_table.c > @@ -39,6 +39,7 @@ > #include <xen/vmap.h> > #include <xsm/xsm.h> > #include <asm/flushtlb.h> > +#include <asm/guest.h> > > /* Per-domain grant information. */ > struct grant_table { > @@ -1199,6 +1200,9 @@ gnttab_map_grant_ref( > int i; > struct gnttab_map_grant_ref op; > > + if ( is_vixen() ) > + return -ENOSYS; Here and below: instead of adding all those is_vixen calls in a bunch of gnttab functions, why don't you just replace the whole do_grant_table_op function? That's cleaner and less intrusive. > static long > +vixen_gnttab_setup_table( > + XEN_GUEST_HANDLE_PARAM(gnttab_setup_table_t) uop, unsigned int count) > +{ > + long rc; > + > + struct gnttab_setup_table op; > + xen_pfn_t *frame_list = NULL; > + static void *grant_table; > + XEN_GUEST_HANDLE(xen_pfn_t) old_frame_list; > + > + if ( count != 1 ) > + return -EINVAL; > + > + if ( unlikely(copy_from_guest(&op, uop, 1) != 0) ) > + { > + gdprintk(XENLOG_INFO, "Fault while reading gnttab_setup_table_t.\n"); > + return -EFAULT; > + } > + > + if ( grant_table == NULL ) { > + struct xen_add_to_physmap xatp; > + struct domain *d; > + int i; > + > + for ( i = 0; i < max_grant_frames; i++ ) > + { > + grant_table = alloc_xenheap_page(); This is wasting one memory page, grant table frames don't need to be populated. > + BUG_ON(grant_table == NULL); > + xatp.domid = DOMID_SELF; > + xatp.idx = i; > + xatp.space = XENMAPSPACE_grant_table; > + xatp.gpfn = virt_to_mfn(grant_table); > + rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp); > + if ( rc != 0 ) > + printk("Add to physmap failed! %ld\n", rc); > + > + d = rcu_lock_current_domain(); > + share_xen_page_with_guest(mfn_to_page(xatp.gpfn), d, > XENSHARE_writable); > + rcu_unlock_domain(d); > + } > + } > + > + if ( op.nr_frames > 0 ) { > + frame_list = xzalloc_array(xen_pfn_t, op.nr_frames); > + if ( frame_list == NULL ) > + return -ENOMEM; > + } > + > + old_frame_list = op.frame_list; > + op.frame_list.p = frame_list; > + > + rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &op, count); On HVM you don't need to use the GNTTABOP_setup_table hypercall, XENMEM_add_to_physmap already does all the needed setup AFAICT. > + op.frame_list = old_frame_list; > + > + if ( rc >= 0 ) { > + if ( op.status == 0 && op.nr_frames && > + copy_to_guest(old_frame_list, frame_list, op.nr_frames) != 0 ) { > + rc = -EFAULT; > + goto out; > + } > + > + if ( unlikely(copy_to_guest(uop, &op, 1)) != 0 ) { > + rc = -EFAULT; > + goto out; > + } > + } > + > + out: > + xfree(frame_list); > + > + return rc; > +} > + > +static long > gnttab_setup_table( > XEN_GUEST_HANDLE_PARAM(gnttab_setup_table_t) uop, unsigned int count, > unsigned int limit_max) > @@ -1811,6 +1895,9 @@ gnttab_setup_table( > struct grant_table *gt; > unsigned int i; > > + if ( is_vixen() ) > + return vixen_gnttab_setup_table(uop, count); > + > if ( count != 1 ) > return -EINVAL; > > @@ -1892,6 +1979,26 @@ gnttab_setup_table( > } > > static long > +vixen_gnttab_query_size( > + XEN_GUEST_HANDLE_PARAM(gnttab_query_size_t) uop, unsigned int count) > +{ > + struct gnttab_query_size op; > + int rc; > + > + if ( count != 1 ) > + return -EINVAL; > + > + if ( unlikely(copy_from_guest(&op, uop, 1)) != 0) > + return -EFAULT; > + > + rc = HYPERVISOR_grant_table_op(GNTTABOP_query_size, &op, count); > + if (rc == 0 && unlikely(__copy_to_guest(uop, &op, 1)) ) ^ nit: missing space Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |