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

Commit 9aac3c18 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'offloading-tc-rules-hw'



Hadar Hen Zion says:

====================
Offloading tc rules using underline Hardware device

This series adds flower classifier support in offloading tc rules when the
Software ingress device is different from the Hardware ingress device,
such as when dealing with IP tunnels

The first two patches are a small fixes to flower, checking the skip_hw flag
wasn't set before calling the Hardware offloading functions which will try to
offload the rule.

The next two patches are infrastructure patches, a preparation for the fourth
patch which is adding support in flower to offload rules when the ingress
device is not a Hardware device and therefore can't offload.
In this case ndo_setup_tc is called with the mirred (egress) device.

The last three patchs are adding mlx5e support to offload rules using the new
"egress_device" flag.

Thanks,
Hadar

Changes from v0:
- check if CONFIG_NET_CLS_ACT is defined befor calling tc_action_ops get_dev()
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 25429d7b ebe06875
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3811,7 +3811,7 @@ static void mlx5e_nic_enable(struct mlx5e_priv *priv)
		rep.load = mlx5e_nic_rep_load;
		rep.unload = mlx5e_nic_rep_unload;
		rep.vport = FDB_UPLINK_VPORT;
		rep.priv_data = priv;
		rep.netdev = netdev;
		mlx5_eswitch_register_vport_rep(esw, 0, &rep);
	}
}
+18 −7
Original line number Diff line number Diff line
@@ -208,7 +208,8 @@ int mlx5e_add_sqs_fwd_rules(struct mlx5e_priv *priv)

int mlx5e_nic_rep_load(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep)
{
	struct mlx5e_priv *priv = rep->priv_data;
	struct net_device *netdev = rep->netdev;
	struct mlx5e_priv *priv = netdev_priv(netdev);

	if (test_bit(MLX5E_STATE_OPENED, &priv->state))
		return mlx5e_add_sqs_fwd_rules(priv);
@@ -226,7 +227,8 @@ void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv)
void mlx5e_nic_rep_unload(struct mlx5_eswitch *esw,
			  struct mlx5_eswitch_rep *rep)
{
	struct mlx5e_priv *priv = rep->priv_data;
	struct net_device *netdev = rep->netdev;
	struct mlx5e_priv *priv = netdev_priv(netdev);

	if (test_bit(MLX5E_STATE_OPENED, &priv->state))
		mlx5e_remove_sqs_fwd_rules(priv);
@@ -287,6 +289,14 @@ static int mlx5e_rep_ndo_setup_tc(struct net_device *dev, u32 handle,
	if (TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS))
		return -EOPNOTSUPP;

	if (tc->egress_dev) {
		struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
		struct net_device *uplink_dev = mlx5_eswitch_get_uplink_netdev(esw);

		return uplink_dev->netdev_ops->ndo_setup_tc(uplink_dev, handle,
							    proto, tc);
	}

	switch (tc->type) {
	case TC_SETUP_CLSFLOWER:
		switch (tc->cls_flower->command) {
@@ -384,6 +394,8 @@ static const struct net_device_ops mlx5e_netdev_ops_rep = {
	.ndo_get_phys_port_name  = mlx5e_rep_get_phys_port_name,
	.ndo_setup_tc            = mlx5e_rep_ndo_setup_tc,
	.ndo_get_stats64         = mlx5e_rep_get_stats,
	.ndo_udp_tunnel_add      = mlx5e_add_vxlan_port,
	.ndo_udp_tunnel_del      = mlx5e_del_vxlan_port,
	.ndo_has_offload_stats	 = mlx5e_has_offload_stats,
	.ndo_get_offload_stats	 = mlx5e_get_offload_stats,
};
@@ -553,7 +565,7 @@ int mlx5e_vport_rep_load(struct mlx5_eswitch *esw,
		return -EINVAL;
	}

	rep->priv_data = netdev_priv(netdev);
	rep->netdev = netdev;

	err = mlx5e_attach_netdev(esw->dev, netdev);
	if (err) {
@@ -575,7 +587,7 @@ int mlx5e_vport_rep_load(struct mlx5_eswitch *esw,
	mlx5e_detach_netdev(esw->dev, netdev);

err_destroy_netdev:
	mlx5e_destroy_netdev(esw->dev, rep->priv_data);
	mlx5e_destroy_netdev(esw->dev, netdev_priv(netdev));

	return err;

@@ -584,10 +596,9 @@ int mlx5e_vport_rep_load(struct mlx5_eswitch *esw,
void mlx5e_vport_rep_unload(struct mlx5_eswitch *esw,
			    struct mlx5_eswitch_rep *rep)
{
	struct mlx5e_priv *priv = rep->priv_data;
	struct net_device *netdev = priv->netdev;
	struct net_device *netdev = rep->netdev;

	unregister_netdev(netdev);
	mlx5e_detach_netdev(esw->dev, netdev);
	mlx5e_destroy_netdev(esw->dev, priv);
	mlx5e_destroy_netdev(esw->dev, netdev_priv(netdev));
}
+2 −1
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ struct mlx5_eswitch_rep {
					 struct mlx5_eswitch_rep *rep);
	u16		       vport;
	u8		       hw_id[ETH_ALEN];
	void		      *priv_data;
	struct net_device      *netdev;

	struct mlx5_flow_handle *vport_rx_rule;
	struct list_head       vport_sqs_list;
@@ -318,6 +318,7 @@ void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
				     struct mlx5_eswitch_rep *rep);
void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,
				       int vport_index);
struct net_device *mlx5_eswitch_get_uplink_netdev(struct mlx5_eswitch *esw);

int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
				 struct mlx5_esw_flow_attr *attr);
+11 −1
Original line number Diff line number Diff line
@@ -970,7 +970,7 @@ void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
	rep->load   = __rep->load;
	rep->unload = __rep->unload;
	rep->vport  = __rep->vport;
	rep->priv_data = __rep->priv_data;
	rep->netdev = __rep->netdev;
	ether_addr_copy(rep->hw_id, __rep->hw_id);

	INIT_LIST_HEAD(&rep->vport_sqs_list);
@@ -990,3 +990,13 @@ void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,

	rep->valid = false;
}

struct net_device *mlx5_eswitch_get_uplink_netdev(struct mlx5_eswitch *esw)
{
#define UPLINK_REP_INDEX 0
	struct mlx5_esw_offload *offloads = &esw->offloads;
	struct mlx5_eswitch_rep *rep;

	rep = &offloads->vport_reps[UPLINK_REP_INDEX];
	return rep->netdev;
}
+1 −0
Original line number Diff line number Diff line
@@ -802,6 +802,7 @@ struct tc_to_netdev {
		struct tc_cls_matchall_offload *cls_mall;
		struct tc_cls_bpf_offload *cls_bpf;
	};
	bool egress_dev;
};

/* These structures hold the attributes of xdp state that are being passed
Loading