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

Commit befcabcd authored by Jack Morgenstein's avatar Jack Morgenstein Committed by Doug Ledford
Browse files

IB/mlx4: Handle well-known-gid in mad_demux processing



If OpenSM runs over a ConnectX-3, and there are ConnectX-4 or Connect-IB
VFs active on the network, the OpenSM will receive QP1 packets containing
a GRH where the destination GID is the "Well-Known GID" -- which is not a
GID in the HCA Port's GID Table.

This GID must be tested-for separately -- and packets which contain
this destination GID should be routed to slave 0 (the PF).

Fixes: 37bfc7c1 ('IB/mlx4: SR-IOV multiplex and demultiplex MADs')
Signed-off-by: default avatarJack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: default avatarDaniel Jurgens <danielj@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 850d8fd7
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -729,12 +729,20 @@ static int mlx4_ib_demux_mad(struct ib_device *ibdev, u8 port,

	/* If a grh is present, we demux according to it */
	if (wc->wc_flags & IB_WC_GRH) {
		slave = mlx4_ib_find_real_gid(ibdev, port, grh->dgid.global.interface_id);
		if (grh->dgid.global.interface_id ==
			cpu_to_be64(IB_SA_WELL_KNOWN_GUID) &&
		    grh->dgid.global.subnet_prefix == cpu_to_be64(
			atomic64_read(&dev->sriov.demux[port - 1].subnet_prefix))) {
			slave = 0;
		} else {
			slave = mlx4_ib_find_real_gid(ibdev, port,
						      grh->dgid.global.interface_id);
			if (slave < 0) {
				mlx4_ib_warn(ibdev, "failed matching grh\n");
				return -ENOENT;
			}
		}
	}
	/* Class-specific handling */
	switch (mad->mad_hdr.mgmt_class) {
	case IB_MGMT_CLASS_SUBN_LID_ROUTED: