| From foo@baz Sun Jun 17 12:07:34 CEST 2018 |
| From: "Håkon Bugge" <haakon.bugge@oracle.com> |
| Date: Wed, 18 Apr 2018 16:24:50 +0200 |
| Subject: IB/core: Make ib_mad_client_id atomic |
| |
| From: "Håkon Bugge" <haakon.bugge@oracle.com> |
| |
| [ Upstream commit db82476f37413eaeff5f836a9d8b022d6544accf ] |
| |
| Currently, the kernel protects access to the agent ID allocator on a per |
| port basis using a spinlock, so it is impossible for two apps/threads on |
| the same port to get the same TID, but it is entirely possible for two |
| threads on different ports to end up with the same TID. |
| |
| As this can be confusing (regardless of it being legal according to the |
| IB Spec 1.3, C13-18.1.1, in section 13.4.6.4 - TransactionID usage), |
| and as the rdma-core user space API for /dev/umad devices implies unique |
| TIDs even across ports, make the TID an atomic type so that no two |
| allocations, regardless of port number, will be the same. |
| |
| Signed-off-by: Håkon Bugge <haakon.bugge@oracle.com> |
| Reviewed-by: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Reviewed-by: Ira Weiny <ira.weiny@intel.com> |
| Reviewed-by: Zhu Yanjun <yanjun.zhu@oracle.com> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/infiniband/core/mad.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/infiniband/core/mad.c |
| +++ b/drivers/infiniband/core/mad.c |
| @@ -59,7 +59,7 @@ module_param_named(recv_queue_size, mad_ |
| MODULE_PARM_DESC(recv_queue_size, "Size of receive queue in number of work requests"); |
| |
| static struct list_head ib_mad_port_list; |
| -static u32 ib_mad_client_id = 0; |
| +static atomic_t ib_mad_client_id = ATOMIC_INIT(0); |
| |
| /* Port list lock */ |
| static DEFINE_SPINLOCK(ib_mad_port_list_lock); |
| @@ -377,7 +377,7 @@ struct ib_mad_agent *ib_register_mad_age |
| } |
| |
| spin_lock_irqsave(&port_priv->reg_lock, flags); |
| - mad_agent_priv->agent.hi_tid = ++ib_mad_client_id; |
| + mad_agent_priv->agent.hi_tid = atomic_inc_return(&ib_mad_client_id); |
| |
| /* |
| * Make sure MAD registration (if supplied) |