| From 5cf2651e5957e9a778b209f8ca4dce5fa1931f3d Mon Sep 17 00:00:00 2001 |
| From: Brian Welty <brian.welty@intel.com> |
| Date: Thu, 17 Jan 2019 12:41:32 -0800 |
| Subject: IB/{hfi1, qib}: Fix WC.byte_len calculation for UD_SEND_WITH_IMM |
| |
| [ Upstream commit 904bba211acc2112fdf866e5a2bc6cd9ecd0de1b ] |
| |
| The work completion length for a receiving a UD send with immediate is |
| short by 4 bytes causing application using this opcode to fail. |
| |
| The UD receive logic incorrectly subtracts 4 bytes for immediate |
| value. These bytes are already included in header length and are used to |
| calculate header/payload split, so the result is these 4 bytes are |
| subtracted twice, once when the header length subtracted from the overall |
| length and once again in the UD opcode specific path. |
| |
| Remove the extra subtraction when handling the opcode. |
| |
| Fixes: 7724105686e7 ("IB/hfi1: add driver files") |
| Reviewed-by: Michael J. Ruhl <michael.j.ruhl@intel.com> |
| Signed-off-by: Brian Welty <brian.welty@intel.com> |
| Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> |
| Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> |
| Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/hw/hfi1/ud.c | 1 - |
| drivers/infiniband/hw/qib/qib_ud.c | 1 - |
| 2 files changed, 2 deletions(-) |
| |
| diff --git a/drivers/infiniband/hw/hfi1/ud.c b/drivers/infiniband/hw/hfi1/ud.c |
| index 70d39fc450a1..54eb69564264 100644 |
| --- a/drivers/infiniband/hw/hfi1/ud.c |
| +++ b/drivers/infiniband/hw/hfi1/ud.c |
| @@ -980,7 +980,6 @@ void hfi1_ud_rcv(struct hfi1_packet *packet) |
| opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) { |
| wc.ex.imm_data = packet->ohdr->u.ud.imm_data; |
| wc.wc_flags = IB_WC_WITH_IMM; |
| - tlen -= sizeof(u32); |
| } else if (opcode == IB_OPCODE_UD_SEND_ONLY) { |
| wc.ex.imm_data = 0; |
| wc.wc_flags = 0; |
| diff --git a/drivers/infiniband/hw/qib/qib_ud.c b/drivers/infiniband/hw/qib/qib_ud.c |
| index f8d029a2390f..bce2b5cd3c7b 100644 |
| --- a/drivers/infiniband/hw/qib/qib_ud.c |
| +++ b/drivers/infiniband/hw/qib/qib_ud.c |
| @@ -513,7 +513,6 @@ void qib_ud_rcv(struct qib_ibport *ibp, struct ib_header *hdr, |
| opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) { |
| wc.ex.imm_data = ohdr->u.ud.imm_data; |
| wc.wc_flags = IB_WC_WITH_IMM; |
| - tlen -= sizeof(u32); |
| } else if (opcode == IB_OPCODE_UD_SEND_ONLY) { |
| wc.ex.imm_data = 0; |
| wc.wc_flags = 0; |
| -- |
| 2.19.1 |
| |