IB/mlx4: Create paravirt contexts for VFs when master IB driver initializes
authorJack Morgenstein <jackm@dev.mellanox.co.il>
Fri, 3 Aug 2012 08:40:58 +0000 (08:40 +0000)
committerRoland Dreier <roland@purestorage.com>
Mon, 1 Oct 2012 03:33:44 +0000 (20:33 -0700)
When we have VFs and PFs on same host, the VFs are activated within
the mlx4_core module before the mlx4_ib kernel module is loaded.

When the mlx4_ib module initializes the PF (master), it now creates
MAD paravirtualization contexts for any VFs that already active.

Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/mlx4/mad.c
drivers/infiniband/hw/mlx4/main.c

index 658a622..21a7941 100644 (file)
@@ -1652,6 +1652,9 @@ static int create_pv_resources(struct ib_device *ibdev, int slave, int port,
 {
        int ret, cq_size;
 
+       if (ctx->state != DEMUX_PV_STATE_DOWN)
+               return -EEXIST;
+
        ctx->state = DEMUX_PV_STATE_STARTING;
        /* have QP0 only on port owner, and only if link layer is IB */
        if (ctx->slave == mlx4_master_func_num(to_mdev(ctx->ib_dev)->dev) &&
index e849347..718ec6b 100644 (file)
@@ -74,6 +74,8 @@ struct update_gid_work {
        int                     port;
 };
 
+static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init);
+
 static struct workqueue_struct *wq;
 
 static void init_query_mad(struct ib_smp *mad)
@@ -1470,6 +1472,15 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
        if (mlx4_is_mfunc(ibdev->dev))
                init_pkeys(ibdev);
 
+       /* create paravirt contexts for any VFs which are active */
+       if (mlx4_is_master(ibdev->dev)) {
+               for (j = 0; j < MLX4_MFUNC_MAX; j++) {
+                       if (j == mlx4_master_func_num(ibdev->dev))
+                               continue;
+                       if (mlx4_is_slave_active(ibdev->dev, j))
+                               do_slave_init(ibdev, j, 1);
+               }
+       }
        return ibdev;
 
 err_notif: