Commit 119181d1 authored by Leon Romanovsky's avatar Leon Romanovsky Committed by Jason Gunthorpe
Browse files

RDMA: Restore ability to fail on SRQ destroy

In similar way to other IB objects, restore the ability to return error on
SRQ destroy. Strictly speaking, this change is not necessary, and provided
here to ensure a symmetrical interface like other destroy functions.

Fixes: 68e326de ("RDMA: Handle SRQ allocations by IB/core")
Link: https://lore.kernel.org/r/20200907120921.476363-5-leon@kernel.org


Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent fd89099d
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -1068,10 +1068,14 @@ EXPORT_SYMBOL(ib_query_srq);


int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata)
int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata)
{
{
	int ret;

	if (atomic_read(&srq->usecnt))
	if (atomic_read(&srq->usecnt))
		return -EBUSY;
		return -EBUSY;


	srq->device->ops.destroy_srq(srq, udata);
	ret = srq->device->ops.destroy_srq(srq, udata);
	if (ret)
		return ret;


	atomic_dec(&srq->pd->usecnt);
	atomic_dec(&srq->pd->usecnt);
	if (srq->srq_type == IB_SRQT_XRC)
	if (srq->srq_type == IB_SRQT_XRC)
@@ -1080,7 +1084,7 @@ int ib_destroy_srq_user(struct ib_srq *srq, struct ib_udata *udata)
		atomic_dec(&srq->ext.cq->usecnt);
		atomic_dec(&srq->ext.cq->usecnt);
	kfree(srq);
	kfree(srq);


	return 0;
	return ret;
}
}
EXPORT_SYMBOL(ib_destroy_srq_user);
EXPORT_SYMBOL(ib_destroy_srq_user);


+2 −1
Original line number Original line Diff line number Diff line
@@ -1570,7 +1570,7 @@ static enum ib_mtu __to_ib_mtu(u32 mtu)
}
}


/* Shared Receive Queues */
/* Shared Receive Queues */
void bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
int bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
{
{
	struct bnxt_re_srq *srq = container_of(ib_srq, struct bnxt_re_srq,
	struct bnxt_re_srq *srq = container_of(ib_srq, struct bnxt_re_srq,
					       ib_srq);
					       ib_srq);
@@ -1585,6 +1585,7 @@ void bnxt_re_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata)
	atomic_dec(&rdev->srq_count);
	atomic_dec(&rdev->srq_count);
	if (nq)
	if (nq)
		nq->budget--;
		nq->budget--;
	return 0;
}
}


static int bnxt_re_init_user_srq(struct bnxt_re_dev *rdev,
static int bnxt_re_init_user_srq(struct bnxt_re_dev *rdev,
+1 −1
Original line number Original line Diff line number Diff line
@@ -176,7 +176,7 @@ int bnxt_re_modify_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr,
		       enum ib_srq_attr_mask srq_attr_mask,
		       enum ib_srq_attr_mask srq_attr_mask,
		       struct ib_udata *udata);
		       struct ib_udata *udata);
int bnxt_re_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
int bnxt_re_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
void bnxt_re_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
int bnxt_re_destroy_srq(struct ib_srq *srq, struct ib_udata *udata);
int bnxt_re_post_srq_recv(struct ib_srq *srq, const struct ib_recv_wr *recv_wr,
int bnxt_re_post_srq_recv(struct ib_srq *srq, const struct ib_recv_wr *recv_wr,
			  const struct ib_recv_wr **bad_recv_wr);
			  const struct ib_recv_wr **bad_recv_wr);
struct ib_qp *bnxt_re_create_qp(struct ib_pd *pd,
struct ib_qp *bnxt_re_create_qp(struct ib_pd *pd,
+1 −1
Original line number Original line Diff line number Diff line
@@ -999,7 +999,7 @@ int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags);
int c4iw_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *attr,
int c4iw_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *attr,
		    enum ib_srq_attr_mask srq_attr_mask,
		    enum ib_srq_attr_mask srq_attr_mask,
		    struct ib_udata *udata);
		    struct ib_udata *udata);
void c4iw_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata);
int c4iw_destroy_srq(struct ib_srq *ib_srq, struct ib_udata *udata);
int c4iw_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *attrs,
int c4iw_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *attrs,
		    struct ib_udata *udata);
		    struct ib_udata *udata);
int c4iw_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata);
int c4iw_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata);
+2 −1
Original line number Original line Diff line number Diff line
@@ -2797,7 +2797,7 @@ int c4iw_create_srq(struct ib_srq *ib_srq, struct ib_srq_init_attr *attrs,
	return ret;
	return ret;
}
}


void c4iw_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
int c4iw_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
{
{
	struct c4iw_dev *rhp;
	struct c4iw_dev *rhp;
	struct c4iw_srq *srq;
	struct c4iw_srq *srq;
@@ -2813,4 +2813,5 @@ void c4iw_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
		       srq->wr_waitp);
		       srq->wr_waitp);
	c4iw_free_srq_idx(&rhp->rdev, srq->idx);
	c4iw_free_srq_idx(&rhp->rdev, srq->idx);
	c4iw_put_wr_wait(srq->wr_waitp);
	c4iw_put_wr_wait(srq->wr_waitp);
	return 0;
}
}
Loading