Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 776b12b6 authored by Or Gerlitz's avatar Or Gerlitz Committed by David S. Miller
Browse files

net/mlx5: Put elements related to offloaded TC rule in one struct



Put the representors related to the source and dest vports and the
action in struct mlx5_esw_flow_attr which is used while setting the FDB rule.

This patch doesn't change any functionality.

Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e33dfe31
Loading
Loading
Loading
Loading
+29 −22
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@
#include <linux/rhashtable.h>
#include <linux/rhashtable.h>
#include <net/switchdev.h>
#include <net/switchdev.h>
#include <net/tc_act/tc_mirred.h>
#include <net/tc_act/tc_mirred.h>
#include <net/tc_act/tc_vlan.h>
#include "en.h"
#include "en.h"
#include "en_tc.h"
#include "en_tc.h"
#include "eswitch.h"
#include "eswitch.h"
@@ -47,6 +48,7 @@ struct mlx5e_tc_flow {
	struct rhash_head	node;
	struct rhash_head	node;
	u64			cookie;
	u64			cookie;
	struct mlx5_flow_rule	*rule;
	struct mlx5_flow_rule	*rule;
	struct mlx5_esw_flow_attr *attr;
};
};


#define MLX5E_TC_TABLE_NUM_ENTRIES 1024
#define MLX5E_TC_TABLE_NUM_ENTRIES 1024
@@ -114,15 +116,11 @@ static struct mlx5_flow_rule *mlx5e_tc_add_nic_flow(struct mlx5e_priv *priv,


static struct mlx5_flow_rule *mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
static struct mlx5_flow_rule *mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
						    struct mlx5_flow_spec *spec,
						    struct mlx5_flow_spec *spec,
						    u32 action, u32 dst_vport)
						    struct mlx5_esw_flow_attr *attr)
{
{
	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
	struct mlx5_eswitch_rep *rep = priv->ppriv;
	u32 src_vport;


	src_vport = rep->vport;
	return mlx5_eswitch_add_offloaded_rule(esw, spec, attr);

	return mlx5_eswitch_add_offloaded_rule(esw, spec, action, src_vport, dst_vport);
}
}


static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
@@ -358,7 +356,7 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
}
}


static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
				u32 *action, u32 *dest_vport)
				struct mlx5_esw_flow_attr *attr)
{
{
	const struct tc_action *a;
	const struct tc_action *a;
	LIST_HEAD(actions);
	LIST_HEAD(actions);
@@ -366,16 +364,17 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
	if (tc_no_actions(exts))
	if (tc_no_actions(exts))
		return -EINVAL;
		return -EINVAL;


	*action = 0;
	memset(attr, 0, sizeof(*attr));
	attr->in_rep = priv->ppriv;


	tcf_exts_to_list(exts, &actions);
	tcf_exts_to_list(exts, &actions);
	list_for_each_entry(a, &actions, list) {
	list_for_each_entry(a, &actions, list) {
		/* Only support a single action per rule */
		/* Only support a single action per rule */
		if (*action)
		if (attr->action)
			return -EINVAL;
			return -EINVAL;


		if (is_tcf_gact_shot(a)) {
		if (is_tcf_gact_shot(a)) {
			*action = MLX5_FLOW_CONTEXT_ACTION_DROP |
			attr->action = MLX5_FLOW_CONTEXT_ACTION_DROP |
				       MLX5_FLOW_CONTEXT_ACTION_COUNT;
				       MLX5_FLOW_CONTEXT_ACTION_COUNT;
			continue;
			continue;
		}
		}
@@ -384,7 +383,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
			int ifindex = tcf_mirred_ifindex(a);
			int ifindex = tcf_mirred_ifindex(a);
			struct net_device *out_dev;
			struct net_device *out_dev;
			struct mlx5e_priv *out_priv;
			struct mlx5e_priv *out_priv;
			struct mlx5_eswitch_rep *out_rep;


			out_dev = __dev_get_by_index(dev_net(priv->netdev), ifindex);
			out_dev = __dev_get_by_index(dev_net(priv->netdev), ifindex);


@@ -394,10 +392,9 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
				return -EINVAL;
				return -EINVAL;
			}
			}


			attr->action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
			out_priv = netdev_priv(out_dev);
			out_priv = netdev_priv(out_dev);
			out_rep  = out_priv->ppriv;
			attr->out_rep = out_priv->ppriv;
			*dest_vport = out_rep->vport;
			*action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
			continue;
			continue;
		}
		}


