]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - lib/test_stackinit.c
mm: remove both instances of __vmalloc_node_flags
[thirdparty/linux.git] / lib / test_stackinit.c
index 2d7d257a430e6d24c78f6193419f96578496126e..f93b1e145ada71a63ff417ab1076848d8a5b74b1 100644 (file)
@@ -92,8 +92,9 @@ static bool range_contains(char *haystack_start, size_t haystack_size,
  * @var_type: type to be tested for zeroing initialization
  * @which: is this a SCALAR, STRING, or STRUCT type?
  * @init_level: what kind of initialization is performed
+ * @xfail: is this test expected to fail?
  */
-#define DEFINE_TEST_DRIVER(name, var_type, which)              \
+#define DEFINE_TEST_DRIVER(name, var_type, which, xfail)       \
 /* Returns 0 on success, 1 on failure. */                      \
 static noinline __init int test_ ## name (void)                        \
 {                                                              \
@@ -139,13 +140,14 @@ static noinline __init int test_ ## name (void)                   \
        for (sum = 0, i = 0; i < target_size; i++)              \
                sum += (check_buf[i] == 0xFF);                  \
                                                                \
-       if (sum == 0)                                           \
+       if (sum == 0) {                                         \
                pr_info(#name " ok\n");                         \
-       else                                                    \
-               pr_warn(#name " FAIL (uninit bytes: %d)\n",     \
-                       sum);                                   \
-                                                               \
-       return (sum != 0);                                      \
+               return 0;                                       \
+       } else {                                                \
+               pr_warn(#name " %sFAIL (uninit bytes: %d)\n",   \
+                       (xfail) ? "X" : "", sum);               \
+               return (xfail) ? 0 : 1;                         \
+       }                                                       \
 }
 #define DEFINE_TEST(name, var_type, which, init_level)         \
 /* no-op to force compiler into ignoring "uninitialized" vars */\
@@ -189,7 +191,7 @@ static noinline __init int leaf_ ## name(unsigned long sp,  \
                                                                \
        return (int)buf[0] | (int)buf[sizeof(buf) - 1];         \
 }                                                              \
-DEFINE_TEST_DRIVER(name, var_type, which)
+DEFINE_TEST_DRIVER(name, var_type, which, 0)
 
 /* Structure with no padding. */
 struct test_packed {
@@ -326,8 +328,14 @@ static noinline __init int leaf_switch_2_none(unsigned long sp, bool fill,
        return __leaf_switch_none(2, fill);
 }
 
-DEFINE_TEST_DRIVER(switch_1_none, uint64_t, SCALAR);
-DEFINE_TEST_DRIVER(switch_2_none, uint64_t, SCALAR);
+/*
+ * These are expected to fail for most configurations because neither
+ * GCC nor Clang have a way to perform initialization of variables in
+ * non-code areas (i.e. in a switch statement before the first "case").
+ * https://bugs.llvm.org/show_bug.cgi?id=44916
+ */
+DEFINE_TEST_DRIVER(switch_1_none, uint64_t, SCALAR, 1);
+DEFINE_TEST_DRIVER(switch_2_none, uint64_t, SCALAR, 1);
 
 static int __init test_stackinit_init(void)
 {