IB/ehca: Filter PATH_MIG events if QP was never armed
Certain firmware versions sometimes cause spurious PATH_MIG events to occur during QP creation. Filter these events by making sure PATH_MIG events are only handed down when they actually make sense (i.e. when the QP has been armed at least once). Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
d35cb360c2
commit
5b673b71c8
|
@ -194,6 +194,7 @@ struct ehca_qp {
|
||||||
u32 packet_count;
|
u32 packet_count;
|
||||||
atomic_t nr_events; /* events seen */
|
atomic_t nr_events; /* events seen */
|
||||||
wait_queue_head_t wait_completion;
|
wait_queue_head_t wait_completion;
|
||||||
|
int mig_armed;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IS_SRQ(qp) (qp->ext_type == EQPT_SRQ)
|
#define IS_SRQ(qp) (qp->ext_type == EQPT_SRQ)
|
||||||
|
|
|
@ -178,6 +178,10 @@ static void dispatch_qp_event(struct ehca_shca *shca, struct ehca_qp *qp,
|
||||||
{
|
{
|
||||||
struct ib_event event;
|
struct ib_event event;
|
||||||
|
|
||||||
|
/* PATH_MIG without the QP ever having been armed is false alarm */
|
||||||
|
if (event_type == IB_EVENT_PATH_MIG && !qp->mig_armed)
|
||||||
|
return;
|
||||||
|
|
||||||
event.device = &shca->ib_device;
|
event.device = &shca->ib_device;
|
||||||
event.event = event_type;
|
event.event = event_type;
|
||||||
|
|
||||||
|
|
|
@ -1460,6 +1460,8 @@ static int internal_modify_qp(struct ib_qp *ibqp,
|
||||||
goto modify_qp_exit2;
|
goto modify_qp_exit2;
|
||||||
}
|
}
|
||||||
mqpcb->path_migration_state = attr->path_mig_state + 1;
|
mqpcb->path_migration_state = attr->path_mig_state + 1;
|
||||||
|
if (attr->path_mig_state == IB_MIG_REARM)
|
||||||
|
my_qp->mig_armed = 1;
|
||||||
update_mask |=
|
update_mask |=
|
||||||
EHCA_BMASK_SET(MQPCB_MASK_PATH_MIGRATION_STATE, 1);
|
EHCA_BMASK_SET(MQPCB_MASK_PATH_MIGRATION_STATE, 1);
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue