mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
x86: memtest: reuse test patterns when memtest parameter exceeds number of available patterns
Impact: fix unexpected behaviour when pattern number is out of range Current implementation provides 4 patterns for memtest. The code doesn't check whether the memtest parameter value exceeds the maximum pattern number. Instead the memtest code pretends to test with non-existing patterns, e.g. when booting with memtest=10 I've observed the following ... early_memtest: pattern num 10 0000001000 - 0000006000 pattern 0 ... 0000001000 - 0000006000 pattern 1 ... 0000001000 - 0000006000 pattern 2 ... 0000001000 - 0000006000 pattern 3 ... 0000001000 - 0000006000 pattern 4 ... 0000001000 - 0000006000 pattern 5 ... 0000001000 - 0000006000 pattern 6 ... 0000001000 - 0000006000 pattern 7 ... 0000001000 - 0000006000 pattern 8 ... 0000001000 - 0000006000 pattern 9 ... But in fact Linux didn't test anything for patterns > 4 as the default case in memtest() is to leave the function. I suggest to use the memtest parameter as the number of tests to be performed and to re-iterate over all existing patterns. Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
a852cbfaaf
commit
40823f737e
@ -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;
|
||||
@ -110,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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user