|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 20/24] xen/passthrough: Extend XEN_DOMCTL_assign_device to support DT device
On Tue, 20 Jan 2015, Jan Beulich wrote:
> >>> On 13.01.15 at 15:25, <julien.grall@xxxxxxxxxx> wrote:
> > --- a/xen/drivers/passthrough/iommu.c
> > +++ b/xen/drivers/passthrough/iommu.c
> > @@ -337,6 +337,13 @@ int iommu_do_domctl(
> > ret = iommu_do_pci_domctl(domctl, d, u_domctl);
> > #endif
> >
> > + if ( ret != -ENOSYS )
> > + return ret;
> > +
> > +#ifdef HAS_DEVICE_TREE
> > + ret = iommu_do_dt_domctl(domctl, d, u_domctl);
> > +#endif
>
> Please move the (inverted) if() into the #ifdef block (but also see
> below regarding the specific error code used).
>
> > @@ -1533,13 +1534,19 @@ int iommu_do_pci_domctl(
> > break;
> >
> > case XEN_DOMCTL_test_assign_device:
> > - ret = xsm_test_assign_device(XSM_HOOK,
> > domctl->u.assign_device.machine_sbdf);
> > + ret = -ENOSYS;
> > + if ( domctl->u.assign_device.dev != XEN_DOMCTL_DEV_PCI )
> > + break;
>
> I'm rather uncertain about the use of -ENOSYS here: The hypercall
> isn't unimplemented after all. Provided you use consistent error
> codes in the PCI and DT variants, there's no problem calling the
> other variant if that specific error code got returned from the first
> one - the second would then just return the same one again, even
> if the first one failed on something other than the device type
> check. As a result, I'd much prefer -ENODEV here.
>
> > +
> > + machine_sbdf = domctl->u.assign_device.u.pci.machine_sbdf;
> > +
> > + ret = xsm_test_assign_device(XSM_HOOK, machine_sbdf);
> > if ( ret )
> > break;
> >
> > - seg = domctl->u.assign_device.machine_sbdf >> 16;
> > - bus = (domctl->u.assign_device.machine_sbdf >> 8) & 0xff;
> > - devfn = domctl->u.assign_device.machine_sbdf & 0xff;
> > + seg = machine_sbdf >> 16;
> > + bus = (machine_sbdf >> 8) & 0xff;
> > + devfn = machine_sbdf & 0xff;
>
> If you fiddle with these, please make them use at least PCI_BUS()
> and PCI_DEVFN2() (we don't have a matching macro for retrieving
> the segment).
Maybe we should?
> > --- a/xen/include/public/domctl.h
> > +++ b/xen/include/public/domctl.h
> > @@ -475,12 +475,23 @@ typedef struct xen_domctl_sendtrigger
> > xen_domctl_sendtrigger_t;
> > DEFINE_XEN_GUEST_HANDLE(xen_domctl_sendtrigger_t);
> >
> >
> > -/* Assign PCI device to HVM guest. Sets up IOMMU structures. */
> > +/* Assign a device to a guest. Sets up IOMMU structures. */
> > /* XEN_DOMCTL_assign_device */
> > /* XEN_DOMCTL_test_assign_device */
> > /* XEN_DOMCTL_deassign_device */
> > +#define XEN_DOMCTL_DEV_PCI 0
> > +#define XEN_DOMCTL_DEV_DT 1
> > struct xen_domctl_assign_device {
> > - uint32_t machine_sbdf; /* machine PCI ID of assigned device */
> > + uint32_t dev; /* XEN_DOMCTL_DEV_* */
> > + union {
> > + struct {
> > + uint32_t machine_sbdf; /* machine PCI ID of assigned device
> > */
> > + } pci;
> > + struct {
> > + uint32_t size; /* Length of the path */
> > + XEN_GUEST_HANDLE_64(char) path; /* path to the device tree
> > node */
> > + } dt;
> > + } u;
> > };
>
> An incompatible change like this requires bumping
> XEN_DOMCTL_INTERFACE_VERSION when not already done during
> the current release cycle.
>
> Jan
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |