Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 086dc6e3 authored by Steve Wise's avatar Steve Wise Committed by Doug Ledford
Browse files

iw_cxgb4: add queue drain functions



Add completion objects, named sq_drained and rq_drained, to the c4iw_qp
struct.  The queue-specific completion object is signaled when the last
CQE is drained from the CQ for that queue.

Add c4iw_drain_sq() to block until qp->rq_drained is completed.

Add c4iw_drain_rq() to block until qp->sq_drained is completed.

Signed-off-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 765d6774
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -815,8 +815,15 @@ static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
		}
	}
out:
	if (wq)
	if (wq) {
		if (unlikely(qhp->attr.state != C4IW_QP_STATE_RTS)) {
			if (t4_sq_empty(wq))
				complete(&qhp->sq_drained);
			if (t4_rq_empty(wq))
				complete(&qhp->rq_drained);
		}
		spin_unlock(&qhp->lock);
	}
	return ret;
}

+4 −0
Original line number Diff line number Diff line
@@ -476,6 +476,8 @@ struct c4iw_qp {
	wait_queue_head_t wait;
	struct timer_list timer;
	int sq_sig_all;
	struct completion rq_drained;
	struct completion sq_drained;
};

static inline struct c4iw_qp *to_c4iw_qp(struct ib_qp *ibqp)
@@ -1016,6 +1018,8 @@ extern int c4iw_wr_log;
extern int db_fc_threshold;
extern int db_coalescing_threshold;
extern int use_dsgl;
void c4iw_drain_rq(struct ib_qp *qp);
void c4iw_drain_sq(struct ib_qp *qp);


#endif
+2 −0
Original line number Diff line number Diff line
@@ -564,6 +564,8 @@ int c4iw_register_device(struct c4iw_dev *dev)
	dev->ibdev.get_protocol_stats = c4iw_get_mib;
	dev->ibdev.uverbs_abi_ver = C4IW_UVERBS_ABI_VERSION;
	dev->ibdev.get_port_immutable = c4iw_port_immutable;
	dev->ibdev.drain_sq = c4iw_drain_sq;
	dev->ibdev.drain_rq = c4iw_drain_rq;

	dev->ibdev.iwcm = kmalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL);
	if (!dev->ibdev.iwcm)
+16 −0
Original line number Diff line number Diff line
@@ -1697,6 +1697,8 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
	qhp->attr.max_ird = 0;
	qhp->sq_sig_all = attrs->sq_sig_type == IB_SIGNAL_ALL_WR;
	spin_lock_init(&qhp->lock);
	init_completion(&qhp->sq_drained);
	init_completion(&qhp->rq_drained);
	mutex_init(&qhp->mutex);
	init_waitqueue_head(&qhp->wait);
	atomic_set(&qhp->refcnt, 1);
@@ -1888,3 +1890,17 @@ int c4iw_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
	init_attr->sq_sig_type = qhp->sq_sig_all ? IB_SIGNAL_ALL_WR : 0;
	return 0;
}

void c4iw_drain_sq(struct ib_qp *ibqp)
{
	struct c4iw_qp *qp = to_c4iw_qp(ibqp);

	wait_for_completion(&qp->sq_drained);
}

void c4iw_drain_rq(struct ib_qp *ibqp)
{
	struct c4iw_qp *qp = to_c4iw_qp(ibqp);

	wait_for_completion(&qp->rq_drained);
}