Skip to content

Commit

Permalink
RDMA/cma: Remove cma_comp()
Browse files Browse the repository at this point in the history
The only place that still uses it is rdma_join_multicast() which is only
doing a sanity check that the caller hasn't done something wrong and
doesn't need the spinlock.

At least in the case of rdma_join_multicast() the information it needs
will remain until the ID is destroyed once it enters these
states. Similarly there is no reason to check for these specific states in
the handler callback, instead use the usual check for a destroyed id under
the handler_mutex.

Link: https://lore.kernel.org/r/20200902081122.745412-5-leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
  • Loading branch information
Jason Gunthorpe committed Sep 17, 2020
1 parent d490ee5 commit 5cfbf92
Showing 1 changed file with 7 additions and 20 deletions.
27 changes: 7 additions & 20 deletions drivers/infiniband/core/cma.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,17 +404,6 @@ struct cma_req_info {
u16 pkey;
};

static int cma_comp(struct rdma_id_private *id_priv, enum rdma_cm_state comp)
{
unsigned long flags;
int ret;

spin_lock_irqsave(&id_priv->lock, flags);
ret = (id_priv->state == comp);
spin_unlock_irqrestore(&id_priv->lock, flags);
return ret;
}

static int cma_comp_exch(struct rdma_id_private *id_priv,
enum rdma_cm_state comp, enum rdma_cm_state exch)
{
Expand Down Expand Up @@ -4363,8 +4352,8 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)

id_priv = mc->id_priv;
mutex_lock(&id_priv->handler_mutex);
if (id_priv->state != RDMA_CM_ADDR_BOUND &&
id_priv->state != RDMA_CM_ADDR_RESOLVED)
if (READ_ONCE(id_priv->state) == RDMA_CM_DEVICE_REMOVAL ||
READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING)
goto out;

if (!status)
Expand Down Expand Up @@ -4630,16 +4619,14 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv,
int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,
u8 join_state, void *context)
{
struct rdma_id_private *id_priv;
struct rdma_id_private *id_priv =
container_of(id, struct rdma_id_private, id);
struct cma_multicast *mc;
int ret;

if (!id->device)
return -EINVAL;

id_priv = container_of(id, struct rdma_id_private, id);
if (!cma_comp(id_priv, RDMA_CM_ADDR_BOUND) &&
!cma_comp(id_priv, RDMA_CM_ADDR_RESOLVED))
/* ULP is calling this wrong. */
if (!id->device || (READ_ONCE(id_priv->state) != RDMA_CM_ADDR_BOUND &&
READ_ONCE(id_priv->state) != RDMA_CM_ADDR_RESOLVED))
return -EINVAL;

mc = kmalloc(sizeof *mc, GFP_KERNEL);
Expand Down

0 comments on commit 5cfbf92

Please sign in to comment.