diff options
author | Jason Gunthorpe <jgg@mellanox.com> | 2019-02-04 14:53:42 -0700 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2019-02-04 14:53:42 -0700 |
commit | 6a8a2aa62da2fbe51f5449993fd366398048f465 (patch) | |
tree | 566c6fcc782eefbca054af8553371d09b9d0734c /drivers/infiniband/core/device.c | |
parent | IB/core: Remove ib_sg_dma_address() and ib_sg_dma_len() (diff) | |
parent | Linux 5.0-rc5 (diff) | |
download | linux-dev-6a8a2aa62da2fbe51f5449993fd366398048f465.tar.xz linux-dev-6a8a2aa62da2fbe51f5449993fd366398048f465.zip |
Merge tag 'v5.0-rc5' into rdma.git for-next
Linux 5.0-rc5
Needed to merge the include/uapi changes so we have an up to date
single-tree for these files. Patches already posted are also expected to
need this for dependencies.
Diffstat (limited to 'drivers/infiniband/core/device.c')
-rw-r--r-- | drivers/infiniband/core/device.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index b9f725df4195..55221990d946 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -155,19 +155,26 @@ struct ib_device *ib_device_get_by_index(u32 index) down_read(&lists_rwsem); device = __ib_device_get_by_index(index); if (device) { - /* Do not return a device if unregistration has started. */ - if (!refcount_inc_not_zero(&device->refcount)) + if (!ib_device_try_get(device)) device = NULL; } up_read(&lists_rwsem); return device; } +/** + * ib_device_put - Release IB device reference + * @device: device whose reference to be released + * + * ib_device_put() releases reference to the IB device to allow it to be + * unregistered and eventually free. + */ void ib_device_put(struct ib_device *device) { if (refcount_dec_and_test(&device->refcount)) complete(&device->unreg_completion); } +EXPORT_SYMBOL(ib_device_put); static struct ib_device *__ib_device_get_by_name(const char *name) { @@ -297,7 +304,6 @@ struct ib_device *_ib_alloc_device(size_t size) rwlock_init(&device->client_data_lock); INIT_LIST_HEAD(&device->client_data_list); INIT_LIST_HEAD(&device->port_list); - refcount_set(&device->refcount, 1); init_completion(&device->unreg_completion); return device; @@ -610,6 +616,7 @@ int ib_register_device(struct ib_device *device, const char *name) goto cg_cleanup; } + refcount_set(&device->refcount, 1); device->reg_state = IB_DEV_REGISTERED; list_for_each_entry(client, &client_list, list) |