| From foo@baz Sun May 27 17:33:38 CEST 2018 |
| From: Jack M <jackm@dev.mellanox.co.il> |
| Date: Mon, 5 Mar 2018 20:09:46 +0200 |
| Subject: IB/mlx4: Include GID type when deleting GIDs from HW table under RoCE |
| |
| From: Jack M <jackm@dev.mellanox.co.il> |
| |
| [ Upstream commit a18177925c252da7801149abe217c05b80884798 ] |
| |
| The commit cited below added a gid_type field (RoCEv1 or RoCEv2) |
| to GID properties. |
| |
| When adding GIDs, this gid_type field was copied over to the |
| hardware gid table. However, when deleting GIDs, the gid_type field |
| was not copied over to the hardware gid table. |
| |
| As a result, when running RoCEv2, all RoCEv2 gids in the |
| hardware gid table were set to type RoCEv1 when any gid was deleted. |
| |
| This problem would persist until the next gid was added (which would again |
| restore the gid_type field for all the gids in the hardware gid table). |
| |
| Fix this by copying over the gid_type field to the hardware gid table |
| when deleting gids, so that the gid_type of all remaining gids is |
| preserved when a gid is deleted. |
| |
| Fixes: b699a859d17b ("IB/mlx4: Add gid_type to GID properties") |
| Reviewed-by: Moni Shoua <monis@mellanox.com> |
| Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Signed-off-by: Leon Romanovsky <leon@kernel.org> |
| Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/infiniband/hw/mlx4/main.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/infiniband/hw/mlx4/main.c |
| +++ b/drivers/infiniband/hw/mlx4/main.c |
| @@ -361,8 +361,13 @@ static int mlx4_ib_del_gid(struct ib_dev |
| if (!gids) { |
| ret = -ENOMEM; |
| } else { |
| - for (i = 0; i < MLX4_MAX_PORT_GIDS; i++) |
| - memcpy(&gids[i].gid, &port_gid_table->gids[i].gid, sizeof(union ib_gid)); |
| + for (i = 0; i < MLX4_MAX_PORT_GIDS; i++) { |
| + memcpy(&gids[i].gid, |
| + &port_gid_table->gids[i].gid, |
| + sizeof(union ib_gid)); |
| + gids[i].gid_type = |
| + port_gid_table->gids[i].gid_type; |
| + } |
| } |
| } |
| spin_unlock_bh(&iboe->lock); |