Commit 7e978e77 authored by Mark Bloch's avatar Mark Bloch Committed by Saeed Mahameed

net/mlx5: Lag, use actual number of lag ports

Refactor the entire lag code to use ldev->ports instead of hard-coded
defines (like MLX5_MAX_PORTS) for its operations.
Signed-off-by: default avatarMark Bloch <mbloch@nvidia.com>
Reviewed-by: default avatarMaor Gottlieb <maorg@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent cdf611d1
...@@ -12,7 +12,8 @@ enum { ...@@ -12,7 +12,8 @@ enum {
static struct mlx5_flow_group * static struct mlx5_flow_group *
mlx5_create_hash_flow_group(struct mlx5_flow_table *ft, mlx5_create_hash_flow_group(struct mlx5_flow_table *ft,
struct mlx5_flow_definer *definer) struct mlx5_flow_definer *definer,
u8 ports)
{ {
int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in); int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in);
struct mlx5_flow_group *fg; struct mlx5_flow_group *fg;
...@@ -25,7 +26,7 @@ mlx5_create_hash_flow_group(struct mlx5_flow_table *ft, ...@@ -25,7 +26,7 @@ mlx5_create_hash_flow_group(struct mlx5_flow_table *ft,
MLX5_SET(create_flow_group_in, in, match_definer_id, MLX5_SET(create_flow_group_in, in, match_definer_id,
mlx5_get_match_definer_id(definer)); mlx5_get_match_definer_id(definer));
MLX5_SET(create_flow_group_in, in, start_flow_index, 0); MLX5_SET(create_flow_group_in, in, start_flow_index, 0);
MLX5_SET(create_flow_group_in, in, end_flow_index, MLX5_MAX_PORTS - 1); MLX5_SET(create_flow_group_in, in, end_flow_index, ports - 1);
MLX5_SET(create_flow_group_in, in, group_type, MLX5_SET(create_flow_group_in, in, group_type,
MLX5_CREATE_FLOW_GROUP_IN_GROUP_TYPE_HASH_SPLIT); MLX5_CREATE_FLOW_GROUP_IN_GROUP_TYPE_HASH_SPLIT);
...@@ -36,7 +37,7 @@ mlx5_create_hash_flow_group(struct mlx5_flow_table *ft, ...@@ -36,7 +37,7 @@ mlx5_create_hash_flow_group(struct mlx5_flow_table *ft,
static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev, static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev,
struct mlx5_lag_definer *lag_definer, struct mlx5_lag_definer *lag_definer,
u8 port1, u8 port2) u8 *ports)
{ {
struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev; struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev;
struct mlx5_flow_table_attr ft_attr = {}; struct mlx5_flow_table_attr ft_attr = {};
...@@ -45,7 +46,7 @@ static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev, ...@@ -45,7 +46,7 @@ static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev,
struct mlx5_flow_namespace *ns; struct mlx5_flow_namespace *ns;
int err, i; int err, i;
ft_attr.max_fte = MLX5_MAX_PORTS; ft_attr.max_fte = ldev->ports;
ft_attr.level = MLX5_LAG_FT_LEVEL_DEFINER; ft_attr.level = MLX5_LAG_FT_LEVEL_DEFINER;
ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_PORT_SEL); ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_PORT_SEL);
...@@ -61,7 +62,8 @@ static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev, ...@@ -61,7 +62,8 @@ static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev,
} }
lag_definer->fg = mlx5_create_hash_flow_group(lag_definer->ft, lag_definer->fg = mlx5_create_hash_flow_group(lag_definer->ft,
lag_definer->definer); lag_definer->definer,
ldev->ports);
if (IS_ERR(lag_definer->fg)) { if (IS_ERR(lag_definer->fg)) {
err = PTR_ERR(lag_definer->fg); err = PTR_ERR(lag_definer->fg);
goto destroy_ft; goto destroy_ft;
...@@ -70,8 +72,8 @@ static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev, ...@@ -70,8 +72,8 @@ static int mlx5_lag_create_port_sel_table(struct mlx5_lag *ldev,
dest.type = MLX5_FLOW_DESTINATION_TYPE_UPLINK; dest.type = MLX5_FLOW_DESTINATION_TYPE_UPLINK;
dest.vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID; dest.vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
flow_act.flags |= FLOW_ACT_NO_APPEND; flow_act.flags |= FLOW_ACT_NO_APPEND;
for (i = 0; i < MLX5_MAX_PORTS; i++) { for (i = 0; i < ldev->ports; i++) {
u8 affinity = i == 0 ? port1 : port2; u8 affinity = ports[i];
dest.vport.vhca_id = MLX5_CAP_GEN(ldev->pf[affinity - 1].dev, dest.vport.vhca_id = MLX5_CAP_GEN(ldev->pf[affinity - 1].dev,
vhca_id); vhca_id);
...@@ -279,8 +281,7 @@ static int mlx5_lag_set_definer(u32 *match_definer_mask, ...@@ -279,8 +281,7 @@ static int mlx5_lag_set_definer(u32 *match_definer_mask,
static struct mlx5_lag_definer * static struct mlx5_lag_definer *
mlx5_lag_create_definer(struct mlx5_lag *ldev, enum netdev_lag_hash hash, mlx5_lag_create_definer(struct mlx5_lag *ldev, enum netdev_lag_hash hash,
enum mlx5_traffic_types tt, bool tunnel, u8 port1, enum mlx5_traffic_types tt, bool tunnel, u8 *ports)
u8 port2)
{ {
struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev; struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev;
struct mlx5_lag_definer *lag_definer; struct mlx5_lag_definer *lag_definer;
...@@ -308,7 +309,7 @@ mlx5_lag_create_definer(struct mlx5_lag *ldev, enum netdev_lag_hash hash, ...@@ -308,7 +309,7 @@ mlx5_lag_create_definer(struct mlx5_lag *ldev, enum netdev_lag_hash hash,
goto free_mask; goto free_mask;
} }
err = mlx5_lag_create_port_sel_table(ldev, lag_definer, port1, port2); err = mlx5_lag_create_port_sel_table(ldev, lag_definer, ports);
if (err) if (err)
goto destroy_match_definer; goto destroy_match_definer;
...@@ -331,7 +332,7 @@ static void mlx5_lag_destroy_definer(struct mlx5_lag *ldev, ...@@ -331,7 +332,7 @@ static void mlx5_lag_destroy_definer(struct mlx5_lag *ldev,
struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev; struct mlx5_core_dev *dev = ldev->pf[MLX5_LAG_P1].dev;
int i; int i;
for (i = 0; i < MLX5_MAX_PORTS; i++) for (i = 0; i < ldev->ports; i++)
mlx5_del_flow_rules(lag_definer->rules[i]); mlx5_del_flow_rules(lag_definer->rules[i]);
mlx5_destroy_flow_group(lag_definer->fg); mlx5_destroy_flow_group(lag_definer->fg);
mlx5_destroy_flow_table(lag_definer->ft); mlx5_destroy_flow_table(lag_definer->ft);
...@@ -356,7 +357,7 @@ static void mlx5_lag_destroy_definers(struct mlx5_lag *ldev) ...@@ -356,7 +357,7 @@ static void mlx5_lag_destroy_definers(struct mlx5_lag *ldev)
static int mlx5_lag_create_definers(struct mlx5_lag *ldev, static int mlx5_lag_create_definers(struct mlx5_lag *ldev,
enum netdev_lag_hash hash_type, enum netdev_lag_hash hash_type,
u8 port1, u8 port2) u8 *ports)
{ {
struct mlx5_lag_port_sel *port_sel = &ldev->port_sel; struct mlx5_lag_port_sel *port_sel = &ldev->port_sel;
struct mlx5_lag_definer *lag_definer; struct mlx5_lag_definer *lag_definer;
...@@ -364,7 +365,7 @@ static int mlx5_lag_create_definers(struct mlx5_lag *ldev, ...@@ -364,7 +365,7 @@ static int mlx5_lag_create_definers(struct mlx5_lag *ldev,
for_each_set_bit(tt, port_sel->tt_map, MLX5_NUM_TT) { for_each_set_bit(tt, port_sel->tt_map, MLX5_NUM_TT) {
lag_definer = mlx5_lag_create_definer(ldev, hash_type, tt, lag_definer = mlx5_lag_create_definer(ldev, hash_type, tt,
false, port1, port2); false, ports);
if (IS_ERR(lag_definer)) { if (IS_ERR(lag_definer)) {
err = PTR_ERR(lag_definer); err = PTR_ERR(lag_definer);
goto destroy_definers; goto destroy_definers;
...@@ -376,7 +377,7 @@ static int mlx5_lag_create_definers(struct mlx5_lag *ldev, ...@@ -376,7 +377,7 @@ static int mlx5_lag_create_definers(struct mlx5_lag *ldev,
lag_definer = lag_definer =
mlx5_lag_create_definer(ldev, hash_type, tt, mlx5_lag_create_definer(ldev, hash_type, tt,
true, port1, port2); true, ports);
if (IS_ERR(lag_definer)) { if (IS_ERR(lag_definer)) {
err = PTR_ERR(lag_definer); err = PTR_ERR(lag_definer);
goto destroy_definers; goto destroy_definers;
...@@ -513,13 +514,13 @@ static int mlx5_lag_create_inner_ttc_table(struct mlx5_lag *ldev) ...@@ -513,13 +514,13 @@ static int mlx5_lag_create_inner_ttc_table(struct mlx5_lag *ldev)
} }
int mlx5_lag_port_sel_create(struct mlx5_lag *ldev, int mlx5_lag_port_sel_create(struct mlx5_lag *ldev,
enum netdev_lag_hash hash_type, u8 port1, u8 port2) enum netdev_lag_hash hash_type, u8 *ports)
{ {
struct mlx5_lag_port_sel *port_sel = &ldev->port_sel; struct mlx5_lag_port_sel *port_sel = &ldev->port_sel;
int err; int err;
set_tt_map(port_sel, hash_type); set_tt_map(port_sel, hash_type);
err = mlx5_lag_create_definers(ldev, hash_type, port1, port2); err = mlx5_lag_create_definers(ldev, hash_type, ports);
if (err) if (err)
return err; return err;
...@@ -546,12 +547,13 @@ int mlx5_lag_port_sel_create(struct mlx5_lag *ldev, ...@@ -546,12 +547,13 @@ int mlx5_lag_port_sel_create(struct mlx5_lag *ldev,
static int static int
mlx5_lag_modify_definers_destinations(struct mlx5_lag *ldev, mlx5_lag_modify_definers_destinations(struct mlx5_lag *ldev,
struct mlx5_lag_definer **definers, struct mlx5_lag_definer **definers,
u8 port1, u8 port2) u8 *ports)
{ {
struct mlx5_lag_port_sel *port_sel = &ldev->port_sel; struct mlx5_lag_port_sel *port_sel = &ldev->port_sel;
struct mlx5_flow_destination dest = {}; struct mlx5_flow_destination dest = {};
int err; int err;
int tt; int tt;
int i;
dest.type = MLX5_FLOW_DESTINATION_TYPE_UPLINK; dest.type = MLX5_FLOW_DESTINATION_TYPE_UPLINK;
dest.vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID; dest.vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
...@@ -559,19 +561,13 @@ mlx5_lag_modify_definers_destinations(struct mlx5_lag *ldev, ...@@ -559,19 +561,13 @@ mlx5_lag_modify_definers_destinations(struct mlx5_lag *ldev,
for_each_set_bit(tt, port_sel->tt_map, MLX5_NUM_TT) { for_each_set_bit(tt, port_sel->tt_map, MLX5_NUM_TT) {
struct mlx5_flow_handle **rules = definers[tt]->rules; struct mlx5_flow_handle **rules = definers[tt]->rules;
if (ldev->v2p_map[MLX5_LAG_P1] != port1) { for (i = 0; i < ldev->ports; i++) {
dest.vport.vhca_id = if (ldev->v2p_map[i] == ports[i])
MLX5_CAP_GEN(ldev->pf[port1 - 1].dev, vhca_id); continue;
err = mlx5_modify_rule_destination(rules[MLX5_LAG_P1],
&dest, NULL);
if (err)
return err;
}
if (ldev->v2p_map[MLX5_LAG_P2] != port2) {
dest.vport.vhca_id = dest.vport.vhca_id =
MLX5_CAP_GEN(ldev->pf[port2 - 1].dev, vhca_id); MLX5_CAP_GEN(ldev->pf[ports[i] - 1].dev,
err = mlx5_modify_rule_destination(rules[MLX5_LAG_P2], vhca_id);
err = mlx5_modify_rule_destination(rules[i],
&dest, NULL); &dest, NULL);
if (err) if (err)
return err; return err;
...@@ -581,14 +577,14 @@ mlx5_lag_modify_definers_destinations(struct mlx5_lag *ldev, ...@@ -581,14 +577,14 @@ mlx5_lag_modify_definers_destinations(struct mlx5_lag *ldev,
return 0; return 0;
} }
int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 port1, u8 port2) int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 *ports)
{ {
struct mlx5_lag_port_sel *port_sel = &ldev->port_sel; struct mlx5_lag_port_sel *port_sel = &ldev->port_sel;
int err; int err;
err = mlx5_lag_modify_definers_destinations(ldev, err = mlx5_lag_modify_definers_destinations(ldev,
port_sel->outer.definers, port_sel->outer.definers,
port1, port2); ports);
if (err) if (err)
return err; return err;
...@@ -597,7 +593,7 @@ int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 port1, u8 port2) ...@@ -597,7 +593,7 @@ int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 port1, u8 port2)
return mlx5_lag_modify_definers_destinations(ldev, return mlx5_lag_modify_definers_destinations(ldev,
port_sel->inner.definers, port_sel->inner.definers,
port1, port2); ports);
} }
void mlx5_lag_port_sel_destroy(struct mlx5_lag *ldev) void mlx5_lag_port_sel_destroy(struct mlx5_lag *ldev)
......
...@@ -27,22 +27,20 @@ struct mlx5_lag_port_sel { ...@@ -27,22 +27,20 @@ struct mlx5_lag_port_sel {
#ifdef CONFIG_MLX5_ESWITCH #ifdef CONFIG_MLX5_ESWITCH
int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 port1, u8 port2); int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 *ports);
void mlx5_lag_port_sel_destroy(struct mlx5_lag *ldev); void mlx5_lag_port_sel_destroy(struct mlx5_lag *ldev);
int mlx5_lag_port_sel_create(struct mlx5_lag *ldev, int mlx5_lag_port_sel_create(struct mlx5_lag *ldev,
enum netdev_lag_hash hash_type, u8 port1, enum netdev_lag_hash hash_type, u8 *ports);
u8 port2);
#else /* CONFIG_MLX5_ESWITCH */ #else /* CONFIG_MLX5_ESWITCH */
static inline int mlx5_lag_port_sel_create(struct mlx5_lag *ldev, static inline int mlx5_lag_port_sel_create(struct mlx5_lag *ldev,
enum netdev_lag_hash hash_type, enum netdev_lag_hash hash_type,
u8 port1, u8 port2) u8 *ports)
{ {
return 0; return 0;
} }
static inline int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 port1, static inline int mlx5_lag_port_sel_modify(struct mlx5_lag *ldev, u8 *ports)
u8 port2)
{ {
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment