mlx4: trigger IB events needed by SMC
authorUrsula Braun <ubraun@linux.ibm.com>
Mon, 12 Nov 2018 11:41:55 +0000 (12:41 +0100)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 22 Nov 2018 18:57:31 +0000 (11:57 -0700)
The mlx4 driver does not trigger an IB_EVENT_PORT_ACTIVE when the RoCE
network interface is activated. When SMC determines the RoCE device port
to be used, it checks the port states. This patch triggers IB events for
NETDEV_UP and NETDEV_DOWN.

Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Acked-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/mlx4_ib.h

index 0def232..b73b5fa 100644 (file)
@@ -2352,6 +2352,32 @@ static void mlx4_ib_scan_netdevs(struct mlx4_ib_dev *ibdev,
                     event == NETDEV_UP || event == NETDEV_CHANGE))
                        update_qps_port = port;
 
+               if (dev == iboe->netdevs[port - 1] &&
+                   (event == NETDEV_UP || event == NETDEV_DOWN)) {
+                       enum ib_port_state port_state;
+                       struct ib_event ibev = { };
+
+                       if (ib_get_cached_port_state(&ibdev->ib_dev, port,
+                                                    &port_state))
+                               continue;
+
+                       if (event == NETDEV_UP &&
+                           (port_state != IB_PORT_ACTIVE ||
+                            iboe->last_port_state[port - 1] != IB_PORT_DOWN))
+                               continue;
+                       if (event == NETDEV_DOWN &&
+                           (port_state != IB_PORT_DOWN ||
+                            iboe->last_port_state[port - 1] != IB_PORT_ACTIVE))
+                               continue;
+                       iboe->last_port_state[port - 1] = port_state;
+
+                       ibev.device = &ibdev->ib_dev;
+                       ibev.element.port_num = port;
+                       ibev.event = event == NETDEV_UP ? IB_EVENT_PORT_ACTIVE :
+                                                         IB_EVENT_PORT_ERR;
+                       ib_dispatch_event(&ibev);
+               }
+
        }
        spin_unlock_bh(&iboe->lock);
 
@@ -2710,6 +2736,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
        for (i = 0; i < ibdev->num_ports; ++i) {
                mutex_init(&ibdev->counters_table[i].mutex);
                INIT_LIST_HEAD(&ibdev->counters_table[i].counters_list);
+               iboe->last_port_state[i] = IB_PORT_DOWN;
        }
 
        num_req_counters = mlx4_is_bonded(dev) ? 1 : ibdev->num_ports;
index 8850dfc..5cb5242 100644 (file)
@@ -519,6 +519,7 @@ struct mlx4_ib_iboe {
        atomic64_t              mac[MLX4_MAX_PORTS];
        struct notifier_block   nb;
        struct mlx4_port_gid_table gids[MLX4_MAX_PORTS];
+       enum ib_port_state      last_port_state[MLX4_MAX_PORTS];
 };
 
 struct pkey_mgt {