[libvirt] [PATCH 12/18] virpcimock: Create PCI devices under /sys/devices/pci*

Michal Privoznik posted 18 patches 6 years, 5 months ago
[libvirt] [PATCH 12/18] virpcimock: Create PCI devices under /sys/devices/pci*
Posted by Michal Privoznik 6 years, 5 months ago
So far, we are creating devices directly under
/sys/bus/pci/devices/*. There is not much problem with it, but if
we really want to model kernel behaviour we need to create them
under /sys/devices/pciDDDD:BB and then only symlink them from the
old location.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 tests/virpcimock.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/tests/virpcimock.c b/tests/virpcimock.c
index c10764dcdd..0774bf62d9 100644
--- a/tests/virpcimock.c
+++ b/tests/virpcimock.c
@@ -383,12 +383,17 @@ pci_device_get_path(const struct pciDevice *dev,
     if (!(devid = pci_address_format(&dev->addr)))
         return NULL;
 
+    /* PCI devices really do live under /sys/devices/pciDDDD:BB
+     * and then they are just symlinked to /sys/bus/pci/devices/
+     */
     if (file) {
-        ignore_value(virAsprintfQuiet(&ret, "%s" SYSFS_PCI_PREFIX "devices/%s/%s",
-                                      prefix, devid, file));
+        ignore_value(virAsprintfQuiet(&ret, "%s/sys/devices/pci%04x:%02x/%s/%s",
+                                      prefix, dev->addr.domain, dev->addr.bus,
+                                      devid, file));
     } else {
-        ignore_value(virAsprintfQuiet(&ret, "%s" SYSFS_PCI_PREFIX "devices/%s",
-                                      prefix, devid));
+        ignore_value(virAsprintfQuiet(&ret, "%s/sys/devices/pci%04x:%02x/%s",
+                                      prefix, dev->addr.domain, dev->addr.bus,
+                                      devid));
     }
 
     return ret;
@@ -400,6 +405,7 @@ pci_device_new_from_stub(const struct pciDevice *data)
 {
     struct pciDevice *dev;
     VIR_AUTOFREE(char *) devpath = NULL;
+    VIR_AUTOFREE(char *) devsympath = NULL;
     VIR_AUTOFREE(char *) id = NULL;
     VIR_AUTOFREE(char *) devid = NULL;
     char *c;
@@ -488,6 +494,17 @@ pci_device_new_from_stub(const struct pciDevice *data)
     }
     make_symlink(devpath, "iommu_group", tmp);
 
+    if (snprintf(tmp, sizeof(tmp),
+                 "../../../devices/pci%04x:%02x/%s",
+                 dev->addr.domain, dev->addr.bus, devid) < 0) {
+        ABORT("@tmp overflow");
+    }
+
+    if (virAsprintfQuiet(&devsympath, "%s" SYSFS_PCI_PREFIX "devices", fakerootdir) < 0)
+        ABORT_OOM();
+
+    make_symlink(devsympath, devid, tmp);
+
     if (pci_device_autobind(dev) < 0)
         ABORT("Unable to bind: %s", devid);
 
-- 
2.21.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 12/18] virpcimock: Create PCI devices under /sys/devices/pci*
Posted by Daniel Henrique Barboza 6 years, 5 months ago
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>

On 8/14/19 8:57 AM, Michal Privoznik wrote:
> So far, we are creating devices directly under
> /sys/bus/pci/devices/*. There is not much problem with it, but if
> we really want to model kernel behaviour we need to create them
> under /sys/devices/pciDDDD:BB and then only symlink them from the
> old location.
>
> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>   tests/virpcimock.c | 25 +++++++++++++++++++++----
>   1 file changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/tests/virpcimock.c b/tests/virpcimock.c
> index c10764dcdd..0774bf62d9 100644
> --- a/tests/virpcimock.c
> +++ b/tests/virpcimock.c
> @@ -383,12 +383,17 @@ pci_device_get_path(const struct pciDevice *dev,
>       if (!(devid = pci_address_format(&dev->addr)))
>           return NULL;
>   
> +    /* PCI devices really do live under /sys/devices/pciDDDD:BB
> +     * and then they are just symlinked to /sys/bus/pci/devices/
> +     */
>       if (file) {
> -        ignore_value(virAsprintfQuiet(&ret, "%s" SYSFS_PCI_PREFIX "devices/%s/%s",
> -                                      prefix, devid, file));
> +        ignore_value(virAsprintfQuiet(&ret, "%s/sys/devices/pci%04x:%02x/%s/%s",
> +                                      prefix, dev->addr.domain, dev->addr.bus,
> +                                      devid, file));
>       } else {
> -        ignore_value(virAsprintfQuiet(&ret, "%s" SYSFS_PCI_PREFIX "devices/%s",
> -                                      prefix, devid));
> +        ignore_value(virAsprintfQuiet(&ret, "%s/sys/devices/pci%04x:%02x/%s",
> +                                      prefix, dev->addr.domain, dev->addr.bus,
> +                                      devid));
>       }
>   
>       return ret;
> @@ -400,6 +405,7 @@ pci_device_new_from_stub(const struct pciDevice *data)
>   {
>       struct pciDevice *dev;
>       VIR_AUTOFREE(char *) devpath = NULL;
> +    VIR_AUTOFREE(char *) devsympath = NULL;
>       VIR_AUTOFREE(char *) id = NULL;
>       VIR_AUTOFREE(char *) devid = NULL;
>       char *c;
> @@ -488,6 +494,17 @@ pci_device_new_from_stub(const struct pciDevice *data)
>       }
>       make_symlink(devpath, "iommu_group", tmp);
>   
> +    if (snprintf(tmp, sizeof(tmp),
> +                 "../../../devices/pci%04x:%02x/%s",
> +                 dev->addr.domain, dev->addr.bus, devid) < 0) {
> +        ABORT("@tmp overflow");
> +    }
> +
> +    if (virAsprintfQuiet(&devsympath, "%s" SYSFS_PCI_PREFIX "devices", fakerootdir) < 0)
> +        ABORT_OOM();
> +
> +    make_symlink(devsympath, devid, tmp);
> +
>       if (pci_device_autobind(dev) < 0)
>           ABORT("Unable to bind: %s", devid);
>   

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list