net/bnxt: consolidate template table processing
[dpdk.git] / lib / librte_eal / linux / eal.c
index 3b56d14..9cf0e2e 100644 (file)
@@ -47,7 +47,6 @@
 #include <rte_dev.h>
 #include <rte_devargs.h>
 #include <rte_version.h>
-#include <rte_atomic.h>
 #include <malloc_heap.h>
 #include <rte_vfio.h>
 #include <rte_telemetry.h>
@@ -492,6 +491,10 @@ rte_config_init(void)
                }
                if (rte_eal_config_reattach() < 0)
                        return -1;
+               if (!__rte_mp_enable()) {
+                       RTE_LOG(ERR, EAL, "Primary process refused secondary attachment\n");
+                       return -1;
+               }
                eal_mcfg_update_internal();
                break;
        case RTE_PROC_AUTO:
@@ -540,6 +543,7 @@ eal_usage(const char *prgname)
               "  --"OPT_FILE_PREFIX"       Prefix for hugepage filenames\n"
               "  --"OPT_CREATE_UIO_DEV"    Create /dev/uioX (usually done by hotplug)\n"
               "  --"OPT_VFIO_INTR"         Interrupt mode for VFIO (legacy|msi|msix)\n"
+              "  --"OPT_VFIO_VF_TOKEN"     VF token (UUID) shared between SR-IOV PF and VFs\n"
               "  --"OPT_LEGACY_MEM"        Legacy memory mode (no dynamic allocation, contiguous segments)\n"
               "  --"OPT_SINGLE_FILE_SEGMENTS" Put all hugepage memory in single files\n"
               "  --"OPT_MATCH_ALLOCATIONS" Free hugepages exactly as allocated\n"
@@ -620,6 +624,20 @@ eal_parse_vfio_intr(const char *mode)
        return -1;
 }
 
+static int
+eal_parse_vfio_vf_token(const char *vf_token)
+{
+       struct internal_config *cfg = eal_get_internal_configuration();
+       rte_uuid_t uuid;
+
+       if (!rte_uuid_parse(vf_token, uuid)) {
+               rte_uuid_copy(cfg->vfio_vf_token, uuid);
+               return 0;
+       }
+
+       return -1;
+}
+
 /* Parse the arguments for --log-level only */
 static void
 eal_log_level_parse(int argc, char **argv)
@@ -762,6 +780,16 @@ eal_parse_args(int argc, char **argv)
                        }
                        break;
 
+               case OPT_VFIO_VF_TOKEN_NUM:
+                       if (eal_parse_vfio_vf_token(optarg) < 0) {
+                               RTE_LOG(ERR, EAL, "invalid parameters for --"
+                                               OPT_VFIO_VF_TOKEN "\n");
+                               eal_usage(prgname);
+                               ret = -1;
+                               goto out;
+                       }
+                       break;
+
                case OPT_CREATE_UIO_DEV_NUM:
                        internal_conf->create_uio_dev = 1;
                        break;
@@ -931,7 +959,8 @@ rte_eal_init(int argc, char **argv)
 {
        int i, fctret, ret;
        pthread_t thread_id;
-       static rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0);
+       static uint32_t run_once;
+       uint32_t has_run = 0;
        const char *p;
        static char logid[PATH_MAX];
        char cpuset[RTE_CPU_AFFINITY_STR_LEN];
@@ -948,7 +977,8 @@ rte_eal_init(int argc, char **argv)
                return -1;
        }
 
