diff mbox

RDMA/cxgb4: Make c4iw_poll_cq_one() easier to analyze

Message ID 20180706172827.20488-1-bart.vanassche@wdc.com (mailing list archive)
State Accepted
Delegated to: Jason Gunthorpe
Headers show

Commit Message

Bart Van Assche July 6, 2018, 5:28 p.m. UTC
Introduce the function __c4iw_poll_cq_one() such that c4iw_poll_cq_one()
becomes easier to analyze for static source code analyzers. This patch
avoids that sparse reports the following:

drivers/infiniband/hw/cxgb4/cq.c:401:36: warning: context imbalance in 'c4iw_flush_hw_cq' - unexpected unlock
drivers/infiniband/hw/cxgb4/cq.c:824:9: warning: context imbalance in 'c4iw_poll_cq_one' - different lock contexts for basic block

Compile-tested only.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: Steve Wise <swise@chelsio.com>
---
 drivers/infiniband/hw/cxgb4/cq.c | 62 ++++++++++++++++++--------------
 1 file changed, 35 insertions(+), 27 deletions(-)

Comments

Steve Wise July 9, 2018, 3:49 p.m. UTC | #1
On 7/6/2018 12:28 PM, Bart Van Assche wrote:
> Introduce the function __c4iw_poll_cq_one() such that c4iw_poll_cq_one()
> becomes easier to analyze for static source code analyzers. This patch
> avoids that sparse reports the following:
>
> drivers/infiniband/hw/cxgb4/cq.c:401:36: warning: context imbalance in 'c4iw_flush_hw_cq' - unexpected unlock
> drivers/infiniband/hw/cxgb4/cq.c:824:9: warning: context imbalance in 'c4iw_poll_cq_one' - different lock contexts for basic block
>
> Compile-tested only.
>
> Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
> Cc: Steve Wise <swise@chelsio.com>
> ---
>  drivers/infiniband/hw/cxgb4/cq.c | 62 ++++++++++++++++++--------------
>  1 file changed, 35 insertions(+), 27 deletions(-)

