Date: Mon, 26 Jul 2021 15:19:38 GMT From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 779fd2390b97 - stable/13 - mlx5en: remove all dynamic vxlan steering rules on close and reinstall on open Message-ID: <202107261519.16QFJcXq025638@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=779fd2390b97c18bcfc88ad717cef9c2171b5e85 commit 779fd2390b97c18bcfc88ad717cef9c2171b5e85 Author: Konstantin Belousov <konstantinb@nvidia.com> AuthorDate: 2021-04-14 07:09:36 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2021-07-26 13:51:11 +0000 mlx5en: remove all dynamic vxlan steering rules on close and reinstall on open (cherry picked from commit 0e4cb0d5a487339cc7f5e151c466e20aeac1e4d9) --- sys/dev/mlx5/mlx5_en/en.h | 4 ++++ sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c | 36 ++++++++++++++++++++++++++++++- sys/dev/mlx5/mlx5_en/mlx5_en_main.c | 10 +++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/sys/dev/mlx5/mlx5_en/en.h b/sys/dev/mlx5/mlx5_en/en.h index ab30c7e2ca90..e4b66bea8f60 100644 --- a/sys/dev/mlx5/mlx5_en/en.h +++ b/sys/dev/mlx5/mlx5_en/en.h @@ -948,6 +948,7 @@ struct mlx5e_vxlan_db_el { u_int refcount; u_int proto; u_int port; + bool installed; struct mlx5_flow_rule *vxlan_ft_rule; TAILQ_ENTRY(mlx5e_vxlan_db_el) link; }; @@ -1149,6 +1150,9 @@ void mlx5e_vxlan_start(void *arg, struct ifnet *ifp, sa_family_t family, void mlx5e_vxlan_stop(void *arg, struct ifnet *ifp, sa_family_t family, u_int port); +int mlx5e_add_all_vxlan_rules(struct mlx5e_priv *priv); +void mlx5e_del_all_vxlan_rules(struct mlx5e_priv *priv); + static inline void mlx5e_tx_notify_hw(struct mlx5e_sq *sq, u32 *wqe) { diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c b/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c index 648dc199157c..a493e530a4c8 100644 --- a/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c +++ b/sys/dev/mlx5/mlx5_en/mlx5_en_flow_table.c @@ -1840,13 +1840,15 @@ mlx5e_add_vxlan_rule(struct mlx5e_priv *priv, sa_family_t family, u_int port) el = mlx5e_vxlan_find_db_el(priv, proto, port); if (el != NULL) { el->refcount++; - return (0); + if (el->installed) + return (0); } el = mlx5e_vxlan_alloc_db_el(priv, proto, port); err = mlx5e_add_vxlan_rule_from_db(priv, el); if (err == 0) { TAILQ_INSERT_TAIL(&priv->vxlan.head, el, link); + el->installed = true; } else { kvfree(el); } @@ -1905,6 +1907,25 @@ add_vxlan_rule_out: return (err); } +int +mlx5e_add_all_vxlan_rules(struct mlx5e_priv *priv) +{ + struct mlx5e_vxlan_db_el *el; + int err; + + err = 0; + TAILQ_FOREACH(el, &priv->vxlan.head, link) { + if (el->installed) + continue; + err = mlx5e_add_vxlan_rule_from_db(priv, el); + if (err != 0) + break; + el->installed = false; + } + + return (err); +} + static int mlx5e_del_vxlan_rule(struct mlx5e_priv *priv, sa_family_t family, u_int port) { @@ -1930,6 +1951,19 @@ mlx5e_del_vxlan_rule(struct mlx5e_priv *priv, sa_family_t family, u_int port) return (0); } +void +mlx5e_del_all_vxlan_rules(struct mlx5e_priv *priv) +{ + struct mlx5e_vxlan_db_el *el; + + TAILQ_FOREACH(el, &priv->vxlan.head, link) { + if (!el->installed) + continue; + mlx5_del_flow_rule(el->vxlan_ft_rule); + el->installed = false; + } +} + static void mlx5e_del_vxlan_catchall_rule(struct mlx5e_priv *priv) { diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c index 26bd5e00d22d..9a01940ca90c 100644 --- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c +++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c @@ -3144,6 +3144,12 @@ mlx5e_open_locked(struct ifnet *ifp) "mlx5e_add_all_vlan_rules failed, %d\n", err); goto err_close_flow_table; } + err = mlx5e_add_all_vxlan_rules(priv); + if (err) { + mlx5_en_err(ifp, + "mlx5e_add_all_vxlan_rules failed, %d\n", err); + goto err_del_vlan_rules; + } set_bit(MLX5E_STATE_OPENED, &priv->state); mlx5e_update_carrier(priv); @@ -3151,6 +3157,9 @@ mlx5e_open_locked(struct ifnet *ifp) return (0); +err_del_vlan_rules: + mlx5e_del_all_vlan_rules(priv); + err_close_flow_table: mlx5e_close_flow_table(priv); @@ -3204,6 +3213,7 @@ mlx5e_close_locked(struct ifnet *ifp) mlx5e_set_rx_mode_core(priv); mlx5e_del_all_vlan_rules(priv); + mlx5e_del_all_vxlan_rules(priv); if_link_state_change(priv->ifp, LINK_STATE_DOWN); mlx5e_close_flow_table(priv); mlx5e_close_tirs(priv, true);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202107261519.16QFJcXq025638>