Skip to content

Commit db82476

Browse files
Hakon-Buggedledford
authored andcommitted
IB/core: Make ib_mad_client_id atomic
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 <[email protected]> Reviewed-by: Jack Morgenstein <[email protected]> Reviewed-by: Ira Weiny <[email protected]> Reviewed-by: Zhu Yanjun <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent 2df19e1 commit db82476

File tree

1 file changed

+2
-2
lines changed
  • drivers/infiniband/core

1 file changed

+2
-2
lines changed

drivers/infiniband/core/mad.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ module_param_named(recv_queue_size, mad_recvq_size, int, 0444);
5959
MODULE_PARM_DESC(recv_queue_size, "Size of receive queue in number of work requests");
6060

6161
static struct list_head ib_mad_port_list;
62-
static u32 ib_mad_client_id = 0;
62+
static atomic_t ib_mad_client_id = ATOMIC_INIT(0);
6363

6464
/* Port list lock */
6565
static DEFINE_SPINLOCK(ib_mad_port_list_lock);
@@ -377,7 +377,7 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
377377
}
378378

379379
spin_lock_irqsave(&port_priv->reg_lock, flags);
380-
mad_agent_priv->agent.hi_tid = ++ib_mad_client_id;
380+
mad_agent_priv->agent.hi_tid = atomic_inc_return(&ib_mad_client_id);
381381

382382
/*
383383
* Make sure MAD registration (if supplied)

0 commit comments

Comments
 (0)