Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c2c6ff13 authored by Matan Barak's avatar Matan Barak Committed by Doug Ledford
Browse files

IB/cm: cm_init_av_by_path should find a GID by its netdevice



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: default avatarMatan Barak <matanb@mellanox.com>
Reviewed-By: default avatarDevesh Sharma <devesh.sharma@avagotech.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent ba36e37f
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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;