Commit 779e0bf4 authored by Jack Morgenstein's avatar Jack Morgenstein Committed by Jason Gunthorpe

RDMA/core: Do not indicate device ready when device enablement fails

In procedure ib_register_device, procedure kobject_uevent is called
(advertising that the device is ready for userspace usage) even when
device_enable_and_get() returned an error.

As a result, various RDMA modules attempted to register for the device
even while the device driver was preparing to unregister the device.

Fix this by advertising the device availability only after enabling the
device succeeds.

Fixes: e7a5b4aa ("RDMA/device: Don't fire uevent before device is fully initialized")
Link: https://lore.kernel.org/r/20201208073545.9723-3-leon@kernel.orgSuggested-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 286e1d3f
...@@ -1397,9 +1397,6 @@ int ib_register_device(struct ib_device *device, const char *name, ...@@ -1397,9 +1397,6 @@ int ib_register_device(struct ib_device *device, const char *name,
} }
ret = enable_device_and_get(device); ret = enable_device_and_get(device);
dev_set_uevent_suppress(&device->dev, false);
/* Mark for userspace that device is ready */
kobject_uevent(&device->dev.kobj, KOBJ_ADD);
if (ret) { if (ret) {
void (*dealloc_fn)(struct ib_device *); void (*dealloc_fn)(struct ib_device *);
...@@ -1419,8 +1416,12 @@ int ib_register_device(struct ib_device *device, const char *name, ...@@ -1419,8 +1416,12 @@ int ib_register_device(struct ib_device *device, const char *name,
ib_device_put(device); ib_device_put(device);
__ib_unregister_device(device); __ib_unregister_device(device);
device->ops.dealloc_driver = dealloc_fn; device->ops.dealloc_driver = dealloc_fn;
dev_set_uevent_suppress(&device->dev, false);
return ret; return ret;
} }
dev_set_uevent_suppress(&device->dev, false);
/* Mark for userspace that device is ready */
kobject_uevent(&device->dev.kobj, KOBJ_ADD);
ib_device_put(device); ib_device_put(device);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment