aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mlx4/main.c
diff options
context:
space:
mode:
authorOren Duer <oren@mellanox.co.il>2012-08-03 04:40:46 -0400
committerRoland Dreier <roland@purestorage.com>2012-09-30 23:33:35 -0400
commitb9c5d6a643589ad39064f652938baa698f0e884a (patch)
treeaa7d5599f03e9c0c01945d06d944f11e294c8e92 /drivers/infiniband/hw/mlx4/main.c
parent0a9a01884d447c216eff75f8f274a0a3e82c7cee (diff)
IB/mlx4: Add multicast group (MCG) paravirtualization for SR-IOV
MCG paravirtualization support includes: - Creating multicast groups by VFs, and keeping accounting of them - Leaving multicast groups by VFs - Updating SM only with real changes in the overall picture of MCGs status - Creation of MGID=0 groups (let SM choose MGID) Note that the MCG module maintains its own internal MCG object reference counts. The reason for this is that the IB core is used to track only the multicast groups joins generated by the PF it runs over. The PF IB core layer is unaware of slaves, so it cannot be used to keep track of MCG joins they generate. Signed-off-by: Oren Duer <oren@mellanox.co.il> Signed-off-by: Eli Cohen <eli@mellanox.com> Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw/mlx4/main.c')
-rw-r--r--drivers/infiniband/hw/mlx4/main.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index 45a6cc04036b..b959fe4665dd 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -1628,18 +1628,28 @@ static int __init mlx4_ib_init(void)
1628 if (!wq) 1628 if (!wq)
1629 return -ENOMEM; 1629 return -ENOMEM;
1630 1630
1631 err = mlx4_ib_mcg_init();
1632 if (err)
1633 goto clean_wq;
1634
1631 err = mlx4_register_interface(&mlx4_ib_interface); 1635 err = mlx4_register_interface(&mlx4_ib_interface);
1632 if (err) { 1636 if (err)
1633 destroy_workqueue(wq); 1637 goto clean_mcg;
1634 return err;
1635 }
1636 1638
1637 return 0; 1639 return 0;
1640
1641clean_mcg:
1642 mlx4_ib_mcg_destroy();
1643
1644clean_wq:
1645 destroy_workqueue(wq);
1646 return err;
1638} 1647}
1639 1648
1640static void __exit mlx4_ib_cleanup(void) 1649static void __exit mlx4_ib_cleanup(void)
1641{ 1650{
1642 mlx4_unregister_interface(&mlx4_ib_interface); 1651 mlx4_unregister_interface(&mlx4_ib_interface);
1652 mlx4_ib_mcg_destroy();
1643 destroy_workqueue(wq); 1653 destroy_workqueue(wq);
1644} 1654}
1645 1655