net/mlx5: make VLAN network interface thread safe
authorSuanming Mou <suanmingm@nvidia.com>
Wed, 28 Oct 2020 09:33:27 +0000 (17:33 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 3 Nov 2020 22:35:04 +0000 (23:35 +0100)
This commit protects the VLAN VM workaround area using a spinlock
in multiple-thread flow insertion to make it thread safe.

Signed-off-by: Suanming Mou <suanmingm@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
drivers/common/mlx5/linux/mlx5_nl.h
drivers/net/mlx5/linux/mlx5_vlan_os.c

index 53021e1..15129ff 100644 (file)
@@ -25,6 +25,7 @@ struct mlx5_nl_vlan_dev {
 struct mlx5_nl_vlan_vmwa_context {
        int nl_socket;
        uint32_t vf_ifindex;
+       rte_spinlock_t sl;
        struct mlx5_nl_vlan_dev vlan_dev[4096];
 };
 
index 92fc17d..40e895e 100644 (file)
@@ -44,12 +44,14 @@ mlx5_vlan_vmwa_release(struct rte_eth_dev *dev,
        if (!vlan->created || !vmwa)
                return;
        vlan->created = 0;
+       rte_spinlock_lock(&vmwa->sl);
        MLX5_ASSERT(vlan_dev[vlan->tag].refcnt);
        if (--vlan_dev[vlan->tag].refcnt == 0 &&
            vlan_dev[vlan->tag].ifindex) {
                mlx5_nl_vlan_vmwa_delete(vmwa, vlan_dev[vlan->tag].ifindex);
                vlan_dev[vlan->tag].ifindex = 0;
        }
+       rte_spinlock_unlock(&vmwa->sl);
 }
 
 /**
@@ -72,6 +74,7 @@ mlx5_vlan_vmwa_acquire(struct rte_eth_dev *dev,
        MLX5_ASSERT(priv->vmwa_context);
        if (vlan->created || !vmwa)
                return;
+       rte_spinlock_lock(&vmwa->sl);
        if (vlan_dev[vlan->tag].refcnt == 0) {
                MLX5_ASSERT(!vlan_dev[vlan->tag].ifindex);
                vlan_dev[vlan->tag].ifindex =
@@ -82,6 +85,7 @@ mlx5_vlan_vmwa_acquire(struct rte_eth_dev *dev,
                vlan_dev[vlan->tag].refcnt++;
                vlan->created = 1;
        }
+       rte_spinlock_unlock(&vmwa->sl);
 }
 
 /*
@@ -131,6 +135,7 @@ mlx5_vlan_vmwa_init(struct rte_eth_dev *dev, uint32_t ifindex)
                        " for VLAN workaround context");
                return NULL;
        }
+       rte_spinlock_init(&vmwa->sl);
        vmwa->nl_socket = mlx5_nl_init(NETLINK_ROUTE);
        if (vmwa->nl_socket < 0) {
                DRV_LOG(WARNING,