IB/cm: cm_init_av_by_path should find a GID by its netdevice
authorMatan Barak <matanb@mellanox.com>
Thu, 15 Oct 2015 15:38:48 +0000 (18:38 +0300)
committerDoug Ledford <dledford@redhat.com>
Thu, 22 Oct 2015 03:48:17 +0000 (23:48 -0400)
Previously, the CM has searched the cache for any sgid_index whose
GID matches the path's GID. Since the path record stores the net
device, the CM should now search only for GIDs which originated from
this net device.

Signed-off-by: Matan Barak <matanb@mellanox.com>
Reviewed-By: Devesh Sharma <devesh.sharma@avagotech.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/cm.c

index 2d8a0e4c42d6567cbc925ce46a1d51e770ff5a89..db242bb00299cf41609e52724e6de762c24c1858 100644 (file)
@@ -361,17 +361,21 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
        unsigned long flags;
        int ret;
        u8 p;
+       struct net_device *ndev = ib_get_ndev_from_path(path);
 
        read_lock_irqsave(&cm.device_lock, flags);
        list_for_each_entry(cm_dev, &cm.device_list, list) {
                if (!ib_find_cached_gid(cm_dev->ib_device, &path->sgid,
-                                       NULL, &p, NULL)) {
+                                       ndev, &p, NULL)) {
                        port = cm_dev->port[p-1];
                        break;
                }
        }
        read_unlock_irqrestore(&cm.device_lock, flags);
 
+       if (ndev)
+               dev_put(ndev);
+
        if (!port)
                return -EINVAL;
 
@@ -384,7 +388,6 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
        ib_init_ah_from_path(cm_dev->ib_device, port->port_num, path,
                             &av->ah_attr);
        av->timeout = path->packet_life_time + 1;
-       memcpy(av->smac, path->smac, sizeof(av->smac));
 
        av->valid = 1;
        return 0;