diff options
author | Aviv Heller <avivh@mellanox.com> | 2016-09-18 13:48:01 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-10-07 16:54:20 -0400 |
commit | 9ef9c640f4c5376189d8ca70f51a50a3d0b16914 (patch) | |
tree | 9d3793557bf583ecac486252087da4cf54bb9c6f | |
parent | 5ec8c83e3ad3ea4ea78798edcd4ad61e0041a174 (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.c | 49 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 |
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 | ||
2706 | static 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 | |||
2730 | err_destroy_vport_lag: | ||
2731 | mlx5_cmd_destroy_vport_lag(mdev); | ||
2732 | return err; | ||
2733 | } | ||
2734 | |||
2735 | static 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 | |||
2706 | static void mlx5_remove_roce_notifier(struct mlx5_ib_dev *dev) | 2747 | static 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 | ||
2776 | err_disable_roce: | ||
2777 | mlx5_nic_vport_disable_roce(dev->mdev); | ||
2778 | |||
2731 | err_unregister_netdevice_notifier: | 2779 | err_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 | ||
2736 | static void mlx5_disable_roce(struct mlx5_ib_dev *dev) | 2784 | static 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 { | |||
158 | struct mlx5_ib_flow_db { | 158 | struct 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 |