-       if (!rte_atomic32_test_and_set(&run_once)) {
+       if (!__atomic_compare_exchange_n(&run_once, &has_run, 1, 0,
+                                       __ATOMIC_RELAXED, __ATOMIC_RELAXED)) {
                rte_eal_init_alert("already called initialization.");
                rte_errno = EALREADY;
                return -1;
@@ -976,14 +1006,14 @@ rte_eal_init(int argc, char **argv)
        if (fctret < 0) {
                rte_eal_init_alert("Invalid 'command line' arguments.");
                rte_errno = EINVAL;
-               rte_atomic32_clear(&run_once);
+               __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
                return -1;
        }
 
        if (eal_plugins_init() < 0) {
                rte_eal_init_alert("Cannot init plugins");
                rte_errno = EINVAL;
-               rte_atomic32_clear(&run_once);
+               __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
                return -1;
        }
 
@@ -995,7 +1025,7 @@ rte_eal_init(int argc, char **argv)
 
        if (eal_option_device_parse()) {
                rte_errno = ENODEV;
-               rte_atomic32_clear(&run_once);
+               __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
                return -1;
        }
 
@@ -1035,7 +1065,7 @@ rte_eal_init(int argc, char **argv)
        if (rte_bus_scan()) {
                rte_eal_init_alert("Cannot scan the buses for devices");
                rte_errno = ENODEV;
-               rte_atomic32_clear(&run_once);
+               __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
                return -1;
        }
 
@@ -1109,7 +1139,7 @@ rte_eal_init(int argc, char **argv)
                if (ret < 0) {
                        rte_eal_init_alert("Cannot get hugepage information.");
                        rte_errno = EACCES;
-                       rte_atomic32_clear(&run_once);
+                       __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
                        return -1;
                }
        }
@@ -1133,7 +1163,7 @@ rte_eal_init(int argc, char **argv)
        if (rte_eal_log_init(logid, internal_conf->syslog_facility) < 0) {
                rte_eal_init_alert("Cannot init logging.");
                rte_errno = ENOMEM;
-               rte_atomic32_clear(&run_once);
+               __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
                return -1;
        }
 
@@ -1141,7 +1171,7 @@ rte_eal_init(int argc, char **argv)
        if (rte_eal_vfio_setup() < 0) {
                rte_eal_init_alert("Cannot init VFIO");
                rte_errno = EAGAIN;
-               rte_atomic32_clear(&run_once);
+               __atomic_store_n(&run_once, 0, __ATOMIC_RELAXED);
                return -1;
        }
 #endif
@@ -1184,10 +1214,16 @@ rte_eal_init(int argc, char **argv)
 
        eal_check_mem_on_local_socket();
 
-       eal_thread_init_master(config->master_lcore);
-
-       ret = eal_thread_dump_affinity(cpuset, sizeof(cpuset));
+       if (pthread_setaffinity_np(pthread_self(), sizeof(rte_cpuset_t),
+                       &lcore_config[config->master_lcore].cpuset) != 0) {
+               rte_eal_init_alert("Cannot set affinity");
+               rte_errno = EINVAL;
+               return -1;
+       }
+       __rte_thread_init(config->master_lcore,
+               &lcore_config[config->master_lcore].cpuset);
 
+       ret = eal_thread_dump_current_affinity(cpuset, sizeof(cpuset));
        RTE_LOG(DEBUG, EAL, "Master lcore %u is ready (tid=%zx;cpuset=[%s%s])\n",
                config->master_lcore, (uintptr_t)thread_id, cpuset,
                ret == 0 ? "" : "...");
@@ -1219,6 +1255,11 @@ rte_eal_init(int argc, char **argv)
                if (ret != 0)
                        RTE_LOG(DEBUG, EAL,
                                "Cannot set name for lcore thread\n");
+
+               ret = pthread_setaffinity_np(lcore_config[i].thread_id,
+                       sizeof(rte_cpuset_t), &lcore_config[i].cpuset);
+               if (ret != 0)
+                       rte_panic("Cannot set affinity\n");
        }
 
        /*
@@ -1342,6 +1383,14 @@ rte_eal_vfio_intr_mode(void)
        return internal_conf->vfio_intr_mode;
 }
 
+void
+rte_eal_vfio_get_vf_token(rte_uuid_t vf_token)
+{
+       struct internal_config *cfg = eal_get_internal_configuration();
+
+       rte_uuid_copy(vf_token, cfg->vfio_vf_token);
+}
+
 int
 rte_eal_check_module(const char *module_name)
 {