diff options
author | 2024-02-02 19:53:13 -0800 | |
---|---|---|
committer | 2024-02-21 13:15:50 -0400 | |
commit | 7a8bccd8b29c321ac181369b42b04fecf05f98e2 (patch) | |
tree | b5a9e30e0fabc7f435288d3143931fcff0d05727 /drivers/media/common/siano/smsdvb-main.c | |
parent | RDMA/hns: Fix mis-modifying default congestion control algorithm (diff) | |
download | linux-7a8bccd8b29c321ac181369b42b04fecf05f98e2.tar.gz linux-7a8bccd8b29c321ac181369b42b04fecf05f98e2.tar.bz2 linux-7a8bccd8b29c321ac181369b42b04fecf05f98e2.zip |
RDMA/device: Fix a race between mad_client and cm_client init
The mad_client will be initialized in enable_device_and_get(), while the
devices_rwsem will be downgraded to a read semaphore. There is a window
that leads to the failed initialization for cm_client, since it can not
get matched mad port from ib_mad_port_list, and the matched mad port will
be added to the list after that.
mad_client | cm_client
------------------|--------------------------------------------------------
ib_register_device|
enable_device_and_get
down_write(&devices_rwsem)
xa_set_mark(&devices, DEVICE_REGISTERED)
downgrade_write(&devices_rwsem)
|
|ib_cm_init
|ib_register_client(&cm_client)
|down_read(&devices_rwsem)
|xa_for_each_marked (&devices, DEVICE_REGISTERED)
|add_client_context
|cm_add_one
|ib_register_mad_agent
|ib_get_mad_port
|__ib_get_mad_port
|list_for_each_entry(entry, &ib_mad_port_list, port_list)
|return NULL
|up_read(&devices_rwsem)
|
add_client_context|
ib_mad_init_device|
ib_mad_port_open |
list_add_tail(&port_priv->port_list, &ib_mad_port_list)
up_read(&devices_rwsem)
|
Fix it by using down_write(&devices_rwsem) in ib_register_client().
Fixes: d0899892edd0 ("RDMA/device: Provide APIs from the core code to help unregistration")
Link: https://lore.kernel.org/r/20240203035313.98991-1-lishifeng@sangfor.com.cn
Suggested-by: Jason Gunthorpe <jgg@ziepe.ca>
Signed-off-by: Shifeng Li <lishifeng@sangfor.com.cn>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'drivers/media/common/siano/smsdvb-main.c')
0 files changed, 0 insertions, 0 deletions