lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 396/717] RDMA/core: Do not indicate device ready when device enablement fails
    Date
    From: Jack Morgenstein <jackm@dev.mellanox.co.il>

    [ Upstream commit 779e0bf47632c609c59f527f9711ecd3214dccb0 ]

    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: e7a5b4aafd82 ("RDMA/device: Don't fire uevent before device is fully initialized")
    Link: https://lore.kernel.org/r/20201208073545.9723-3-leon@kernel.org
    Suggested-by: Leon Romanovsky <leonro@mellanox.com>
    Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/core/device.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

    diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
    index a3b1fc84cdcab..4a041511b70ec 100644
    --- a/drivers/infiniband/core/device.c
    +++ b/drivers/infiniband/core/device.c
    @@ -1374,9 +1374,6 @@ int ib_register_device(struct ib_device *device, const char *name,
    }

    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) {
    void (*dealloc_fn)(struct ib_device *);

    @@ -1396,8 +1393,12 @@ int ib_register_device(struct ib_device *device, const char *name,
    ib_device_put(device);
    __ib_unregister_device(device);
    device->ops.dealloc_driver = dealloc_fn;
    + dev_set_uevent_suppress(&device->dev, false);
    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);

    return 0;
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 15:54    [W:2.021 / U:0.628 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site