From ca39114e78e24ea234e79fd6f09815fc72761ffe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Francisco=20Trivi=C3=B1o?= Date: Wed, 13 Jul 2016 17:23:40 +0200 Subject: [PATCH] sif: sif_eq: fix missing qp->refcnt decrement for COMM_EST events MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit qp->refcnt is increased by 1 when event_status_communication_established is dispatched but later it is not decremented when handling the event work for IB_EVENT_COMM_EST for UD & RAW QP types. This commit decrements qp->refcnt for those cases too and fixes another potential bug by moving the sif_log line up before the qp->refcnt decrement. Orabug: 24288467 Signed-off-by: Francisco Triviño Reviewed-by: Håkon Bugge Reviewed-by: Knut Omang --- drivers/infiniband/hw/sif/sif_eq.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/infiniband/hw/sif/sif_eq.c b/drivers/infiniband/hw/sif/sif_eq.c index 3c0f05c4537f..b8fe6723776c 100644 --- a/drivers/infiniband/hw/sif/sif_eq.c +++ b/drivers/infiniband/hw/sif/sif_eq.c @@ -666,19 +666,23 @@ static void handle_event_work(struct work_struct *work) || (ibqp->qp_type == IB_QPT_UD) || (ibqp->qp_type == IB_QPT_RAW_IPV6) || (ibqp->qp_type == IB_QPT_RAW_ETHERTYPE) - || (ibqp->qp_type == IB_QPT_RAW_PACKET))) + || (ibqp->qp_type == IB_QPT_RAW_PACKET))) { + if (atomic_dec_and_test(&qp->refcnt)) + complete(&qp->can_destroy); break; + } - if (ibqp->event_handler) + if (ibqp->event_handler) { ibqp->event_handler(&ew->ibe, ibqp->qp_context); + } else { + sif_log(sdev, SIF_INFO, + "Unhandled event of type %s received, qp %d", + ib_event2str(ew->ibe.event), qp->qp_idx); + } if (atomic_dec_and_test(&qp->refcnt)) complete(&qp->can_destroy); - if (!ibqp->event_handler) - sif_log(sdev, SIF_INFO, - "Unhandled event of type %s received, qp %d", - ib_event2str(ew->ibe.event), qp->qp_idx); break; } case IB_EVENT_LID_CHANGE: -- 2.50.1