| From ca9b590caa17bcbbea119594992666e96cde9c2f Mon Sep 17 00:00:00 2001 |
| From: Erez Shitrit <erezsh@mellanox.com> |
| Date: Thu, 2 Apr 2015 13:39:05 +0300 |
| Subject: IB/mlx4: Fix WQE LSO segment calculation |
| |
| From: Erez Shitrit <erezsh@mellanox.com> |
| |
| commit ca9b590caa17bcbbea119594992666e96cde9c2f upstream. |
| |
| The current code decreases from the mss size (which is the gso_size |
| from the kernel skb) the size of the packet headers. |
| |
| It shouldn't do that because the mss that comes from the stack |
| (e.g IPoIB) includes only the tcp payload without the headers. |
| |
| The result is indication to the HW that each packet that the HW sends |
| is smaller than what it could be, and too many packets will be sent |
| for big messages. |
| |
| An easy way to demonstrate one more aspect of the problem is by |
| configuring the ipoib mtu to be less than 2*hlen (2*56) and then |
| run app sending big TCP messages. This will tell the HW to send packets |
| with giant (negative value which under unsigned arithmetics becomes |
| a huge positive one) length and the QP moves to SQE state. |
| |
| Fixes: b832be1e4007 ('IB/mlx4: Add IPoIB LSO support') |
| Reported-by: Matthew Finlay <matt@mellanox.com> |
| Signed-off-by: Erez Shitrit <erezsh@mellanox.com> |
| Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/infiniband/hw/mlx4/qp.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/drivers/infiniband/hw/mlx4/qp.c |
| +++ b/drivers/infiniband/hw/mlx4/qp.c |
| @@ -2564,8 +2564,7 @@ static int build_lso_seg(struct mlx4_wqe |
| |
| memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); |
| |
| - *lso_hdr_sz = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | |
| - wr->wr.ud.hlen); |
| + *lso_hdr_sz = cpu_to_be32(wr->wr.ud.mss << 16 | wr->wr.ud.hlen); |
| *lso_seg_len = halign; |
| return 0; |
| } |