x86: memtest: reuse test patterns when memtest parameter exceeds number of available...
[firefly-linux-kernel-4.4.55.git] / arch / x86 / mm / memtest.c
index 672e17f8262a28d3fa9a1b3c9c6a734db84693fe..00b8bdc64c3e5a37ca05e94fe803b12dbf9eeb85 100644 (file)
@@ -9,6 +9,8 @@
 
 #include <asm/e820.h>
 
+#define _MAX_MEM_PATTERNS 4
+
 static void __init memtest(unsigned long start_phys, unsigned long size,
                                 unsigned pattern)
 {
@@ -21,6 +23,8 @@ static void __init memtest(unsigned long start_phys, unsigned long size,
        unsigned long count;
        unsigned long incr;
 
+       pattern = pattern % _MAX_MEM_PATTERNS;
+
        switch (pattern) {
        case 0:
                val = 0UL;
@@ -61,9 +65,9 @@ static void __init memtest(unsigned long start_phys, unsigned long size,
                                last_bad += incr;
                        } else {
                                if (start_bad) {
-                                       printk(KERN_CONT "\n  %010lx bad mem addr %010lx - %010lx reserved",
+                                       printk(KERN_CONT "\n  %016lx bad mem addr %010lx - %010lx reserved",
                                                val, start_bad, last_bad + incr);
-                                       reserve_early(start_bad, last_bad - start_bad, "BAD RAM");
+                                       reserve_early(start_bad, last_bad + incr, "BAD RAM");
                                }
                                start_bad = last_bad = start_phys_aligned;
                        }
@@ -72,9 +76,8 @@ static void __init memtest(unsigned long start_phys, unsigned long size,
        if (start_bad) {
                printk(KERN_CONT "\n  %016lx bad mem addr %010lx - %010lx reserved",
                        val, start_bad, last_bad + incr);
-               reserve_early(start_bad, last_bad - start_bad, "BAD RAM");
+               reserve_early(start_bad, last_bad + incr, "BAD RAM");
        }
-
 }
 
 /* default is disabled */
@@ -111,8 +114,9 @@ void __init early_memtest(unsigned long start, unsigned long end)
                                t_size = end - t_start;
 
                        printk(KERN_CONT "\n  %010llx - %010llx pattern %d",
-                               (unsigned long long)t_start,
-                               (unsigned long long)t_start + t_size, pattern);
+                              (unsigned long long)t_start,
+                              (unsigned long long)t_start + t_size,
+                              pattern % _MAX_MEM_PATTERNS);
 
                        memtest(t_start, t_size, pattern);