| From b758610d028ba2dd6e172d9db27bf9340aa931cc Mon Sep 17 00:00:00 2001 |
| From: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Date: Thu, 10 Nov 2016 11:30:57 +0200 |
| Subject: [PATCH] IB/mlx4: Handle well-known-gid in mad_demux processing |
| |
| commit befcabcd530e4ffb6f016638f693b7d94986d2ba upstream. |
| |
| 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: 37bfc7c1e83f ('IB/mlx4: SR-IOV multiplex and demultiplex MADs') |
| Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Signed-off-by: Daniel Jurgens <danielj@mellanox.com> |
| Signed-off-by: Leon Romanovsky <leon@kernel.org> |
| Signed-off-by: Doug Ledford <dledford@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c |
| index 0f21c3a25552..8a06992b1432 100644 |
| --- a/drivers/infiniband/hw/mlx4/mad.c |
| +++ b/drivers/infiniband/hw/mlx4/mad.c |
| @@ -675,10 +675,18 @@ 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 (slave < 0) { |
| - mlx4_ib_warn(ibdev, "failed matching grh\n"); |
| - return -ENOENT; |
| + 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 */ |
| -- |
| 2.10.1 |
| |