diff mbox

[v2] RDMA/rxe: Set wqe->status correctly if an unexpected response is received

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

Commit Message

Bart Van Assche June 26, 2018, 3:39 p.m. UTC
Every function that returns COMPST_ERROR must set wqe->status to
another value than IB_WC_SUCCESS before returning COMPST_ERROR. Fix
the only code path for which this is not yet the case.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: Zhu Yanjun <yanjun.zhu@oracle.com>
Cc: Jianchao Wang <jianchao.w.wang@oracle.com>
Cc: Yuval Shaia <yuval.shaia@oracle.com>
Cc: <stable@vger.kernel.org>
---

Changes compared to v1: left out a pr_err() statement as requested by Jason.

 drivers/infiniband/sw/rxe/rxe_comp.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Yuval Shaia June 27, 2018, 4:31 p.m. UTC | #1
On Tue, Jun 26, 2018 at 08:39:36AM -0700, Bart Van Assche wrote:
> Every function that returns COMPST_ERROR must set wqe->status to
> another value than IB_WC_SUCCESS before returning COMPST_ERROR. Fix
> the only code path for which this is not yet the case.

It is unclear to me why other places left out from this fix (e.x. lines
248, 288 etc).

> 
> Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
> Cc: Zhu Yanjun <yanjun.zhu@oracle.com>
> Cc: Jianchao Wang <jianchao.w.wang@oracle.com>
> Cc: Yuval Shaia <yuval.shaia@oracle.com>
> Cc: <stable@vger.kernel.org>
> ---
> 
> Changes compared to v1: left out a pr_err() statement as requested by Jason.
> 
>  drivers/infiniband/sw/rxe/rxe_comp.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/infiniband/sw/rxe/rxe_comp.c b/drivers/infiniband/sw/rxe/rxe_comp.c
> index 98d470d1f3fc..83311dd07019 100644
> --- a/drivers/infiniband/sw/rxe/rxe_comp.c
> +++ b/drivers/infiniband/sw/rxe/rxe_comp.c
> @@ -276,6 +276,7 @@ static inline enum comp_state check_ack(struct rxe_qp *qp,
>  	case IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE:
>  		if (wqe->wr.opcode != IB_WR_RDMA_READ &&
>  		    wqe->wr.opcode != IB_WR_RDMA_READ_WITH_INV) {
> +			wqe->status = IB_WC_FATAL_ERR;
>  			return COMPST_ERROR;
>  		}
>  		reset_retry_counters(qp);
> -- 
> 2.17.1
> 
--
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
Bart Van Assche June 27, 2018, 4:41 p.m. UTC | #2
On 06/27/18 09:32, Yuval Shaia wrote:
> On Tue, Jun 26, 2018 at 08:39:36AM -0700, Bart Van Assche wrote:
>> Every function that returns COMPST_ERROR must set wqe->status to
>> another value than IB_WC_SUCCESS before returning COMPST_ERROR. Fix
>> the only code path for which this is not yet the case.
> 
> It is unclear to me why other places left out from this fix (e.x. lines
> 248, 288 etc).

Hello Yuval,

wqe->status is already set before the code that you mentioned has been 
reached.

Bart.
--
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
Moni Shoua June 28, 2018, 8:58 a.m. UTC | #3
>
> wqe->status is already set before the code that you mentioned has been
> reached.
can you be more specific?
for instance I didn't find similar behavior for the example below
(also in check_ack())

        case IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE:
                syn = aeth_syn(pkt);

                if ((syn & AETH_TYPE_MASK) != AETH_ACK)
                        return COMPST_ERROR;

                if (wqe->wr.opcode != IB_WR_ATOMIC_CMP_AND_SWP &&
                    wqe->wr.opcode != IB_WR_ATOMIC_FETCH_AND_ADD)
                        return COMPST_ERROR;   <<<<<<<<<<<<<<<<<<<<<<<<<<
                reset_retry_counters(qp);
                return COMPST_ATOMIC;
--
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
Bart Van Assche June 28, 2018, 3:47 p.m. UTC | #4
On 06/28/18 01:58, Moni Shoua wrote:
>> wqe->status is already set before the code that you mentioned has been
>> reached.
 >
> can you be more specific?
> for instance I didn't find similar behavior for the example below
> (also in check_ack())
> 
>          case IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE:
>                  syn = aeth_syn(pkt);
> 
>                  if ((syn & AETH_TYPE_MASK) != AETH_ACK)
>                          return COMPST_ERROR;
> 
>                  if (wqe->wr.opcode != IB_WR_ATOMIC_CMP_AND_SWP &&
>                      wqe->wr.opcode != IB_WR_ATOMIC_FETCH_AND_ADD)
>                          return COMPST_ERROR;   <<<<<<<<<<<<<<<<<<<<<<<<<<
>                  reset_retry_counters(qp);
>                  return COMPST_ATOMIC;

Hello Moni,

I may have been wrong when I claimed that all other paths that return 
COMPST_ERROR already set wqe->status to an error value. However, I only 
have a test case for the path I modified. Hence my patch.

Bart.
--
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 Aug. 8, 2018, 3:58 p.m. UTC | #5
On Tue, Jun 26, 2018 at 08:39:36AM -0700, Bart Van Assche wrote:
> Every function that returns COMPST_ERROR must set wqe->status to
> another value than IB_WC_SUCCESS before returning COMPST_ERROR. Fix
> the only code path for which this is not yet the case.
> 
> Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
> Cc: Zhu Yanjun <yanjun.zhu@oracle.com>
> Cc: Jianchao Wang <jianchao.w.wang@oracle.com>
> Cc: Yuval Shaia <yuval.shaia@oracle.com>
> Cc: <stable@vger.kernel.org>
> Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
> ---
> 
> Changes compared to v1: left out a pr_err() statement as requested by Jason.
> 
>  drivers/infiniband/sw/rxe/rxe_comp.c | 1 +
>  1 file changed, 1 insertion(+)

applied to for-next

Thanks,
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/sw/rxe/rxe_comp.c b/drivers/infiniband/sw/rxe/rxe_comp.c
index 98d470d1f3fc..83311dd07019 100644
--- a/drivers/infiniband/sw/rxe/rxe_comp.c
+++ b/drivers/infiniband/sw/rxe/rxe_comp.c
@@ -276,6 +276,7 @@  static inline enum comp_state check_ack(struct rxe_qp *qp,
 	case IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE:
 		if (wqe->wr.opcode != IB_WR_RDMA_READ &&
 		    wqe->wr.opcode != IB_WR_RDMA_READ_WITH_INV) {
+			wqe->status = IB_WC_FATAL_ERR;
 			return COMPST_ERROR;
 		}
 		reset_retry_counters(qp);