Message ID | 1548718086-20924-1-git-send-email-xiangxia.m.yue@gmail.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | [net,v5,1/2] net/mlx5e: Update hw flows when encap source mac changed | expand |
On Tue, Jan 29, 2019 at 8:05 PM <xiangxia.m.yue@gmail.com> wrote: > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > When we offload tc filters to hardware, hardware flows can > be updated when mac of encap destination ip is changed. > But we ignore one case, that the mac of local encap ip can > be changed too, so we should also update them. > > To fix it, add route_dev in mlx5e_encap_entry struct to save > the local encap netdevice, and when mac changed, kernel will > flush all the neighbour on the netdevice and send NETEVENT_NEIGH_UPDATE > event. The mlx5 driver will delete the flows and add them when neighbour > available again. > > Fixes: 232c001398ae ("net/mlx5e: Add support to neighbour update flow") > Cc: Hadar Hen Zion <hadarh@mellanox.com> > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> This is good to go upstream, well done Tonghao!
On Mon, 2019-01-28 at 15:28 -0800, xiangxia.m.yue@gmail.com wrote: > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > When we offload tc filters to hardware, hardware flows can > be updated when mac of encap destination ip is changed. > But we ignore one case, that the mac of local encap ip can > be changed too, so we should also update them. > > To fix it, add route_dev in mlx5e_encap_entry struct to save > the local encap netdevice, and when mac changed, kernel will > flush all the neighbour on the netdevice and send > NETEVENT_NEIGH_UPDATE > event. The mlx5 driver will delete the flows and add them when > neighbour > available again. > > Fixes: 232c001398ae ("net/mlx5e: Add support to neighbour update > flow") > Cc: Hadar Hen Zion <hadarh@mellanox.com> > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> > > Thank you Tonghao and Or. Acked-by: Saeed Mahameed <saeedm@mellanox.com>
On Wed, Jan 30, 2019 at 12:20 AM Saeed Mahameed <saeedm@mellanox.com> wrote: > > On Mon, 2019-01-28 at 15:28 -0800, xiangxia.m.yue@gmail.com wrote: > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > > > When we offload tc filters to hardware, hardware flows can > > be updated when mac of encap destination ip is changed. > > But we ignore one case, that the mac of local encap ip can > > be changed too, so we should also update them. > > > > To fix it, add route_dev in mlx5e_encap_entry struct to save > > the local encap netdevice, and when mac changed, kernel will > > flush all the neighbour on the netdevice and send > > NETEVENT_NEIGH_UPDATE > > event. The mlx5 driver will delete the flows and add them when > > neighbour > > available again. > > > > Fixes: 232c001398ae ("net/mlx5e: Add support to neighbour update > > flow") > > Cc: Hadar Hen Zion <hadarh@mellanox.com> > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> > > > > > > Thank you Tonghao and Or. > > Acked-by: Saeed Mahameed <saeedm@mellanox.com> Dave, I see a copy of the patch on patchworks [1] with status being not applicable, what is missing here? the patch should apply AFAIK. There was also another patch reviewed here by me and Saeed [2], not sure where it stands from your side. [1] https://patchwork.ozlabs.org/patch/1023844/ [2] https://marc.info/?l=linux-netdev&m=154878514916414&w=2
From: Or Gerlitz <gerlitz.or@gmail.com> Date: Tue, 5 Feb 2019 11:03:01 +0200 > Dave, I see a copy of the patch on patchworks [1] with status being > not applicable, what is missing here? the patch should apply AFAIK. > There was also another patch reviewed here by me and Saeed [2], not > sure where it stands from your side. > > [1] https://patchwork.ozlabs.org/patch/1023844/ > [2] https://marc.info/?l=linux-netdev&m=154878514916414&w=2 More precisely, it's marked "Awaiting Upstream" which means I for some reason expected Saeed to send it to me in his next pull request. I'll apply these now.
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c index 046948e..114e0a2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c @@ -256,6 +256,7 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv, e->m_neigh.family = n->ops->family; memcpy(&e->m_neigh.dst_ip, n->primary_key, n->tbl->key_len); e->out_dev = out_dev; + e->route_dev = route_dev; /* It's important to add the neigh to the hash table before checking * the neigh validity state. So if we'll get a notification, in case the @@ -369,6 +370,7 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv, e->m_neigh.family = n->ops->family; memcpy(&e->m_neigh.dst_ip, n->primary_key, n->tbl->key_len); e->out_dev = out_dev; + e->route_dev = route_dev; /* It's importent to add the neigh to the hash table before checking * the neigh validity state. So if we'll get a notification, in case the diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 96cc0c6..c4b9073 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -594,6 +594,10 @@ static void mlx5e_rep_update_flows(struct mlx5e_priv *priv, if (neigh_connected && !(e->flags & MLX5_ENCAP_ENTRY_VALID)) { ether_addr_copy(e->h_dest, ha); ether_addr_copy(eth->h_dest, ha); + /* Update the encap source mac, in case that we delete + * the flows when encap source mac changed. + */ + ether_addr_copy(eth->h_source, e->route_dev->dev_addr); mlx5e_tc_encap_flows_add(priv, e); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h index edd7228..36eafc8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h @@ -148,6 +148,7 @@ struct mlx5e_encap_entry { unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ struct net_device *out_dev; + struct net_device *route_dev; int tunnel_type; int tunnel_hlen; int reformat_type;