<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/14 Jim Fehlig <span dir="ltr"><<a href="mailto:jfehlig@suse.com" target="_blank">jfehlig@suse.com</a>></span><br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="im"><a href="mailto:cyliu@suse.com">cyliu@suse.com</a> wrote:<br>
> From: Chunyan Liu <<a href="mailto:cyliu@suse.com">cyliu@suse.com</a>><br>
><br>
> Add pci passthrough to libxl driver, support attach-device, detach-device and<br>
> start a vm with pci hostdev specified.<br>
><br>
> Signed-off-by: Chunyan Liu <<a href="mailto:cyliu@suse.com">cyliu@suse.com</a>><br>
> ---<br>
>  src/libxl/libxl_conf.c   |   65 ++++++++++++<br>
>  src/libxl/libxl_conf.h   |    5 +-<br>
>  src/libxl/libxl_driver.c |  250 +++++++++++++++++++++++++++++++++++++++++++++-<br>
>  3 files changed, 315 insertions(+), 5 deletions(-)<br>
><br>
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c<br>
> index 827dfdd..aa6fd1e 100644<br>
> --- a/src/libxl/libxl_conf.c<br>
> +++ b/src/libxl/libxl_conf.c<br>
> @@ -871,6 +871,67 @@ error:<br>
>      return -1;<br>
>  }<br>
><br>
> +int libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev)<br>
><br>
<br>
</div>Return type and function name on separate lines.<br>
<div><div class="h5"><br>
> +{<br>
> +    if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)<br>
> +        return -1;<br>
> +    if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)<br>
> +        return -1;<br>
> +<br>
> +    pcidev->domain = hostdev->source.subsys.u.pci.addr.domain;<br>
> +    pcidev->bus = hostdev->source.subsys.u.pci.addr.bus;<br>
> +    pcidev->dev = hostdev->source.subsys.u.pci.addr.slot;<br>
> +    pcidev->func = hostdev->source.subsys.u.pci.addr.function;<br>
> +<br>
> +    return 0;<br>
> +}<br>
> +<br>
> +static int<br>
> +libxlMakePciList(virDomainDefPtr def, libxl_domain_config *d_config)<br>
> +{<br>
> +    virDomainHostdevDefPtr *l_hostdevs = def->hostdevs;<br>
> +    size_t nhostdevs = def->nhostdevs;<br>
> +    size_t npcidevs = 0;<br>
> +    libxl_device_pci *x_pcidevs;<br>
> +    size_t i, j;<br>
> +<br>
> +    if (nhostdevs == 0)<br>
> +        return 0;<br>
> +<br>
> +    if (VIR_ALLOC_N(x_pcidevs, nhostdevs) < 0) {<br>
> +        virReportOOMError();<br>
><br>
<br>
</div></div>No need to report OOM error.<br>
<div><div class="h5"><br>
> +        return -1;<br>
> +    }<br>
> +<br>
> +    for (i = 0, j = 0; i < nhostdevs; i++) {<br>
> +        if (l_hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)<br>
> +            continue;<br>
> +        if (l_hostdevs[i]->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)<br>
> +            continue;<br>
> +<br>
> +        libxl_device_pci_init(&x_pcidevs[j]);<br>
> +<br>
> +        if (libxlMakePci(l_hostdevs[i], &x_pcidevs[j]) < 0)<br>
> +            goto error;<br>
> +<br>
> +        npcidevs++;<br>
> +        j++;<br>
> +    }<br>
> +<br>
> +    VIR_SHRINK_N(x_pcidevs, nhostdevs, nhostdevs - npcidevs);<br>
> +    d_config->pcidevs = x_pcidevs;<br>
> +    d_config->num_pcidevs = npcidevs;<br>
> +<br>
> +    return 0;<br>
> +<br>
> +error:<br>
> +    for (i = 0; i < npcidevs; i++) {<br>
> +        libxl_device_pci_dispose(&x_pcidevs[i]);<br>
> +    }<br>
><br>
<br>
</div></div>No need for the braces.  From HACKING:<br>
<br>
Omit the curly braces around an "if", "while", "for" etc. body only when<br>
that body occupies a single line.<br>
<div class="im"><br>
> +    VIR_FREE(x_pcidevs);<br>
> +    return -1;<br>
> +}<br>
> +<br>
>  virCapsPtr<br>
>  libxlMakeCapabilities(libxl_ctx *ctx)<br>
>  {<br>
> @@ -932,6 +993,10 @@ libxlBuildDomainConfig(libxlDriverPrivatePtr driver,<br>
>          return -1;<br>
>      }<br>
><br>
> +    if (libxlMakePciList(def, d_config) < 0) {<br>
> +        return -1;<br>
> +    }<br>
> +<br>
><br>
<br>
</div>Same here, no need for the braces.  (I should put together a cleanup<br>
patch to fix the existing offenses in this file.)<br>
<div class="im"><br>
>      d_config->on_reboot = def->onReboot;<br>
>      d_config->on_poweroff = def->onPoweroff;<br>
>      d_config->on_crash = def->onCrash;<br>
> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h<br>
> index aa57710..db3e53d 100644<br>
> --- a/src/libxl/libxl_conf.h<br>
> +++ b/src/libxl/libxl_conf.h<br>
> @@ -36,7 +36,7 @@<br>
>  # include "virobject.h"<br>
>  # include "virchrdev.h"<br>
><br>
> -<br>
><br>
<br>
</div>Spurious whitespace change.<br>
<div class="im"><br>
> +# define LIBXL_DRIVER_NAME "xenlight"<br>
>  # define LIBXL_VNC_PORT_MIN  5900<br>
>  # define LIBXL_VNC_PORT_MAX  65535<br>
><br>
> @@ -126,7 +126,8 @@ libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic);<br>
>  int<br>
>  libxlMakeVfb(libxlDriverPrivatePtr driver,<br>
>               virDomainGraphicsDefPtr l_vfb, libxl_device_vfb *x_vfb);<br>
> -<br>
><br>
<br>
</div>Same here.  I'd prefer a line between all these function declarations.<br>
<div><div class="h5"><br>
> +int<br>
> +libxlMakePci(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev);<br>
>  int<br>
>  libxlBuildDomainConfig(libxlDriverPrivatePtr driver,<br>
>                         virDomainObjPtr vm, libxl_domain_config *d_config);<br>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c<br>
> index 9e9bc89..8166baf 100644<br>
> --- a/src/libxl/libxl_driver.c<br>
> +++ b/src/libxl/libxl_driver.c<br>
> @@ -49,6 +49,7 @@<br>
>  #include "virstring.h"<br>
>  #include "virsysinfo.h"<br>
>  #include "viraccessapicheck.h"<br>
> +#include "virhostdev.h"<br>
><br>
>  #define VIR_FROM_THIS VIR_FROM_LIBXL<br>
><br>
> @@ -698,6 +699,7 @@ libxlVmReap(libxlDriverPrivatePtr driver,<br>
>              virDomainShutoffReason reason)<br>
>  {<br>
>      libxlDomainObjPrivatePtr priv = vm->privateData;<br>
> +    virHostdevManagerPtr hostdev_mgr;<br>
><br>
>      if (libxl_domain_destroy(priv->ctx, vm->def->id, NULL) < 0) {<br>
>          virReportError(VIR_ERR_INTERNAL_ERROR,<br>
> @@ -705,6 +707,10 @@ libxlVmReap(libxlDriverPrivatePtr driver,<br>
>          return -1;<br>
>      }<br>
><br>
> +    hostdev_mgr = virHostdevManagerGetDefault();<br>
> +    virHostdevReAttachDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME,<br>
> +                               vm->def, VIR_SP_PCI_HOSTDEV);<br>
><br>
<br>
</div></div>Parameter indentation looks wrong.<br>
<div><div class="h5"><br>
> +<br>
>      libxlVmCleanup(driver, vm, reason);<br>
>      return 0;<br>
>  }<br>
> @@ -928,6 +934,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,<br>
>      char *managed_save_path = NULL;<br>
>      int managed_save_fd = -1;<br>
>      libxlDomainObjPrivatePtr priv = vm->privateData;<br>
> +    virHostdevManagerPtr hostdev_mgr;<br>
><br>
>      /* If there is a managed saved state restore it instead of starting<br>
>       * from scratch. The old state is removed once the restoring succeeded. */<br>
> @@ -982,6 +989,12 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,<br>
>          goto error;<br>
>      }<br>
><br>
> +    VIR_DEBUG("Preparing host PCI devices");<br>
> +    hostdev_mgr = virHostdevManagerGetDefault();<br>
> +    if (virHostdevPrepareDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME,<br>
> +                                        vm->def, VIR_SP_PCI_HOSTDEV) < 0)<br>
> +        goto error;<br>
> +<br>
>      /* use as synchronous operations => ao_how = NULL and no intermediate reports => ao_progress = NULL */<br>
><br>
>      if (restore_fd < 0)<br>
> @@ -1075,6 +1088,7 @@ libxlReconnectDomain(virDomainObjPtr vm,<br>
>      libxl_dominfo d_info;<br>
>      int len;<br>
>      uint8_t *data = NULL;<br>
> +    virHostdevManagerPtr hostdev_mgr;<br>
><br>
>      virObjectLock(vm);<br>
><br>
> @@ -1097,6 +1111,13 @@ libxlReconnectDomain(virDomainObjPtr vm,<br>
><br>
>      /* Update domid in case it changed (e.g. reboot) while we were gone? */<br>
>      vm->def->id = d_info.domid;<br>
> +<br>
> +    /* Update hostdev state */<br>
> +    hostdev_mgr = virHostdevManagerGetDefault();<br>
> +    if (virHostdevPrepareDomainHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME,<br>
> +                                        vm->def, VIR_SP_PCI_HOSTDEV) < 0)<br>
> +        goto out;<br>
> +<br>
>      virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_UNKNOWN);<br>
><br>
>      if (!driver->nactive && driver->inhibitCallback)<br>
> @@ -3521,6 +3542,112 @@ cleanup:<br>
>  }<br>
><br>
>  static int<br>
> +libxlDomainAttachHostPciDevice(libxlDomainObjPrivatePtr priv,<br>
> +                               virDomainObjPtr vm,<br>
> +                               virDomainHostdevDefPtr hostdev)<br>
> +{<br>
> +    libxl_device_pci pcidev;<br>
> +    virDomainHostdevDefPtr found;<br>
> +    virHostdevManagerPtr hostdev_mgr;<br>
> +<br>
> +    if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)<br>
> +        return -1;<br>
> +<br>
> +    if (virDomainHostdevFind(vm->def, hostdev, &found) >= 0) {<br>
> +        virReportError(VIR_ERR_OPERATION_FAILED,<br>
> +                       _("target pci device %.4x:%.2x:%.2x.%.1x already exists"),<br>
> +                       hostdev->source.subsys.u.pci.addr.domain,<br>
> +                       hostdev->source.subsys.u.pci.addr.bus,<br>
> +                       hostdev->source.subsys.u.pci.addr.slot,<br>
> +                       hostdev->source.subsys.u.pci.addr.function);<br>
> +        return -1;<br>
> +    }<br>
> +<br>
> +    if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0) {<br>
> +        virReportOOMError();<br>
><br>
<br>
</div></div>No need to report OOM error.<br>
<div><div class="h5"><br>
> +        return -1;<br>
> +    }<br>
> +<br>
> +    hostdev_mgr = virHostdevManagerGetDefault();<br>
> +    if (virHostdevPreparePciHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME,<br>
> +                                     vm->def->name, vm->def->uuid,<br>
> +                                     &hostdev, 1, 0) < 0) {<br>
> +        goto cleanup;<br>
> +    }<br>
> +<br>
> +    if (libxlMakePci(hostdev, &pcidev) < 0)<br>
> +        goto reattach_hostdev;<br>
> +<br>
> +    if (libxl_device_pci_add(priv->ctx, vm->def->id, &pcidev, 0) < 0) {<br>
> +        virReportError(VIR_ERR_INTERNAL_ERROR,<br>
> +                       _("libxenlight failed to attach pci device %.4x:%.2x:%.2x.%.1x"),<br>
> +                       hostdev->source.subsys.u.pci.addr.domain,<br>
> +                       hostdev->source.subsys.u.pci.addr.bus,<br>
> +                       hostdev->source.subsys.u.pci.addr.slot,<br>
> +                       hostdev->source.subsys.u.pci.addr.function);<br>
> +        goto reattach_hostdev;<br>
> +    }<br>
> +<br>
> +    vm->def->hostdevs[vm->def->nhostdevs++] = hostdev;<br>
> +    return 0;<br>
> +<br>
> +reattach_hostdev:<br>
> +    virHostdevReAttachPciHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME,<br>
> +                                  vm->def->name, &hostdev, 1);<br>
> +<br>
> +cleanup:<br>
> +    return -1;<br>
> +}<br>
> +<br>
> +static int<br>
> +libxlDomainAttachHostDevice(libxlDomainObjPrivatePtr priv,<br>
> +                            virDomainObjPtr vm,<br>
> +                            virDomainDeviceDefPtr dev)<br>
> +{<br>
> +    virDomainHostdevDefPtr hostdev = dev->data.hostdev;<br>
> +<br>
> +    if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {<br>
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
> +                       _("hostdev mode '%s' not supported"),<br>
> +                       virDomainHostdevModeTypeToString(hostdev->mode));<br>
> +        return -1;<br>
> +    }<br>
> +/*<br>
> +    if (qemuSetupHostdevCGroup(vm, hostdev) < 0)<br>
> +        return -1;<br>
> +<br>
> +    if (virSecurityManagerSetHostdevLabel(driver->securityManager,<br>
> +                                          vm->def, hostdev, NULL) < 0)<br>
> +        goto cleanup;<br>
> +*/<br>
><br>
<br>
</div></div>Looks like this should be removed from the libxl driver :).<br>
<div><div class="h5"><br>
> +    switch (hostdev->source.subsys.type) {<br>
> +    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:<br>
> +        if (libxlDomainAttachHostPciDevice(priv, vm, hostdev) < 0)<br>
> +            goto error;<br>
> +        break;<br>
> +<br>
> +    default:<br>
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
> +                       _("hostdev subsys type '%s' not supported"),<br>
> +                       virDomainHostdevSubsysTypeToString(hostdev->source.subsys.type));<br>
> +        goto error;<br>
> +    }<br>
> +<br>
> +    return 0;<br>
> +<br>
> +error:<br>
> +/*    if (virSecurityManagerRestoreHostdevLabel(driver->securityManager,<br>
> +                                              vm->def, hostdev, NULL) < 0)<br>
> +        VIR_WARN("Unable to restore host device labelling on hotplug fail");<br>
> +<br>
> +cleanup:<br>
> +    if (qemuTeardownHostdevCgroup(vm, hostdev) < 0)<br>
> +        VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");<br>
> +*/<br>
> +    return -1;<br>
><br>
<br>
</div></div>Again, don't think this is needed in the libxl driver.  Also, there is<br>
nothing to cleanup so might as well just return -1 when errors are<br>
encountered.<br>
<div class="im"><br>
> +}<br>
> +<br>
> +static int<br>
>  libxlDomainDetachDeviceDiskLive(libxlDomainObjPrivatePtr priv,<br>
>                                  virDomainObjPtr vm, virDomainDeviceDefPtr dev)<br>
>  {<br>
> @@ -3586,7 +3713,11 @@ libxlDomainAttachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,<br>
>              if (!ret)<br>
>                  dev->data.disk = NULL;<br>
>              break;<br>
> -<br>
><br>
<br>
</div>Spurious whitespace change.<br>
<div class="im"><br>
> +        case VIR_DOMAIN_DEVICE_HOSTDEV:<br>
> +            ret = libxlDomainAttachHostDevice(priv, vm, dev);<br>
> +            if (!ret)<br>
> +                dev->data.hostdev = NULL;<br>
> +            break;<br>
><br>
<br>
</div>Generally there is a line between case statements, including the default<br>
case.<br>
<div class="im"><br>
>          default:<br>
>              virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
>                             _("device type '%s' cannot be attached"),<br>
> @@ -3601,6 +3732,8 @@ static int<br>
>  libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)<br>
>  {<br>
>      virDomainDiskDefPtr disk;<br>
> +    virDomainHostdevDefPtr hostdev;<br>
> +    virDomainHostdevDefPtr found;<br>
><br>
>      switch (dev->type) {<br>
>          case VIR_DOMAIN_DEVICE_DISK:<br>
> @@ -3615,6 +3748,25 @@ libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)<br>
>              /* vmdef has the pointer. Generic codes for vmdef will do all jobs */<br>
>              dev->data.disk = NULL;<br>
>              break;<br>
><br>
<br>
</div>Same here, line before the next case.<br>
<div><div class="h5"><br>
> +        case VIR_DOMAIN_DEVICE_HOSTDEV:<br>
> +            hostdev = dev->data.hostdev;<br>
> +<br>
> +            if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)<br>
> +                return -1;<br>
> +<br>
> +            if (virDomainHostdevFind(vmdef, hostdev, &found) >= 0) {<br>
> +                virReportError(VIR_ERR_OPERATION_FAILED,<br>
> +                               _("target pci device %.4x:%.2x:%.2x.%.1x\<br>
> +                                  already exists"),<br>
> +                               hostdev->source.subsys.u.pci.addr.domain,<br>
> +                               hostdev->source.subsys.u.pci.addr.bus,<br>
> +                               hostdev->source.subsys.u.pci.addr.slot,<br>
> +                               hostdev->source.subsys.u.pci.addr.function);<br>
> +                return -1;<br>
> +            }<br>
> +<br>
> +            virDomainHostdevInsert(vmdef, hostdev);<br>
> +            break;<br>
><br>
>          default:<br>
>              virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",<br>
> @@ -3625,6 +3777,95 @@ libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)<br>
>  }<br>
><br>
>  static int<br>
> +libxlDomainDetachHostPciDevice(libxlDomainObjPrivatePtr priv,<br>
> +                               virDomainObjPtr vm,<br>
> +                               virDomainHostdevDefPtr hostdev)<br>
> +{<br>
> +    virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;<br>
> +    libxl_device_pci pcidev;<br>
> +    virDomainHostdevDefPtr detach;<br>
> +    int idx;<br>
> +    virHostdevManagerPtr hostdev_mgr;<br>
> +<br>
> +/*    if (qemuIsMultiFunctionDevice(vm->def, detach->info)) {<br>
> +        virReportError(VIR_ERR_OPERATION_FAILED,<br>
> +                       _("cannot hot unplug multifunction PCI device: %.4x:%.2x:%.2x.%.1x"),<br>
> +                       subsys->u.pci.addr.domain, subsys->u.pci.addr.bus,<br>
> +                       subsys->u.pci.addr.slot, subsys->u.pci.addr.function);<br>
> +        goto cleanup;<br>
> +    }<br>
> +*/<br>
><br>
<br>
</div></div>Hmm, is a similar check needed in the libxl driver?  It looks to me like<br>
this is checking for other devices with same domain, bus, and slot but<br>
different function.  Isn't it possible to detach one function of a<br>
multi-function device, even if another function of the device is used by<br>
the domain?<br>
<div><div></div></div></blockquote><div><br>Not sure. Some one could explain? 
Quoted from Fedora documentation:<br>"Red Hat Enterprise Linux 6.0 and newer supports hot plugging assigned PCI devices into virtual machines. However, PCI device hot plugging operates at the slot level and 
therefore does not support multi-function PCI devices. Multi-function 
PCI devices are recommended for static device configuration only."<br></div><div>But in qemu driver, there isn't limit to ATTACH  a multi-function PCI device, only limit to DETACH.<br><br></div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><div class="h5">
> +    if (subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)<br>
> +        r eturn -1; <br>
> +<br>
> +    idx = virDomainHostdevFind(vm->def, hostdev, &detach);<br>
> +    if (idx < 0) {<br>
> +        virReportError(VIR_ERR_OPERATION_FAILED,<br>
> +                       _("host pci device %.4x:%.2x:%.2x.%.1x not found"),<br>
> +                       subsys->u.pci.addr.domain, subsys->u.pci.addr.bus,<br>
> +                       subsys->u.pci.addr.slot, subsys->u.pci.addr.function);<br>
> +        return -1;<br>
> +    }<br>
> +<br>
> +   if (libxlMakePci(detach, &pcidev) < 0)<br>
> +       goto cleanup;<br>
> +<br>
> +   if (libxl_device_pci_remove(priv->ctx, vm->def->id, &pcidev, 0) < 0) {<br>
> +        virReportError(VIR_ERR_INTERNAL_ERROR,<br>
> +                       _("libxenlight failed to detach pci device\<br>
> +                          %.4x:%.2x:%.2x.%.1x"),<br>
> +                       subsys->u.pci.addr.domain, subsys->u.pci.addr.bus,<br>
> +                       subsys->u.pci.addr.slot, subsys->u.pci.addr.function);<br>
> +        goto cleanup;<br>
> +    }<br>
> +<br>
> +    virDomainHostdevRemove(vm->def, idx);<br>
> +<br>
> +    hostdev_mgr = virHostdevManagerGetDefault();<br>
> +    virHostdevReAttachPciHostdevs(hostdev_mgr, LIBXL_DRIVER_NAME,<br>
> +                                  vm->def->name, &hostdev, 1);<br>
> +<br>
> +/*<br>
> +    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&<br>
> +        qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,<br>
> +                                        &detach->info->addr.pci) < 0)<br>
> +        VIR_WARN("Unable to release PCI address on host device");<br>
> +*/<br>
><br>
<br>
</div></div>I don't think this is needed for the libxl driver, right?</blockquote><div> Will remove.<br><br></div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  Also, does<br>
the libxl_device_pci need disposed?<br>
<div class="im"><br></div></blockquote><div> libxl_device_pci_dispose, not necessary (only does memset work) but better to keep code more readable.Will update.<br><br></div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="im">
> +<br>
> +    return 0;<br>
> +<br>
> +cleanup:<br>
> +    virDomainHostdevDefFree(detach);<br>
> +    return -1;<br>
> +}<br>
> +<br>
> +static int libxlDomainDetachHostDevice(libxlDomainObjPrivatePtr priv,<br>
> +                                       virDomainObjPtr vm,<br>
> +                                       virDomainDeviceDefPtr dev)<br>
><br>
<br>
</div>Return type and function name on different lines.<br>
<div class="im"><br>
> +{<br>
> +    virDomainHostdevDefPtr hostdev = dev->data.hostdev;<br>
> +    virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;<br>
> +<br>
> +    if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {<br>
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
> +                       _("hostdev mode '%s' not supported"),<br>
> +                       virDomainHostdevModeTypeToString(hostdev->mode));<br>
> +        return -1;<br>
> +    }<br>
> +<br>
> +    switch (subsys->type) {<br>
> +        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:<br>
> +            return libxlDomainDetachHostPciDevice(priv, vm, hostdev);<br>
><br>
<br>
</div>Line between cases.<br>
<div class="im"><br>
> +        default:<br>
> +            virReportError(VIR_ERR_INTERNAL_ERROR,<br>
> +                           _("unexpected hostdev type %d"), subsys->type);<br>
> +            break;<br>
> +    }<br>
> +<br>
> +    return -1;<br>
> +}<br>
> +<br>
> +static int<br>
>  libxlDomainDetachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,<br>
>                              virDomainDeviceDefPtr dev)<br>
>  {<br>
> @@ -3634,7 +3875,9 @@ libxlDomainDetachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,<br>
>          case VIR_DOMAIN_DEVICE_DISK:<br>
>              ret = libxlDomainDetachDeviceDiskLive(priv, vm, dev);<br>
>              break;<br>
> -<br>
><br>
<br>
</div>Spurious whitespace change.<br>
<div class="im"><br>
> +        case VIR_DOMAIN_DEVICE_HOSTDEV:<br>
> +            ret = libxlDomainDetachHostDevice(priv, vm, dev);<br>
> +            break;<br>
><br>
<br>
</div>Line between cases.<br>
<br>
Regards,<br>
Jim<br>
<div class=""><div class="h5"><br>
>          default:<br>
>              virReportError(VIR_ERR_CONFIG_UNSUPPORTED,<br>
>                             _("device type '%s' cannot be detached"),<br>
> @@ -3645,6 +3888,7 @@ libxlDomainDetachDeviceLive(libxlDomainObjPrivatePtr priv, virDomainObjPtr vm,<br>
>      return ret;<br>
>  }<br>
><br>
> +<br>
>  static int<br>
>  libxlDomainDetachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)<br>
>  {<br>
> @@ -4903,7 +5147,7 @@ libxlConnectSupportsFeature(virConnectPtr conn, int feature)<br>
><br>
>  static virDriver libxlDriver = {<br>
>      .no = VIR_DRV_LIBXL,<br>
> -    .name = "xenlight",<br>
> +    .name = LIBXL_DRIVER_NAME,<br>
>      .connectOpen = libxlConnectOpen, /* 0.9.0 */<br>
>      .connectClose = libxlConnectClose, /* 0.9.0 */<br>
>      .connectGetType = libxlConnectGetType, /* 0.9.0 */<br>
><br>
</div></div></blockquote></div><br></div></div>