[libvirt] [PATCH] qemu: ignore EACCES error on hot unplug of PCI devices with VFIO

John Ferlan jferlan at redhat.com
Mon Mar 28 11:52:52 UTC 2016



On 03/07/2016 09:20 AM, Kothapally Madhu Pavan wrote:
> When the hostdev managed=true, the VFIO devices are reattached
> to the host driver before coming to qemuTeardownHostdevCgroup().
> So, the /dev/vfio/<iommu> path would not exist. We ignore the
> EACCES error here.
> 
> Signed-off-by: Kothapally Madhu Pavan <kmp at linux.vnet.ibm.com>
> ---
>  src/qemu/qemu_cgroup.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 

Can you show the error in the system log that you get when/if this
fails?  Using EACCES implies to a permission error. The check in
virCgroupDenyDevicePath is:

   if (stat(path, &sb) < 0) {
        if (errno == EACCES && ignoreEacces)
            return 1;

        virReportSystemError(errno,
                             _("Path '%s' is not accessible"),
                             path);
       return -1;
    }

If the path doesn't exist, then it should be a different error message
(ENOENT perhaps).

My other question would be, if you follow the attachment path, you'll
see that if qemuHostdevPreparePCIDevices is successfully called, then
qemuSetupHostdevCgroup is called after (and virCgroupAllowDevicePath is
called).

So, shouldn't the corollary be qemuTeardownHostdevCgroup followed by
device reattachment.  IOW:

e.g, move the qemuTeardownHostdevCgroup in qemuDomainRemoveHostDevice to
before the switch to qemuDomainRemove*HostDevice?  I'd even think the
StoreHostdevLabel call could move. None of the calls would head into an
error path...

I've posted a couple of patches which do this, see:

http://www.redhat.com/archives/libvir-list/2016-March/msg01270.html

John
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index c76d585..2850346 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -427,7 +427,7 @@ qemuTeardownHostdevCgroup(virDomainObjPtr vm,
>  
>                  VIR_DEBUG("Cgroup deny %s for PCI device assignment", path);
>                  rv = virCgroupDenyDevicePath(priv->cgroup, path,
> -                                             VIR_CGROUP_DEVICE_RWM, false);
> +                                             VIR_CGROUP_DEVICE_RWM, dev->managed);
>                  virDomainAuditCgroupPath(vm, priv->cgroup,
>                                           "deny", path, "rwm", rv == 0);
>                  if (rv < 0)
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 




More information about the libvir-list mailing list