ethdev: add lock to port allocation check
[dpdk.git] / lib / librte_ethdev / rte_ethdev.c
index 3578b87..c33d51e 100644 (file)
@@ -234,8 +234,8 @@ is_allocated(const struct rte_eth_dev *ethdev)
        return ethdev->data->name[0] != '\0';
 }
 
-struct rte_eth_dev *
-rte_eth_dev_allocated(const char *name)
+static struct rte_eth_dev *
+_rte_eth_dev_allocated(const char *name)
 {
        unsigned i;
 
@@ -247,6 +247,22 @@ rte_eth_dev_allocated(const char *name)
        return NULL;
 }
 
+struct rte_eth_dev *
+rte_eth_dev_allocated(const char *name)
+{
+       struct rte_eth_dev *ethdev;
+
+       rte_eth_dev_shared_data_prepare();
+
+       rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
+
+       ethdev = _rte_eth_dev_allocated(name);
+
+       rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
+
+       return ethdev;
+}
+
 static uint16_t
 rte_eth_dev_find_free_port(void)
 {
@@ -293,7 +309,7 @@ rte_eth_dev_allocate(const char *name)
                goto unlock;
        }
 
-       if (rte_eth_dev_allocated(name) != NULL) {
+       if (_rte_eth_dev_allocated(name) != NULL) {
                ethdev_log(ERR,
                        "Ethernet Device with name %s already allocated!",
                        name);