Re: [bug report] RDMA/siw: Fix SQ/RQ drain logic

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----"Dan Carpenter" <dan.carpenter@xxxxxxxxxx> wrote: -----

>To: bmt@xxxxxxxxxxxxxx
>From: "Dan Carpenter" <dan.carpenter@xxxxxxxxxx>
>Date: 10/24/2019 10:39PM
>Cc: linux-rdma@xxxxxxxxxxxxxxx
>Subject: [EXTERNAL] [bug report] RDMA/siw: Fix SQ/RQ drain logic
>
>Hello Bernard Metzler,
>
>The patch cf049bb31f71: "RDMA/siw: Fix SQ/RQ drain logic" from Oct 4,
>2019, leads to the following static checker warning:
>
>	drivers/infiniband/sw/siw/siw_verbs.c:1079 siw_post_receive()
>	error: locking inconsistency.  We assume 'read_sem:&qp->state_lock'
>is both locked and unlocked at the start.
>
>drivers/infiniband/sw/siw/siw_verbs.c
>   978  int siw_post_receive(struct ib_qp *base_qp, const struct
>ib_recv_wr *wr,
>   979                       const struct ib_recv_wr **bad_wr)
>   980  {
>   981          struct siw_qp *qp = to_siw_qp(base_qp);
>   982          unsigned long flags;
>   983          int rv = 0;
>   984  
>   985          if (qp->srq) {
>   986                  *bad_wr = wr;
>   987                  return -EOPNOTSUPP; /* what else from
>errno.h? */
>   988          }
>   989          if (!qp->kernel_verbs) {
>   990                  siw_dbg_qp(qp, "no kernel post_recv for user
>mapped sq\n");
>   991                  up_read(&qp->state_lock);
>                        ^^^^^^^^^^^^^^^^^^^^^^^^
>The patch changes the locking so this isn't held here and should be
>released.  Should it be held, though?

Yes, this is a BUG. Thanks very much! There is no qp spinlock to 
be held here. I moved that down to state checking. No need to
hold the qp lock before. 

Shall I re-send, or can we just amend the patch,
removing that single 'up_read()' line?

Thanks very much,
Bernard


>
>   992                  *bad_wr = wr;
>   993                  return -EINVAL;
>   994          }
>   995  
>   996          /*
>   997           * Try to acquire QP state lock. Must be non-blocking
>   998           * to accommodate kernel clients needs.
>   999           */
>  1000          if (!down_read_trylock(&qp->state_lock)) {
>                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
>  1001                  if (qp->attrs.state == SIW_QP_STATE_ERROR) {
>  1002                          /*
>  1003                           * ERROR state is final, so we can be
>sure
>  1004                           * this state will not change as long
>as the QP
>  1005                           * exists.
>  1006                           *
>  1007                           * This handles an ib_drain_rq() call
>with
>  1008                           * a concurrent request to set the QP
>state
>  1009                           * to ERROR.
>  1010                           */
>  1011                          rv = siw_rq_flush_wr(qp, wr, bad_wr);
>  1012                  } else {
>
>regards,
>dan carpenter
>
>




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux