aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAviv Heller <avivh@mellanox.com>2016-09-18 13:48:01 -0400
committerDoug Ledford <dledford@redhat.com>2016-10-07 16:54:20 -0400
commit9ef9c640f4c5376189d8ca70f51a50a3d0b16914 (patch)
tree9d3793557bf583ecac486252087da4cf54bb9c6f
parent5ec8c83e3ad3ea4ea78798edcd4ad61e0041a174 (diff)
IB/mlx5: Merge vports flow steering during LAG
This is done in two steps: 1) Issuing CREATE_VPORT_LAG in order to have Ethernet traffic from both ports arriving on PF0 root flowtable, so we will be able to catch all raw-eth traffic on PF0. 2) Creation of LAG demux flowtable in order to direct all non-raw-eth traffic back to its source port, assuring that normal Ethernet traffic "jumps" to the root flowtable of its RX port (non-LAG behavior). Signed-off-by: Aviv Heller <avivh@mellanox.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/mlx5/main.c49
-rw-r--r--drivers/infiniband/hw/mlx5/mlx5_ib.h1
2 files changed, 50 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index ed038b7a96fc..70e7c8dcd4e0 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -2703,6 +2703,47 @@ static void get_dev_fw_str(struct ib_device *ibdev, char *str,
2703 fw_rev_min(dev->mdev), fw_rev_sub(dev->mdev)); 2703 fw_rev_min(dev->mdev), fw_rev_sub(dev->mdev));
2704} 2704}
2705 2705
2706static int mlx5_roce_lag_init(struct mlx5_ib_dev *dev)
2707{
2708 struct mlx5_core_dev *mdev = dev->mdev;
2709 struct mlx5_flow_namespace *ns = mlx5_get_flow_namespace(mdev,
2710 MLX5_FLOW_NAMESPACE_LAG);
2711 struct mlx5_flow_table *ft;
2712 int err;
2713
2714 if (!ns || !mlx5_lag_is_active(mdev))
2715 return 0;
2716
2717 err = mlx5_cmd_create_vport_lag(mdev);
2718 if (err)
2719 return err;
2720
2721 ft = mlx5_create_lag_demux_flow_table(ns, 0, 0);
2722 if (IS_ERR(ft)) {
2723 err = PTR_ERR(ft);
2724 goto err_destroy_vport_lag;
2725 }
2726
2727 dev->flow_db.lag_demux_ft = ft;
2728 return 0;
2729
2730err_destroy_vport_lag:
2731 mlx5_cmd_destroy_vport_lag(mdev);
2732 return err;
2733}
2734
2735static void mlx5_roce_lag_cleanup(struct mlx5_ib_dev *dev)
2736{
2737 struct mlx5_core_dev *mdev = dev->mdev;
2738
2739 if (dev->flow_db.lag_demux_ft) {
2740 mlx5_destroy_flow_table(dev->flow_db.lag_demux_ft);
2741 dev->flow_db.lag_demux_ft = NULL;
2742
2743 mlx5_cmd_destroy_vport_lag(mdev);
2744 }
2745}
2746
2706static void mlx5_remove_roce_notifier(struct mlx5_ib_dev *dev) 2747static void mlx5_remove_roce_notifier(struct mlx5_ib_dev *dev)
2707{ 2748{
2708 if (dev->roce.nb.notifier_call) { 2749 if (dev->roce.nb.notifier_call) {
@@ -2726,8 +2767,15 @@ static int mlx5_enable_roce(struct mlx5_ib_dev *dev)
2726 if (err) 2767 if (err)
2727 goto err_unregister_netdevice_notifier; 2768 goto err_unregister_netdevice_notifier;
2728 2769
2770 err = mlx5_roce_lag_init(dev);
2771 if (err)
2772 goto err_disable_roce;
2773
2729 return 0; 2774 return 0;
2730 2775
2776err_disable_roce:
2777 mlx5_nic_vport_disable_roce(dev->mdev);
2778
2731err_unregister_netdevice_notifier: 2779err_unregister_netdevice_notifier:
2732 mlx5_remove_roce_notifier(dev); 2780 mlx5_remove_roce_notifier(dev);
2733 return err; 2781 return err;
@@ -2735,6 +2783,7 @@ err_unregister_netdevice_notifier:
2735 2783
2736static void mlx5_disable_roce(struct mlx5_ib_dev *dev) 2784static void mlx5_disable_roce(struct mlx5_ib_dev *dev)
2737{ 2785{
2786 mlx5_roce_lag_cleanup(dev);
2738 mlx5_nic_vport_disable_roce(dev->mdev); 2787 mlx5_nic_vport_disable_roce(dev->mdev);
2739} 2788}
2740 2789
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
index f8a62a643613..53e1f1dc0000 100644
--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
@@ -158,6 +158,7 @@ struct mlx5_ib_flow_handler {
158struct mlx5_ib_flow_db { 158struct mlx5_ib_flow_db {
159 struct mlx5_ib_flow_prio prios[MLX5_IB_NUM_FLOW_FT]; 159 struct mlx5_ib_flow_prio prios[MLX5_IB_NUM_FLOW_FT];
160 struct mlx5_ib_flow_prio sniffer[MLX5_IB_NUM_SNIFFER_FTS]; 160 struct mlx5_ib_flow_prio sniffer[MLX5_IB_NUM_SNIFFER_FTS];
161 struct mlx5_flow_table *lag_demux_ft;
161 /* Protect flow steering bypass flow tables 162 /* Protect flow steering bypass flow tables
162 * when add/del flow rules. 163 * when add/del flow rules.
163 * only single add/removal of flow steering rule could be done 164 * only single add/removal of flow steering rule could be done