eal: do not panic when CPU is not supported
authorAaron Conole <aconole@redhat.com>
Wed, 22 Mar 2017 20:19:28 +0000 (16:19 -0400)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 27 Mar 2017 13:50:09 +0000 (15:50 +0200)
This adds a new API to check for the eal cpu versions.

It's now possible to gracefully exit the application, or for
applications which support non-dpdk datapaths working in concert with
DPDK datapaths, there no longer is the possibility of exiting for
unsupported CPUs.

Signed-off-by: Aaron Conole <aconole@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
lib/librte_eal/bsdapp/eal/eal.c
lib/librte_eal/common/eal_common_cpuflags.c
lib/librte_eal/common/include/generic/rte_cpuflags.h
lib/librte_eal/linuxapp/eal/eal.c

index 12df127..8ad6157 100644 (file)
@@ -505,7 +505,11 @@ rte_eal_init(int argc, char **argv)
        char thread_name[RTE_MAX_THREAD_NAME_LEN];
 
        /* checks if the machine is adequate */
-       rte_cpu_check_supported();
+       if (!rte_cpu_is_supported()) {
+               rte_eal_init_alert("unsupported cpu type.");
+               rte_errno = ENOTSUP;
+               return -1;
+       }
 
        if (!rte_atomic32_test_and_set(&run_once))
                return -1;
index b5f76f7..9a2d080 100644 (file)
  */
 void
 rte_cpu_check_supported(void)
+{
+       if (!rte_cpu_is_supported())
+               exit(1);
+}
+
+int
+rte_cpu_is_supported(void)
 {
        /* This is generated at compile-time by the build system */
        static const enum rte_cpu_flag_t compile_time_flags[] = {
@@ -57,14 +64,16 @@ rte_cpu_check_supported(void)
                        fprintf(stderr,
                                "ERROR: CPU feature flag lookup failed with error %d\n",
                                ret);
-                       exit(1);
+                       return 0;
                }
                if (!ret) {
                        fprintf(stderr,
                                "ERROR: This system does not support \"%s\".\n"
                                "Please check that RTE_MACHINE is set correctly.\n",
                                rte_cpu_get_flag_name(compile_time_flags[i]));
-                       exit(1);
+                       return 0;
                }
        }
+
+       return 1;
 }
index 71321f3..f01624d 100644 (file)
@@ -82,4 +82,13 @@ rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature);
 void
 rte_cpu_check_supported(void);
 
+/**
+ * This function checks that the currently used CPU supports the CPU features
+ * that were specified at compile time. It is called automatically within the
+ * EAL, so does not need to be used by applications.  This version returns a
+ * result so that decisions may be made (for instance, graceful shutdowns).
+ */
+int
+rte_cpu_is_supported(void);
+
 #endif /* _RTE_CPUFLAGS_H_ */
index 81692e7..67e4c6f 100644 (file)
@@ -759,7 +759,11 @@ rte_eal_init(int argc, char **argv)
        char thread_name[RTE_MAX_THREAD_NAME_LEN];
 
        /* checks if the machine is adequate */
-       rte_cpu_check_supported();
+       if (!rte_cpu_is_supported()) {
+               rte_eal_init_alert("unsupported cpu type.");
+               rte_errno = ENOTSUP;
+               return -1;
+       }
 
        if (!rte_atomic32_test_and_set(&run_once))
                return -1;