Commit a082c4f4 authored by Gal Pressman's avatar Gal Pressman Committed by Saeed Mahameed

net/mlx5e: Vxlan, reflect 4789 UDP port default addition to software database

The hardware offloads 4789 UDP port (default VXLAN port) automatically.
Add it to the software database as well in order to reflect the hardware
state appropriately.
Signed-off-by: default avatarGal Pressman <galp@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 1f3ed383
...@@ -36,12 +36,20 @@ ...@@ -36,12 +36,20 @@
#include "mlx5_core.h" #include "mlx5_core.h"
#include "vxlan.h" #include "vxlan.h"
static void mlx5e_vxlan_add_port(struct mlx5e_priv *priv, u16 port);
void mlx5e_vxlan_init(struct mlx5e_priv *priv) void mlx5e_vxlan_init(struct mlx5e_priv *priv)
{ {
struct mlx5e_vxlan_db *vxlan_db = &priv->vxlan; struct mlx5e_vxlan_db *vxlan_db = &priv->vxlan;
spin_lock_init(&vxlan_db->lock); spin_lock_init(&vxlan_db->lock);
INIT_RADIX_TREE(&vxlan_db->tree, GFP_ATOMIC); INIT_RADIX_TREE(&vxlan_db->tree, GFP_ATOMIC);
if (mlx5e_vxlan_allowed(priv->mdev))
/* Hardware adds 4789 by default.
* Lockless since we are the only hash table consumers, wq and TX are disabled.
*/
mlx5e_vxlan_add_port(priv, 4789);
} }
static int mlx5e_vxlan_core_add_port_cmd(struct mlx5_core_dev *mdev, u16 port) static int mlx5e_vxlan_core_add_port_cmd(struct mlx5_core_dev *mdev, u16 port)
...@@ -78,25 +86,20 @@ struct mlx5e_vxlan *mlx5e_vxlan_lookup_port(struct mlx5e_priv *priv, u16 port) ...@@ -78,25 +86,20 @@ struct mlx5e_vxlan *mlx5e_vxlan_lookup_port(struct mlx5e_priv *priv, u16 port)
return vxlan; return vxlan;
} }
static void mlx5e_vxlan_add_port(struct work_struct *work) static void mlx5e_vxlan_add_port(struct mlx5e_priv *priv, u16 port)
{ {
struct mlx5e_vxlan_work *vxlan_work =
container_of(work, struct mlx5e_vxlan_work, work);
struct mlx5e_priv *priv = vxlan_work->priv;
struct mlx5e_vxlan_db *vxlan_db = &priv->vxlan; struct mlx5e_vxlan_db *vxlan_db = &priv->vxlan;
u16 port = vxlan_work->port;
struct mlx5e_vxlan *vxlan; struct mlx5e_vxlan *vxlan;
int err; int err;
mutex_lock(&priv->state_lock);
vxlan = mlx5e_vxlan_lookup_port(priv, port); vxlan = mlx5e_vxlan_lookup_port(priv, port);
if (vxlan) { if (vxlan) {
atomic_inc(&vxlan->refcount); atomic_inc(&vxlan->refcount);
goto free_work; return;
} }
if (mlx5e_vxlan_core_add_port_cmd(priv->mdev, port)) if (mlx5e_vxlan_core_add_port_cmd(priv->mdev, port))
goto free_work; return;
vxlan = kzalloc(sizeof(*vxlan), GFP_KERNEL); vxlan = kzalloc(sizeof(*vxlan), GFP_KERNEL);
if (!vxlan) if (!vxlan)
...@@ -111,18 +114,29 @@ static void mlx5e_vxlan_add_port(struct work_struct *work) ...@@ -111,18 +114,29 @@ static void mlx5e_vxlan_add_port(struct work_struct *work)
if (err) if (err)
goto err_free; goto err_free;
goto free_work; return;
err_free: err_free:
kfree(vxlan); kfree(vxlan);
err_delete_port: err_delete_port:
mlx5e_vxlan_core_del_port_cmd(priv->mdev, port); mlx5e_vxlan_core_del_port_cmd(priv->mdev, port);
free_work: }
static void mlx5e_vxlan_add_work(struct work_struct *work)
{
struct mlx5e_vxlan_work *vxlan_work =
container_of(work, struct mlx5e_vxlan_work, work);
struct mlx5e_priv *priv = vxlan_work->priv;
u16 port = vxlan_work->port;
mutex_lock(&priv->state_lock);
mlx5e_vxlan_add_port(priv, port);
mutex_unlock(&priv->state_lock); mutex_unlock(&priv->state_lock);
kfree(vxlan_work); kfree(vxlan_work);
} }
static void mlx5e_vxlan_del_port(struct work_struct *work) static void mlx5e_vxlan_del_work(struct work_struct *work)
{ {
struct mlx5e_vxlan_work *vxlan_work = struct mlx5e_vxlan_work *vxlan_work =
container_of(work, struct mlx5e_vxlan_work, work); container_of(work, struct mlx5e_vxlan_work, work);
...@@ -164,9 +178,9 @@ void mlx5e_vxlan_queue_work(struct mlx5e_priv *priv, sa_family_t sa_family, ...@@ -164,9 +178,9 @@ void mlx5e_vxlan_queue_work(struct mlx5e_priv *priv, sa_family_t sa_family,
return; return;
if (add) if (add)
INIT_WORK(&vxlan_work->work, mlx5e_vxlan_add_port); INIT_WORK(&vxlan_work->work, mlx5e_vxlan_add_work);
else else
INIT_WORK(&vxlan_work->work, mlx5e_vxlan_del_port); INIT_WORK(&vxlan_work->work, mlx5e_vxlan_del_work);
vxlan_work->priv = priv; vxlan_work->priv = priv;
vxlan_work->port = port; vxlan_work->port = port;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment