OSDN Git Service

IB/mad: Use IDR for agent IDs
authorwilly@infradead.org <willy@infradead.org>
Wed, 13 Jun 2018 12:34:03 +0000 (05:34 -0700)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 18 Jun 2018 17:22:54 +0000 (11:22 -0600)
commit9a41e38a467c06a0c48369970ce5a9f790edd64d
tree382d5e0923c4a76b8884e5b1407a818b9d5986ac
parent3c60e868c31e4ff144776bf53ff0dfe9e9e4ec15
IB/mad: Use IDR for agent IDs

Allocate agent IDs from a global IDR instead of an atomic variable.
This eliminates the possibility of reusing an ID which is already in
use after 4 billion registrations.  We limit the assigned ID to be less
than 2^24 as the mlx4 driver uses the most significant byte of the agent
ID to store the slave number.  Users unlucky enough to see a collision
between agent numbers and slave numbers see messages like:

 mlx4_ib: egress mad has non-null tid msb:1 class:4 slave:0

and the MAD layer stops working.

We look up the agent under protection of the RCU lock, which means we
have to free the agent using kfree_rcu, and only increment the reference
counter if it is not 0.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
Reported-by: Hans Westgaard Ry <hans.westgaard.ry@oracle.com>
Acked-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Tested-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/mad.c
drivers/infiniband/core/mad_priv.h