[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.