4.14-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Parav Pandit <pa...@mellanox.com>

[ Upstream commit 563c4ba3bd2b8b0b21c65669ec2226b1cfa1138b ]

ah_attr contains the port number to which cm_id is bound. However, while
searching for GID table for matching GID entry, the port number is
ignored.

This could cause the wrong GID to be used when the ah_attr is converted to
an AH.

Reviewed-by: Daniel Jurgens <dani...@mellanox.com>
Signed-off-by: Parav Pandit <pa...@mellanox.com>
Signed-off-by: Leon Romanovsky <l...@kernel.org>
Signed-off-by: Jason Gunthorpe <j...@mellanox.com>
Signed-off-by: Sasha Levin <alexander.le...@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 drivers/infiniband/core/multicast.c |   24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

--- a/drivers/infiniband/core/multicast.c
+++ b/drivers/infiniband/core/multicast.c
@@ -724,21 +724,19 @@ int ib_init_ah_from_mcmember(struct ib_d
 {
        int ret;
        u16 gid_index;
-       u8 p;
 
-       if (rdma_protocol_roce(device, port_num)) {
-               ret = ib_find_cached_gid_by_port(device, &rec->port_gid,
-                                                gid_type, port_num,
-                                                ndev,
-                                                &gid_index);
-       } else if (rdma_protocol_ib(device, port_num)) {
-               ret = ib_find_cached_gid(device, &rec->port_gid,
-                                        IB_GID_TYPE_IB, NULL, &p,
-                                        &gid_index);
-       } else {
-               ret = -EINVAL;
-       }
+       /* GID table is not based on the netdevice for IB link layer,
+        * so ignore ndev during search.
+        */
+       if (rdma_protocol_ib(device, port_num))
+               ndev = NULL;
+       else if (!rdma_protocol_roce(device, port_num))
+               return -EINVAL;
 
+       ret = ib_find_cached_gid_by_port(device, &rec->port_gid,
+                                        gid_type, port_num,
+                                        ndev,
+                                        &gid_index);
        if (ret)
                return ret;
 


Reply via email to