@@ -411,18 +408,27 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
{
{
	struct mlx5e_tc_table *tc = &priv->fs.tc;
	struct mlx5e_tc_table *tc = &priv->fs.tc;
	int err = 0;
	int err = 0;
	u32 flow_tag, action, dest_vport = 0;
	bool fdb_flow = false;
	u32 flow_tag, action;
	struct mlx5e_tc_flow *flow;
	struct mlx5e_tc_flow *flow;
	struct mlx5_flow_spec *spec;
	struct mlx5_flow_spec *spec;
	struct mlx5_flow_rule *old = NULL;
	struct mlx5_flow_rule *old = NULL;
	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
	struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;


	if (esw && esw->mode == SRIOV_OFFLOADS)
		fdb_flow = true;

	flow = rhashtable_lookup_fast(&tc->ht, &f->cookie,
	flow = rhashtable_lookup_fast(&tc->ht, &f->cookie,
				      tc->ht_params);
				      tc->ht_params);
	if (flow)
	if (flow) {
		old = flow->rule;
		old = flow->rule;
	} else {
		if (fdb_flow)
			flow = kzalloc(sizeof(*flow) + sizeof(struct mlx5_esw_flow_attr),
				       GFP_KERNEL);
		else
		else
			flow = kzalloc(sizeof(*flow), GFP_KERNEL);
			flow = kzalloc(sizeof(*flow), GFP_KERNEL);
	}


	spec = mlx5_vzalloc(sizeof(*spec));
	spec = mlx5_vzalloc(sizeof(*spec));
	if (!spec || !flow) {
	if (!spec || !flow) {
@@ -436,11 +442,12 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
	if (err < 0)
	if (err < 0)
		goto err_free;
		goto err_free;


	if (esw && esw->mode == SRIOV_OFFLOADS) {
	if (fdb_flow) {
		err = parse_tc_fdb_actions(priv, f->exts, &action, &dest_vport);
		flow->attr  = (struct mlx5_esw_flow_attr *)(flow + 1);
		err = parse_tc_fdb_actions(priv, f->exts, flow->attr);
		if (err < 0)
		if (err < 0)
			goto err_free;
			goto err_free;
		flow->rule = mlx5e_tc_add_fdb_flow(priv, spec, action, dest_vport);
		flow->rule = mlx5e_tc_add_fdb_flow(priv, spec, flow->attr);
	} else {
	} else {
		err = parse_tc_nic_actions(priv, f->exts, &action, &flow_tag);
		err = parse_tc_nic_actions(priv, f->exts, &action, &flow_tag);
		if (err < 0)
		if (err < 0)
+9 −1
Original line number Original line Diff line number Diff line
@@ -238,11 +238,12 @@ int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
				 struct ifla_vf_stats *vf_stats);
				 struct ifla_vf_stats *vf_stats);


struct mlx5_flow_spec;
struct mlx5_flow_spec;
struct mlx5_esw_flow_attr;


struct mlx5_flow_rule *
struct mlx5_flow_rule *
mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
				struct mlx5_flow_spec *spec,
				struct mlx5_flow_spec *spec,
				u32 action, u32 src_vport, u32 dst_vport);
				struct mlx5_esw_flow_attr *attr);
struct mlx5_flow_rule *
struct mlx5_flow_rule *
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport, u32 tirn);
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport, u32 tirn);


@@ -251,6 +252,13 @@ enum {
	SET_VLAN_INSERT	= BIT(1)
	SET_VLAN_INSERT	= BIT(1)
};
};


struct mlx5_esw_flow_attr {
	struct mlx5_eswitch_rep *in_rep;
	struct mlx5_eswitch_rep *out_rep;

	int	action;
};

int mlx5_eswitch_sqs2vport_start(struct mlx5_eswitch *esw,
int mlx5_eswitch_sqs2vport_start(struct mlx5_eswitch *esw,
				 struct mlx5_eswitch_rep *rep,
				 struct mlx5_eswitch_rep *rep,
				 u16 *sqns_array, int sqns_num);
				 u16 *sqns_array, int sqns_num);
+6 −3
Original line number Original line Diff line number Diff line
@@ -46,19 +46,22 @@ enum {
struct mlx5_flow_rule *
struct mlx5_flow_rule *
mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
				struct mlx5_flow_spec *spec,
				struct mlx5_flow_spec *spec,
				u32 action, u32 src_vport, u32 dst_vport)
				struct mlx5_esw_flow_attr *attr)
{
{
	struct mlx5_flow_destination dest = { 0 };
	struct mlx5_flow_destination dest = { 0 };
	struct mlx5_fc *counter = NULL;
	struct mlx5_fc *counter = NULL;
	struct mlx5_flow_rule *rule;
	struct mlx5_flow_rule *rule;
	void *misc;
	void *misc;
	int action;


	if (esw->mode != SRIOV_OFFLOADS)
	if (esw->mode != SRIOV_OFFLOADS)
		return ERR_PTR(-EOPNOTSUPP);
		return ERR_PTR(-EOPNOTSUPP);


	action = attr->action;

	if (action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
	if (action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
		dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
		dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
		dest.vport_num = dst_vport;
		dest.vport_num = attr->out_rep->vport;
		action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
		action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
	} else if (action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
	} else if (action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
		counter = mlx5_fc_create(esw->dev, true);
		counter = mlx5_fc_create(esw->dev, true);
@@ -69,7 +72,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
	}
	}


	misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
	misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
	MLX5_SET(fte_match_set_misc, misc, source_port, src_vport);
	MLX5_SET(fte_match_set_misc, misc, source_port, attr->in_rep->vport);


	misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
	misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
	MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);
	MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_port);