[PATCH] x86_64: early memtest to find bad ram

Previous thread: [PATCH] x86_64: allcate e820 resource struct all together by Yinghai Lu on Friday, March 21, 2008 - 2:57 am. (2 messages)

Next thread: Scalability requirements for sysv ipc (was: ipc: store ipcs into IDRs) by Manfred Spraul on Friday, March 21, 2008 - 5:41 am. (27 messages)
To: Andrew Morton <akpm@...>, Ingo Molnar <mingo@...>, H. Peter Anvin <hpa@...>
Cc: kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 2:58 am

do simple memtest after init_memory_mapping

use find_e820_area_size to find all ram range that is not reserved.

and do some simple bits test to find some bad ram.

if find some bad ram, use reserve_early to exclude that range.

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>

Index: linux-2.6/arch/x86/kernel/e820_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/e820_64.c
+++ linux-2.6/arch/x86/kernel/e820_64.c
@@ -119,6 +119,40 @@ again:
return changed;
}

+/* Check for already reserved areas */
+static inline int
+bad_addr_size(unsigned long *addrp, unsigned long *sizep, unsigned long align)
+{
+ int i;
+ unsigned long addr = *addrp, last;
+ unsigned long size = *sizep;
+ int changed = 0;
+again:
+ last = addr + size;
+ for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++) {
+ struct early_res *r = &early_res[i];
+ if (last > r->start && addr < r->start) {
+ size = r->start - addr;
+ changed = 1;
+ goto again;
+ }
+ if (last > r->end && addr < r->end) {
+ addr = round_up(r->end, align);
+ size = last - addr;
+ changed = 1;
+ goto again;
+ }
+ if (last <= r->end && addr >= r->start) {
+ (*sizep)++;
+ return 0;
+ }
+ }
+ if (changed) {
+ *addrp = addr;
+ *sizep = size;
+ }
+ return changed;
+}
/*
* This function checks if any part of the range <start,end> is mapped
* with type.
@@ -195,7 +229,7 @@ unsigned long __init find_e820_area(unsi
ei_last = ei->addr + ei->size;
if (addr < start)
addr = round_up(start, align);
- if (addr > ei_last)
+ if (addr >= ei_last)
continue;
while (bad_addr(&addr, size, align) && addr+size <= ei_last)
;
@@ -210,6 +244,40 @@ unsigned long __init find_e820_area(unsi
}

/*
+ * Find next free range after *start
+ */
+unsigned long __init find_e820_area_size(unsigned long st...

To: <yhlu.kernel@...>
Cc: <yhlu.kernel.send@...>, Andrew Morton <akpm@...>, Ingo Molnar <mingo@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 4:48 pm

On Thu, 20 Mar 2008 23:58:33 -0700

be careful, there's some special memory that e820 right now says is not reserved,
but still has bios data (the first 4Kb of memory come to mind)

--
If you want to reach me at my work email, use arjan@linux.intel.com
For development, discussion and tips for power savings,
visit http://www.lesswatts.org
--

To: Arjan van de Ven <arjan@...>
Cc: <yhlu.kernel.send@...>, Andrew Morton <akpm@...>, Ingo Molnar <mingo@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 5:21 pm

only test ranges that have E820_RAM and exclude range that is early_reserved...
so it is safe.

YH
--

To: Arjan van de Ven <arjan@...>
Cc: <yhlu.kernel@...>, <yhlu.kernel.send@...>, Andrew Morton <akpm@...>, Ingo Molnar <mingo@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 5:01 pm

Is that true even after Yinghai's changes? I have lost track of all the
patches...

-hpa
--

To: H. Peter Anvin <hpa@...>
Cc: Arjan van de Ven <arjan@...>, <yhlu.kernel.send@...>, Andrew Morton <akpm@...>, Ingo Molnar <mingo@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 5:21 pm

find_e820_area_size should be safe.

YH
--

To: kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 6:49 pm

Does somebody still remember the bug report in which the fault
was found to be in hardware? By bisecting, the user got "working"
kernel when movnti was not used to copy data.
Would be neat if also non-temporal moves were done in this early memtest.

Having the memtest feature in kernel is useful,
considering my grub can not load memtest86+ binary, failing with error
"Selected item cannot fit into memory",
with or without the patch at
https://bugzilla.redhat.com/show_bug.cgi?id=237279

I have user-space app to test movnti... ask if you want it.

--
Do what you love because life is too short for anything else.

--

To: <yhlu.kernel@...>
Cc: Andrew Morton <akpm@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 8:03 am

very nice patch! I always thought that this was the proper way to do
memtest - and we could in fact also do something like this after SMP
bringup, and hit the memory bus via multiple CPUs. [that will need a
different enumeration though than e820 maps]

one structural observation: please make this unified functionality, so
that 32-bit kernels can make use of it too.

remove such lines or make them pr_debug(). (checkpatch also found more
such cases)

also, please add a CONFIG_BOOTPARAM_MEMTEST=y option so that
distributions can enable this by default in their debug kernels.

i've applied your current version to get some testing, please send delta
patches against x86/latest.

Ingo
--

To: Ingo Molnar <mingo@...>
Cc: Andrew Morton <akpm@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 8:04 pm

or
1. core0/node0 check all memory at first

thanks. will submit delta patch.

YH
--

To: Yinghai Lu <yhlu.kernel@...>
Cc: Andrew Morton <akpm@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 8:04 am

well, please try some non-PAE, checks-direct-mappings approach - if
someone wants to extend it to the highmem bits i'm sure it will be done.

Ingo
--

To: Ingo Molnar <mingo@...>
Cc: Andrew Morton <akpm@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 12:59 pm

OK, First need to move some early_res code from e820_64.c to e820_32.c

or we can start to merge them. anyone is working on that?

YH
--

To: Yinghai Lu <yhlu.kernel@...>
Cc: Andrew Morton <akpm@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Tuesday, March 25, 2008 - 7:00 am

not that i know of - feel free.

Ingo
--

To: Ingo Molnar <mingo@...>
Cc: <yhlu.kernel@...>, Andrew Morton <akpm@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 5:22 pm

Perhaps this can even be used to provide on-the-fly badram
patch semantics?
--

To: Jan Engelhardt <jengelh@...>
Cc: Ingo Molnar <mingo@...>, Andrew Morton <akpm@...>, H. Peter Anvin <hpa@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 5:43 pm

yes. but bad ranges can not be too many. otherwise early_res array
will overflow. then need to use memmap=nn$ss to exclude range already
found.

YH
--

To: Ingo Molnar <mingo@...>
Cc: <yhlu.kernel@...>, Andrew Morton <akpm@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 9:08 am

Indeed. Of course, it would also be nice if distros shipped
bootloader-invoked prekernel test software, like memtest86+, by default.

-hpa
--

To: H. Peter Anvin <hpa@...>
Cc: Ingo Molnar <mingo@...>, Andrew Morton <akpm@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 3:08 pm

the current memtest86 is running in 32 bit mode, and only support 64G ram.

I tried to expand that a bit, to support 1024g, but it only works on
some machine.
could be stack provide is not big enough?

YH
--

To: Yinghai Lu <yhlu.kernel@...>
Cc: Ingo Molnar <mingo@...>, Andrew Morton <akpm@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 3:58 pm

Wonder how hard it would be to make it run 64 bits...

-hpa
--

To: H. Peter Anvin <hpa@...>
Cc: Ingo Molnar <mingo@...>, Andrew Morton <akpm@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 4:09 pm

1. in 32 bit test less than 4g in 32 bit mode
2. switch to 64 bit, set page table under 4g to cover all ram...

YH
--

To: H. Peter Anvin <hpa@...>
Cc: <yhlu.kernel@...>, Andrew Morton <akpm@...>, kernel list <linux-kernel@...>
Date: Friday, March 21, 2008 - 10:29 am

some do (Fedora for example), but it's still a bit quirky for users to
invoke and it would be nice to see those results in the kernel log as
well and flag possibly flaky systems that way. (add a taint bit, etc.,
etc.)

Ingo
--

To: Ingo Molnar <mingo@...>
Cc: H. Peter Anvin <hpa@...>, <yhlu.kernel@...>, Andrew Morton <akpm@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 1:45 am

It may even make sense to merge in the full memtest86. The code is small
(both source and binary) and IIRC it shares a lot of init code with x86.
The remaining problem would then be how to maintain its tests up do date.

Willy

--

To: Willy Tarreau <w@...>
Cc: Ingo Molnar <mingo@...>, H. Peter Anvin <hpa@...>, Andrew Morton <akpm@...>, kernel list <linux-kernel@...>
Date: Saturday, March 22, 2008 - 2:48 am

memtester is another choice, and it is more easy to be merged.

YH
--

Previous thread: [PATCH] x86_64: allcate e820 resource struct all together by Yinghai Lu on Friday, March 21, 2008 - 2:57 am. (2 messages)

Next thread: Scalability requirements for sysv ipc (was: ipc: store ipcs into IDRs) by Manfred Spraul on Friday, March 21, 2008 - 5:41 am. (27 messages)