diff options
author | Mohamad Haj Yahia <mohamad@mellanox.com> | 2016-05-03 17:14:00 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-05-04 14:04:48 -0400 |
commit | 01f51f2247250eb69d2fd345c498eedbb078bb56 (patch) | |
tree | 93cc1e113c080775fe17372c2cc42f53b126ae8d /drivers/net/ethernet/mellanox/mlx5 | |
parent | f942380c12394002efe0ca0be023e0f6fafbf29b (diff) |
net/mlx5: E-Switch, Enable/disable ACL tables on demand
Enable ingress/egress ACL tables only when we need to configure ACL
rules.
Disable ingress/egress ACL tables once all ACL rules are removed.
All VF outgoing/incoming traffic need to go through the ingress/egress ACL
tables.
Adding/Removing these tables on demand will save unnecessary hops in the
flow steering when the ACL tables are empty.
Signed-off-by: Mohamad Haj Yahia <mohamad@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx5')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c index 17d093cd6fc8..48c891982d7d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c @@ -728,7 +728,8 @@ static void esw_vport_enable_egress_acl(struct mlx5_eswitch *esw, int table_size = 2; int err = 0; - if (!MLX5_CAP_ESW_EGRESS_ACL(dev, ft_support)) + if (!MLX5_CAP_ESW_EGRESS_ACL(dev, ft_support) || + !IS_ERR_OR_NULL(vport->egress.acl)) return; esw_debug(dev, "Create vport[%d] egress ACL log_max_size(%d)\n", @@ -841,7 +842,8 @@ static void esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, int table_size = 4; int err = 0; - if (!MLX5_CAP_ESW_INGRESS_ACL(dev, ft_support)) + if (!MLX5_CAP_ESW_INGRESS_ACL(dev, ft_support) || + !IS_ERR_OR_NULL(vport->ingress.acl)) return; esw_debug(dev, "Create vport[%d] ingress ACL log_max_size(%d)\n", @@ -989,13 +991,6 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw, int err = 0; u8 *smac_v; - if (IS_ERR_OR_NULL(vport->ingress.acl)) { - esw_warn(esw->dev, - "vport[%d] configure ingress rules failed, ingress acl is not initialized!\n", - vport->vport); - return -EPERM; - } - if (vport->spoofchk) { err = mlx5_query_nic_vport_mac_address(esw->dev, vport->vport, smac); if (err) { @@ -1015,8 +1010,12 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw, esw_vport_cleanup_ingress_rules(esw, vport); - if (!vport->vlan && !vport->qos && !vport->spoofchk) + if (!vport->vlan && !vport->qos && !vport->spoofchk) { + esw_vport_disable_ingress_acl(esw, vport); return 0; + } + + esw_vport_enable_ingress_acl(esw, vport); esw_debug(esw->dev, "vport[%d] configure ingress rules, vlan(%d) qos(%d)\n", @@ -1091,16 +1090,14 @@ static int esw_vport_egress_config(struct mlx5_eswitch *esw, u32 *match_c; int err = 0; - if (IS_ERR_OR_NULL(vport->egress.acl)) { - esw_warn(esw->dev, "vport[%d] configure rgress rules failed, egress acl is not initialized!\n", - vport->vport); - return -EPERM; - } - esw_vport_cleanup_egress_rules(esw, vport); - if (!vport->vlan && !vport->qos) + if (!vport->vlan && !vport->qos) { + esw_vport_disable_egress_acl(esw, vport); return 0; + } + + esw_vport_enable_egress_acl(esw, vport); esw_debug(esw->dev, "vport[%d] configure egress rules, vlan(%d) qos(%d)\n", @@ -1169,8 +1166,6 @@ static void esw_enable_vport(struct mlx5_eswitch *esw, int vport_num, esw_debug(esw->dev, "Enabling VPORT(%d)\n", vport_num); if (vport_num) { /* Only VFs need ACLs for VST and spoofchk filtering */ - esw_vport_enable_ingress_acl(esw, vport); - esw_vport_enable_egress_acl(esw, vport); esw_vport_ingress_config(esw, vport); esw_vport_egress_config(esw, vport); } |