Acked-by: Steve Wise <swise@opengridcomputing.com>

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jason Gunthorpe July 9, 2018, 7:06 p.m. UTC | #2
On Fri, Jul 06, 2018 at 10:28:27AM -0700, Bart Van Assche wrote:
> Introduce the function __c4iw_poll_cq_one() such that c4iw_poll_cq_one()
> becomes easier to analyze for static source code analyzers. This patch
> avoids that sparse reports the following:
> 
> drivers/infiniband/hw/cxgb4/cq.c:401:36: warning: context imbalance in 'c4iw_flush_hw_cq' - unexpected unlock
> drivers/infiniband/hw/cxgb4/cq.c:824:9: warning: context imbalance in 'c4iw_poll_cq_one' - different lock contexts for basic block
> 
> Compile-tested only.
> 
> Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
> Cc: Steve Wise <swise@chelsio.com>
>  drivers/infiniband/hw/cxgb4/cq.c | 62 ++++++++++++++++++--------------
>  1 file changed, 35 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
> index 2be2e1ac1b5f..8426e74c6964 100644
> +++ b/drivers/infiniband/hw/cxgb4/cq.c
> @@ -668,43 +668,22 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq, struct t4_cqe *cqe,
>  	return ret;
>  }
>  
> -/*
> - * Get one cq entry from c4iw and map it to openib.
> - *
> - * Returns:
> - *	0			cqe returned
> - *	-ENODATA		EMPTY;
> - *	-EAGAIN			caller must try again
> - *	any other -errno	fatal error
> - */
> -static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
> +static int __c4iw_poll_cq_one(struct c4iw_cq *chp, struct c4iw_qp *qhp,
> +			      struct ib_wc *wc)
>  {
> -	struct c4iw_qp *qhp = NULL;
> -	struct t4_cqe uninitialized_var(cqe), *rd_cqe;
> -	struct t4_wq *wq;
> +	struct t4_cqe uninitialized_var(cqe);

This uninitialized_var isn't needed these days
>  
> @@ -819,8 +798,37 @@ static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
>  		}
>  	}
>  out:
> -	if (wq)
> +	return ret;
> +}
> +
> +/*
> + * Get one cq entry from c4iw and map it to openib.
> + *
> + * Returns:
> + *	0			cqe returned
> + *	-ENODATA		EMPTY;
> + *	-EAGAIN			caller must try again
> + *	any other -errno	fatal error
> + */
> +static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
> +{
> +	struct c4iw_qp *qhp = NULL;
> +	struct t4_cqe uninitialized_var(cqe), *rd_cqe;
> +	int ret;

'cqe' is not used in the function.

I made these two changes and applied it to for-next

Jason
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
index 2be2e1ac1b5f..8426e74c6964 100644
--- a/drivers/infiniband/hw/cxgb4/cq.c
+++ b/drivers/infiniband/hw/cxgb4/cq.c
@@ -668,43 +668,22 @@  static int poll_cq(struct t4_wq *wq, struct t4_cq *cq, struct t4_cqe *cqe,
 	return ret;
 }
 
-/*
- * Get one cq entry from c4iw and map it to openib.
- *
- * Returns:
- *	0			cqe returned
- *	-ENODATA		EMPTY;
- *	-EAGAIN			caller must try again
- *	any other -errno	fatal error
- */
-static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
+static int __c4iw_poll_cq_one(struct c4iw_cq *chp, struct c4iw_qp *qhp,
+			      struct ib_wc *wc)
 {
-	struct c4iw_qp *qhp = NULL;
-	struct t4_cqe uninitialized_var(cqe), *rd_cqe;
-	struct t4_wq *wq;
+	struct t4_cqe uninitialized_var(cqe);
+	struct t4_wq *wq = qhp ? &qhp->wq : NULL;
 	u32 credit = 0;
 	u8 cqe_flushed;
 	u64 cookie = 0;
 	int ret;
 
-	ret = t4_next_cqe(&chp->cq, &rd_cqe);
-
-	if (ret)
-		return ret;
-
-	qhp = get_qhp(chp->rhp, CQE_QPID(rd_cqe));
-	if (!qhp)
-		wq = NULL;
-	else {
-		spin_lock(&qhp->lock);
-		wq = &(qhp->wq);
-	}
 	ret = poll_cq(wq, &(chp->cq), &cqe, &cqe_flushed, &cookie, &credit);
 	if (ret)
 		goto out;
 
 	wc->wr_id = cookie;
-	wc->qp = &qhp->ibqp;
+	wc->qp = qhp ? &qhp->ibqp : NULL;
 	wc->vendor_err = CQE_STATUS(&cqe);
 	wc->wc_flags = 0;
 
@@ -819,8 +798,37 @@  static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
 		}
 	}
 out:
-	if (wq)
+	return ret;
+}
+
+/*
+ * Get one cq entry from c4iw and map it to openib.
+ *
+ * Returns:
+ *	0			cqe returned
+ *	-ENODATA		EMPTY;
+ *	-EAGAIN			caller must try again
+ *	any other -errno	fatal error
+ */
+static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
+{
+	struct c4iw_qp *qhp = NULL;
+	struct t4_cqe uninitialized_var(cqe), *rd_cqe;
+	int ret;
+
+	ret = t4_next_cqe(&chp->cq, &rd_cqe);
+
+	if (ret)
+		return ret;
+
+	qhp = get_qhp(chp->rhp, CQE_QPID(rd_cqe));
+	if (qhp) {
+		spin_lock(&qhp->lock);
+		ret = __c4iw_poll_cq_one(chp, qhp, wc);
 		spin_unlock(&qhp->lock);
+	} else {
+		ret = __c4iw_poll_cq_one(chp, NULL, wc);
+	}
 	return ret;
 }