On Mon, Jul 24, 2023 at 02:22:05PM -0300, Jason Gunthorpe wrote:

> -void __init iommufd_test_init(void)
> +int __init iommufd_test_init(void)
>  {
> +     struct platform_device_info pdevinfo = {
> +             .name = "iommufd_selftest_iommu",
> +     };
> +     int rc;
> +
>       dbgfs_root =
>               fault_create_debugfs_attr("fail_iommufd", NULL, &fail_iommufd);
> -     WARN_ON(bus_register(&iommufd_mock_bus_type));
> +
> +     selftest_iommu_dev = platform_device_register_full(&pdevinfo);
> +     if (IS_ERR(selftest_iommu_dev)) {
> +             rc = PTR_ERR(selftest_iommu_dev);
> +             goto err_dbgfs;
> +     }
> +
> +     rc = bus_register(&iommufd_mock_bus_type.bus);
> +     if (rc)
> +             goto err_platform;
> +
> +     mock_iommu_device.dev = &selftest_iommu_dev->dev;
> +     rc = iommu_device_register_bus(&mock_iommu_device, &mock_ops,
> +                               &iommufd_mock_bus_type.bus,
> +                               &iommufd_mock_bus_type.nb);
> +     if (rc)
> +             goto err_bus;
> +     return 0;
> +
> +err_bus:
> +     bus_unregister(&iommufd_mock_bus_type.bus);
> +err_platform:
> +     platform_device_del(selftest_iommu_dev);
> +err_dbgfs:
> +     debugfs_remove_recursive(dbgfs_root);
> +     return rc;
>  }
>  
>  void iommufd_test_exit(void)
>  {
> +     iommu_device_unregister_bus(&mock_iommu_device,
> +                                 &iommufd_mock_bus_type.bus,
> +                                 &iommufd_mock_bus_type.nb);
> +     bus_unregister(&iommufd_mock_bus_type.bus);
> +     platform_device_del(selftest_iommu_dev);
>       debugfs_remove_recursive(dbgfs_root);
> -     bus_unregister(&iommufd_mock_bus_type);
>  }


There is a mistake here that started to become visible after one of
the rebases, it needs to call iommu_device_sysfs_add() prior to
iommu_device_register_bus() otherwise the iommu core stuff does not
fully initialize and weird stuff starts happening.

So, it needs this:

diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c
index 5433c9c545526d..d2b59a1157441c 100644
--- a/drivers/iommu/iommufd/selftest.c
+++ b/drivers/iommu/iommufd/selftest.c
@@ -987,14 +987,21 @@ int __init iommufd_test_init(void)
        if (rc)
                goto err_platform;
 
-       mock_iommu_device.dev = &selftest_iommu_dev->dev;
+       rc = iommu_device_sysfs_add(&mock_iommu_device,
+                                   &selftest_iommu_dev->dev, NULL, "%s",
+                                   dev_name(&selftest_iommu_dev->dev));
+       if (rc)
+               goto err_bus;
+
        rc = iommu_device_register_bus(&mock_iommu_device, &mock_ops,
                                  &iommufd_mock_bus_type.bus,
                                  &iommufd_mock_bus_type.nb);
        if (rc)
-               goto err_bus;
+               goto err_sysfs;
        return 0;
 
+err_sysfs:
+       iommu_device_sysfs_remove(&mock_iommu_device);
 err_bus:
        bus_unregister(&iommufd_mock_bus_type.bus);
 err_platform:
@@ -1006,6 +1013,7 @@ int __init iommufd_test_init(void)
 
 void iommufd_test_exit(void)
 {
+       iommu_device_sysfs_remove(&mock_iommu_device);
        iommu_device_unregister_bus(&mock_iommu_device,
                                    &iommufd_mock_bus_type.bus,
                                    &iommufd_mock_bus_type.nb);

Reply via email to