mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 17:41:44 +00:00
IB/hfi1: Convert hfi1_error_port_qps() to use new QP iterator
Change hfi1_error_port_qps() to use the new rvt_qp_iter() in its QP scanning. Reviewed-by: Kaike Wan <kaike.wan@intel.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
4734b4f417
commit
dff2fe7e8c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright(c) 2015, 2016 Intel Corporation.
|
||||
* Copyright(c) 2015 - 2017 Intel Corporation.
|
||||
*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
@ -869,6 +869,45 @@ void notify_error_qp(struct rvt_qp *qp)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* hfi1_qp_iter_cb - callback for iterator
|
||||
* @qp - the qp
|
||||
* @v - the sl in low bits of v
|
||||
*
|
||||
* This is called from the iterator callback to work
|
||||
* on an individual qp.
|
||||
*/
|
||||
static void hfi1_qp_iter_cb(struct rvt_qp *qp, u64 v)
|
||||
{
|
||||
int lastwqe;
|
||||
struct ib_event ev;
|
||||
struct hfi1_ibport *ibp =
|
||||
to_iport(qp->ibqp.device, qp->port_num);
|
||||
struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
|
||||
u8 sl = (u8)v;
|
||||
|
||||
if (qp->port_num != ppd->port ||
|
||||
(qp->ibqp.qp_type != IB_QPT_UC &&
|
||||
qp->ibqp.qp_type != IB_QPT_RC) ||
|
||||
rdma_ah_get_sl(&qp->remote_ah_attr) != sl ||
|
||||
!(ib_rvt_state_ops[qp->state] & RVT_POST_SEND_OK))
|
||||
return;
|
||||
|
||||
spin_lock_irq(&qp->r_lock);
|
||||
spin_lock(&qp->s_hlock);
|
||||
spin_lock(&qp->s_lock);
|
||||
lastwqe = rvt_error_qp(qp, IB_WC_WR_FLUSH_ERR);
|
||||
spin_unlock(&qp->s_lock);
|
||||
spin_unlock(&qp->s_hlock);
|
||||
spin_unlock_irq(&qp->r_lock);
|
||||
if (lastwqe) {
|
||||
ev.device = qp->ibqp.device;
|
||||
ev.element.qp = &qp->ibqp;
|
||||
ev.event = IB_EVENT_QP_LAST_WQE_REACHED;
|
||||
qp->ibqp.event_handler(&ev, qp->ibqp.qp_context);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* hfi1_error_port_qps - put a port's RC/UC qps into error state
|
||||
* @ibp: the ibport.
|
||||
@ -880,44 +919,8 @@ void notify_error_qp(struct rvt_qp *qp)
|
||||
*/
|
||||
void hfi1_error_port_qps(struct hfi1_ibport *ibp, u8 sl)
|
||||
{
|
||||
struct rvt_qp *qp = NULL;
|
||||
struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
|
||||
struct hfi1_ibdev *dev = &ppd->dd->verbs_dev;
|
||||
int n;
|
||||
int lastwqe;
|
||||
struct ib_event ev;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
/* Deal only with RC/UC qps that use the given SL. */
|
||||
for (n = 0; n < dev->rdi.qp_dev->qp_table_size; n++) {
|
||||
for (qp = rcu_dereference(dev->rdi.qp_dev->qp_table[n]); qp;
|
||||
qp = rcu_dereference(qp->next)) {
|
||||
if (qp->port_num == ppd->port &&
|
||||
(qp->ibqp.qp_type == IB_QPT_UC ||
|
||||
qp->ibqp.qp_type == IB_QPT_RC) &&
|
||||
rdma_ah_get_sl(&qp->remote_ah_attr) == sl &&
|
||||
(ib_rvt_state_ops[qp->state] &
|
||||
RVT_POST_SEND_OK)) {
|
||||
spin_lock_irq(&qp->r_lock);
|
||||
spin_lock(&qp->s_hlock);
|
||||
spin_lock(&qp->s_lock);
|
||||
lastwqe = rvt_error_qp(qp,
|
||||
IB_WC_WR_FLUSH_ERR);
|
||||
spin_unlock(&qp->s_lock);
|
||||
spin_unlock(&qp->s_hlock);
|
||||
spin_unlock_irq(&qp->r_lock);
|
||||
if (lastwqe) {
|
||||
ev.device = qp->ibqp.device;
|
||||
ev.element.qp = &qp->ibqp;
|
||||
ev.event =
|
||||
IB_EVENT_QP_LAST_WQE_REACHED;
|
||||
qp->ibqp.event_handler(&ev,
|
||||
qp->ibqp.qp_context);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
rvt_qp_iter(&dev->rdi, sl, hfi1_qp_iter_cb);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user