|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v21 2/2] tools/libxenctrl: use new xenforeignmemory API to seed grant table
> -----Original Message-----
> From: Andrew Cooper
> Sent: 08 August 2018 10:59
> To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>; xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Ian Jackson <Ian.Jackson@xxxxxxxxxx>
> Subject: Re: [Xen-devel] [PATCH v21 2/2] tools/libxenctrl: use new
> xenforeignmemory API to seed grant table
>
> On 08/08/18 10:00, Paul Durrant wrote:
> > A previous patch added support for priv-mapping guest resources directly
> > (rather than having to foreign-map, which requires P2M modification for
> > HVM guests).
> >
> > This patch makes use of the new API to seed the guest grant table unless
> > the underlying infrastructure (i.e. privcmd) doesn't support it, in which
> > case the old scheme is used.
> >
> > NOTE: The call to xc_dom_gnttab_hvm_seed() in hvm_build_set_params()
> was
> > actually unnecessary, as the grant table has already been seeded
> > by a prior call to xc_dom_gnttab_init() made by libxl__build_dom().
> >
> > Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> > Acked-by: Marek Marczykowski-Górecki
> <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
> > Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> > Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
>
> Some minor style issues, all of which can fixed on commit (probably).
> Everything else looks fine.
Cool.
>
> > diff --git a/tools/libxc/include/xc_dom.h b/tools/libxc/include/xc_dom.h
> > index 8a66889c68..a8a0c0da66 100644
> > --- a/tools/libxc/include/xc_dom.h
> > +++ b/tools/libxc/include/xc_dom.h
> > @@ -337,12 +337,8 @@ void *xc_dom_boot_domU_map(struct
> xc_dom_image *dom, xen_pfn_t pfn,
> > int xc_dom_boot_image(struct xc_dom_image *dom);
> > int xc_dom_compat_check(struct xc_dom_image *dom);
> > int xc_dom_gnttab_init(struct xc_dom_image *dom);
> > -int xc_dom_gnttab_hvm_seed(xc_interface *xch, uint32_t domid,
> > - xen_pfn_t console_gmfn,
> > - xen_pfn_t xenstore_gmfn,
> > - uint32_t console_domid,
> > - uint32_t xenstore_domid);
> > -int xc_dom_gnttab_seed(xc_interface *xch, uint32_t domid,
> > +int xc_dom_gnttab_seed(xc_interface *xch, uint32_t guest_domid,
> > + bool is_hvm,
> > xen_pfn_t console_gmfn,
> > xen_pfn_t xenstore_gmfn,
>
> As you're rewriting most of the functionality, can we switch to gfn to
> correct the terminology?
Sure. I'll restrict mods to the bits I'm touching though.
>
> > uint32_t console_domid,
> > diff --git a/tools/libxc/xc_dom_boot.c b/tools/libxc/xc_dom_boot.c
> > index 2e5681dc5d..8307ebeaf6 100644
> > --- a/tools/libxc/xc_dom_boot.c
> > +++ b/tools/libxc/xc_dom_boot.c
> > @@ -256,11 +256,29 @@ static xen_pfn_t
> xc_dom_gnttab_setup(xc_interface *xch, uint32_t domid)
> > return gmfn;
> > }
> >
> > -int xc_dom_gnttab_seed(xc_interface *xch, uint32_t domid,
> > - xen_pfn_t console_gmfn,
> > - xen_pfn_t xenstore_gmfn,
> > - uint32_t console_domid,
> > - uint32_t xenstore_domid)
> > +static void xc_dom_set_gnttab_entry(xc_interface *xch,
> > + grant_entry_v1_t *gnttab,
> > + unsigned int idx,
> > + uint32_t guest_domid,
> > + uint32_t backend_domid,
> > + xen_pfn_t backend_gmfn)
>
> gfn
>
> > +{
> > + if ( guest_domid == backend_domid || backend_gmfn == -1)
>
> Space at the end.
>
> > + return;
> > +
> > + xc_dom_printf(xch, "%s: [%u] -> 0x%"PRI_xen_pfn,
> > + __FUNCTION__, idx, backend_gmfn);
>
> __func__ rather than __FUNCTION__. Also, "[%u] => d%d 0x"PRI_xen_pfn
> would be more helpful for diagnostics. (I do realise that backend
> domid's were retrofitted without adjusting the printf().)
>
> > +
> > + gnttab[idx].flags = GTF_permit_access;
> > + gnttab[idx].domid = backend_domid;
> > + gnttab[idx].frame = backend_gmfn;
> > +}
> > +
> > +static int compat_gnttab_seed(xc_interface *xch, uint32_t domid,
>
> compat_gnttab_pv_seed() ?
>
This is actually used in the HVM compat case too. I'll deal with the other
stylistic issues and add explicit version setting as discussed on the other
patch thread.
Paul
> > + xen_pfn_t console_gmfn,
> > + xen_pfn_t xenstore_gmfn,
>
> gfn
>
> > + uint32_t console_domid,
> > + uint32_t xenstore_domid)
> > {
> >
> > xen_pfn_t gnttab_gmfn;
> > @@ -313,11 +323,11 @@ int xc_dom_gnttab_seed(xc_interface *xch,
> uint32_t domid,
> > return 0;
> > }
> >
> > -int xc_dom_gnttab_hvm_seed(xc_interface *xch, uint32_t domid,
> > - xen_pfn_t console_gpfn,
> > - xen_pfn_t xenstore_gpfn,
> > - uint32_t console_domid,
> > - uint32_t xenstore_domid)
> > +static int compat_gnttab_hvm_seed(xc_interface *xch, uint32_t domid,
> > + xen_pfn_t console_gpfn,
> > + xen_pfn_t xenstore_gpfn,
>
> gfn.
>
> > + uint32_t console_domid,
> > + uint32_t xenstore_domid)
> > {
> > int rc;
> > xen_pfn_t scratch_gpfn;
> > @@ -356,7 +366,7 @@ int xc_dom_gnttab_hvm_seed(xc_interface *xch,
> uint32_t domid,
> > return -1;
> > }
> >
> > - rc = xc_dom_gnttab_seed(xch, domid,
> > + rc = compat_gnttab_seed(xch, domid,
> > console_gpfn, xenstore_gpfn,
> > console_domid, xenstore_domid);
> > if (rc != 0)
> > @@ -381,18 +391,56 @@ int xc_dom_gnttab_hvm_seed(xc_interface
> *xch, uint32_t domid,
> > return 0;
> > }
> >
> > -int xc_dom_gnttab_init(struct xc_dom_image *dom)
> > +int xc_dom_gnttab_seed(xc_interface *xch, uint32_t guest_domid,
> > + bool is_hvm, xen_pfn_t console_gmfn,
> > + xen_pfn_t xenstore_gmfn, uint32_t console_domid,
>
> gfn.
>
> > + uint32_t xenstore_domid)
> > {
> > - if ( xc_dom_translated(dom) ) {
> > - return xc_dom_gnttab_hvm_seed(dom->xch, dom->guest_domid,
> > - dom->console_pfn, dom->xenstore_pfn,
> > - dom->console_domid,
> > dom->xenstore_domid);
> > - } else {
> > - return xc_dom_gnttab_seed(dom->xch, dom->guest_domid,
> > - xc_dom_p2m(dom, dom->console_pfn),
> > - xc_dom_p2m(dom, dom->xenstore_pfn),
> > - dom->console_domid, dom->xenstore_domid);
> > + xenforeignmemory_handle* fmem = xch->fmem;
> > + xenforeignmemory_resource_handle *fres;
> > + void *addr = NULL;
> > +
> > + fres = xenforeignmemory_map_resource(
> > + fmem, guest_domid, XENMEM_resource_grant_table,
> > + XENMEM_resource_grant_table_id_shared, 0, 1, &addr,
> > + PROT_READ | PROT_WRITE, 0);
> > + if ( !fres )
> > + {
> > + if ( errno == EOPNOTSUPP )
> > + return is_hvm ?
> > + compat_gnttab_hvm_seed(xch, guest_domid,
> > + console_gmfn, xenstore_gmfn,
> > + console_domid, xenstore_domid) :
> > + compat_gnttab_seed(xch, guest_domid,
> > + console_gmfn, xenstore_gmfn,
> > + console_domid, xenstore_domid);
> > +
> > + xc_dom_panic(xch, XC_INTERNAL_ERROR,
> > + "%s: failed to acquire grant table "
> > + "[errno=%d]\n",
> > + __FUNCTION__, errno);
>
> __func__, and guest domid in the printk()?
>
> > + return -1;
> > }
> > +
> > + xc_dom_set_gnttab_entry(xch, addr, GNTTAB_RESERVED_CONSOLE,
> > + guest_domid, console_domid, console_gmfn);
> > + xc_dom_set_gnttab_entry(xch, addr, GNTTAB_RESERVED_XENSTORE,
> > + guest_domid, xenstore_domid, xenstore_gmfn);
> > +
> > + xenforeignmemory_unmap_resource(fmem, fres);
> > +
> > + return 0;
> > +}
> > +
> > +int xc_dom_gnttab_init(struct xc_dom_image *dom)
> > +{
> > + bool is_hvm = xc_dom_translated(dom);
> > + xen_pfn_t console_gmfn = xc_dom_p2m(dom, dom->console_pfn);
> > + xen_pfn_t xenstore_gmfn = xc_dom_p2m(dom, dom->xenstore_pfn);
>
> I've still got a pending fix to rename dom->*_pfn to gfn, but the local
> variables should at least be correct.
>
> > +
> > + return xc_dom_gnttab_seed(dom->xch, dom->guest_domid, is_hvm,
> > + console_gmfn, xenstore_gmfn,
> > + dom->console_domid, dom->xenstore_domid);
> > }
> >
> > /*
> > diff --git a/tools/libxc/xc_sr_restore_x86_hvm.c
> b/tools/libxc/xc_sr_restore_x86_hvm.c
> > index 227c48553e..4765a52f33 100644
> > --- a/tools/libxc/xc_sr_restore_x86_hvm.c
> > +++ b/tools/libxc/xc_sr_restore_x86_hvm.c
> > @@ -216,11 +216,11 @@ static int x86_hvm_stream_complete(struct
> xc_sr_context *ctx)
> > return rc;
> > }
> >
> > - rc = xc_dom_gnttab_hvm_seed(xch, ctx->domid,
> > - ctx->restore.console_gfn,
> > - ctx->restore.xenstore_gfn,
> > - ctx->restore.console_domid,
> > - ctx->restore.xenstore_domid);
> > + rc = xc_dom_gnttab_seed(xch, ctx->domid, true,
> > + ctx->restore.console_gfn,
> > + ctx->restore.xenstore_gfn,
> > + ctx->restore.console_domid,
> > + ctx->restore.xenstore_domid);
>
> Hmm. This is now common with the pv side, and will similarly be wanted
> on the ARM side eventually. This patch shouldn't change from how it is
> now, but I'll try and find some copious free time to pull together a
> common stream_complete() function.
>
> ~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |