* [RFC PATCH 1/4] mm: move memtest under /mm
2015-03-02 14:55 [RFC PATCH 0/4] make memtest a generic kernel feature Vladimir Murzin
@ 2015-03-02 14:55 ` Vladimir Murzin
2015-03-03 1:52 ` Randy Dunlap
2015-03-02 14:55 ` [RFC PATCH 2/4] memtest: use phys_addr_t for physical addresses Vladimir Murzin
` (4 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Vladimir Murzin @ 2015-03-02 14:55 UTC (permalink / raw)
To: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel
Cc: tglx, mingo, hpa, akpm, lauraa, catalin.marinas, will.deacon,
linux, arnd, mark.rutland, ard.biesheuvel
There is nothing platform dependent in the core memtest code, so other platform
might benefit of this feature too.
Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
---
arch/x86/Kconfig | 11 ----
arch/x86/include/asm/e820.h | 8 ---
arch/x86/mm/Makefile | 2 -
arch/x86/mm/memtest.c | 118 -------------------------------------------
include/linux/memblock.h | 8 +++
lib/Kconfig.debug | 11 ++++
mm/Makefile | 1 +
mm/memtest.c | 118 +++++++++++++++++++++++++++++++++++++++++++
8 files changed, 138 insertions(+), 139 deletions(-)
delete mode 100644 arch/x86/mm/memtest.c
create mode 100644 mm/memtest.c
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index c2fb8a8..a8a8a86 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -715,17 +715,6 @@ endif #HYPERVISOR_GUEST
config NO_BOOTMEM
def_bool y
-config MEMTEST
- bool "Memtest"
- ---help---
- This option adds a kernel parameter 'memtest', which allows memtest
- to be set.
- memtest=0, mean disabled; -- default
- memtest=1, mean do 1 test pattern;
- ...
- memtest=4, mean do 4 test patterns.
- If you are unsure how to answer this question, answer N.
-
source "arch/x86/Kconfig.cpu"
config HPET_TIMER
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h
index 779c2ef..3ab0537 100644
--- a/arch/x86/include/asm/e820.h
+++ b/arch/x86/include/asm/e820.h
@@ -40,14 +40,6 @@ static inline void e820_mark_nosave_regions(unsigned long limit_pfn)
}
#endif
-#ifdef CONFIG_MEMTEST
-extern void early_memtest(unsigned long start, unsigned long end);
-#else
-static inline void early_memtest(unsigned long start, unsigned long end)
-{
-}
-#endif
-
extern unsigned long e820_end_of_ram_pfn(void);
extern unsigned long e820_end_of_low_ram_pfn(void);
extern u64 early_reserve_e820(u64 sizet, u64 align);
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile
index c4cc740..a482d10 100644
--- a/arch/x86/mm/Makefile
+++ b/arch/x86/mm/Makefile
@@ -32,6 +32,4 @@ obj-$(CONFIG_AMD_NUMA) += amdtopology.o
obj-$(CONFIG_ACPI_NUMA) += srat.o
obj-$(CONFIG_NUMA_EMU) += numa_emulation.o
-obj-$(CONFIG_MEMTEST) += memtest.o
-
obj-$(CONFIG_X86_INTEL_MPX) += mpx.o
diff --git a/arch/x86/mm/memtest.c b/arch/x86/mm/memtest.c
deleted file mode 100644
index 1e9da79..0000000
--- a/arch/x86/mm/memtest.c
+++ /dev/null
@@ -1,118 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/init.h>
-#include <linux/pfn.h>
-#include <linux/memblock.h>
-
-static u64 patterns[] __initdata = {
- /* The first entry has to be 0 to leave memtest with zeroed memory */
- 0,
- 0xffffffffffffffffULL,
- 0x5555555555555555ULL,
- 0xaaaaaaaaaaaaaaaaULL,
- 0x1111111111111111ULL,
- 0x2222222222222222ULL,
- 0x4444444444444444ULL,
- 0x8888888888888888ULL,
- 0x3333333333333333ULL,
- 0x6666666666666666ULL,
- 0x9999999999999999ULL,
- 0xccccccccccccccccULL,
- 0x7777777777777777ULL,
- 0xbbbbbbbbbbbbbbbbULL,
- 0xddddddddddddddddULL,
- 0xeeeeeeeeeeeeeeeeULL,
- 0x7a6c7258554e494cULL, /* yeah ;-) */
-};
-
-static void __init reserve_bad_mem(u64 pattern, u64 start_bad, u64 end_bad)
-{
- printk(KERN_INFO " %016llx bad mem addr %010llx - %010llx reserved\n",
- (unsigned long long) pattern,
- (unsigned long long) start_bad,
- (unsigned long long) end_bad);
- memblock_reserve(start_bad, end_bad - start_bad);
-}
-
-static void __init memtest(u64 pattern, u64 start_phys, u64 size)
-{
- u64 *p, *start, *end;
- u64 start_bad, last_bad;
- u64 start_phys_aligned;
- const size_t incr = sizeof(pattern);
-
- start_phys_aligned = ALIGN(start_phys, incr);
- start = __va(start_phys_aligned);
- end = start + (size - (start_phys_aligned - start_phys)) / incr;
- start_bad = 0;
- last_bad = 0;
-
- for (p = start; p < end; p++)
- *p = pattern;
-
- for (p = start; p < end; p++, start_phys_aligned += incr) {
- if (*p == pattern)
- continue;
- if (start_phys_aligned == last_bad + incr) {
- last_bad += incr;
- continue;
- }
- if (start_bad)
- reserve_bad_mem(pattern, start_bad, last_bad + incr);
- start_bad = last_bad = start_phys_aligned;
- }
- if (start_bad)
- reserve_bad_mem(pattern, start_bad, last_bad + incr);
-}
-
-static void __init do_one_pass(u64 pattern, u64 start, u64 end)
-{
- u64 i;
- phys_addr_t this_start, this_end;
-
- for_each_free_mem_range(i, NUMA_NO_NODE, &this_start, &this_end, NULL) {
- this_start = clamp_t(phys_addr_t, this_start, start, end);
- this_end = clamp_t(phys_addr_t, this_end, start, end);
- if (this_start < this_end) {
- printk(KERN_INFO " %010llx - %010llx pattern %016llx\n",
- (unsigned long long)this_start,
- (unsigned long long)this_end,
- (unsigned long long)cpu_to_be64(pattern));
- memtest(pattern, this_start, this_end - this_start);
- }
- }
-}
-
-/* default is disabled */
-static int memtest_pattern __initdata;
-
-static int __init parse_memtest(char *arg)
-{
- if (arg)
- memtest_pattern = simple_strtoul(arg, NULL, 0);
- else
- memtest_pattern = ARRAY_SIZE(patterns);
-
- return 0;
-}
-
-early_param("memtest", parse_memtest);
-
-void __init early_memtest(unsigned long start, unsigned long end)
-{
- unsigned int i;
- unsigned int idx = 0;
-
- if (!memtest_pattern)
- return;
-
- printk(KERN_INFO "early_memtest: # of tests: %d\n", memtest_pattern);
- for (i = memtest_pattern-1; i < UINT_MAX; --i) {
- idx = i % ARRAY_SIZE(patterns);
- do_one_pass(patterns[idx], start, end);
- }
-}
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index e8cc453..6724cb0 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -365,6 +365,14 @@ static inline unsigned long memblock_region_reserved_end_pfn(const struct memblo
#define __initdata_memblock
#endif
+#ifdef CONFIG_MEMTEST
+extern void early_memtest(unsigned long start, unsigned long end);
+#else
+static inline void early_memtest(unsigned long start, unsigned long end)
+{
+}
+#endif
+
#else
static inline phys_addr_t memblock_alloc(phys_addr_t size, phys_addr_t align)
{
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index c5cefb3..8eb064fd 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1732,6 +1732,17 @@ config TEST_UDELAY
If unsure, say N.
+config MEMTEST
+ bool "Memtest"
+ ---help---
+ This option adds a kernel parameter 'memtest', which allows memtest
+ to be set.
+ memtest=0, mean disabled; -- default
+ memtest=1, mean do 1 test pattern;
+ ...
+ memtest=4, mean do 4 test patterns.
+ If you are unsure how to answer this question, answer N.
+
source "samples/Kconfig"
source "lib/Kconfig.kgdb"
diff --git a/mm/Makefile b/mm/Makefile
index 3c1caa2..e925708 100644
--- a/mm/Makefile
+++ b/mm/Makefile
@@ -76,3 +76,4 @@ obj-$(CONFIG_GENERIC_EARLY_IOREMAP) += early_ioremap.o
obj-$(CONFIG_CMA) += cma.o
obj-$(CONFIG_MEMORY_BALLOON) += balloon_compaction.o
obj-$(CONFIG_PAGE_EXTENSION) += page_ext.o
+obj-$(CONFIG_MEMTEST) += memtest.o
diff --git a/mm/memtest.c b/mm/memtest.c
new file mode 100644
index 0000000..1e9da79
--- /dev/null
+++ b/mm/memtest.c
@@ -0,0 +1,118 @@
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/init.h>
+#include <linux/pfn.h>
+#include <linux/memblock.h>
+
+static u64 patterns[] __initdata = {
+ /* The first entry has to be 0 to leave memtest with zeroed memory */
+ 0,
+ 0xffffffffffffffffULL,
+ 0x5555555555555555ULL,
+ 0xaaaaaaaaaaaaaaaaULL,
+ 0x1111111111111111ULL,
+ 0x2222222222222222ULL,
+ 0x4444444444444444ULL,
+ 0x8888888888888888ULL,
+ 0x3333333333333333ULL,
+ 0x6666666666666666ULL,
+ 0x9999999999999999ULL,
+ 0xccccccccccccccccULL,
+ 0x7777777777777777ULL,
+ 0xbbbbbbbbbbbbbbbbULL,
+ 0xddddddddddddddddULL,
+ 0xeeeeeeeeeeeeeeeeULL,
+ 0x7a6c7258554e494cULL, /* yeah ;-) */
+};
+
+static void __init reserve_bad_mem(u64 pattern, u64 start_bad, u64 end_bad)
+{
+ printk(KERN_INFO " %016llx bad mem addr %010llx - %010llx reserved\n",
+ (unsigned long long) pattern,
+ (unsigned long long) start_bad,
+ (unsigned long long) end_bad);
+ memblock_reserve(start_bad, end_bad - start_bad);
+}
+
+static void __init memtest(u64 pattern, u64 start_phys, u64 size)
+{
+ u64 *p, *start, *end;
+ u64 start_bad, last_bad;
+ u64 start_phys_aligned;
+ const size_t incr = sizeof(pattern);
+
+ start_phys_aligned = ALIGN(start_phys, incr);
+ start = __va(start_phys_aligned);
+ end = start + (size - (start_phys_aligned - start_phys)) / incr;
+ start_bad = 0;
+ last_bad = 0;
+
+ for (p = start; p < end; p++)
+ *p = pattern;
+
+ for (p = start; p < end; p++, start_phys_aligned += incr) {
+ if (*p == pattern)
+ continue;
+ if (start_phys_aligned == last_bad + incr) {
+ last_bad += incr;
+ continue;
+ }
+ if (start_bad)
+ reserve_bad_mem(pattern, start_bad, last_bad + incr);
+ start_bad = last_bad = start_phys_aligned;
+ }
+ if (start_bad)
+ reserve_bad_mem(pattern, start_bad, last_bad + incr);
+}
+
+static void __init do_one_pass(u64 pattern, u64 start, u64 end)
+{
+ u64 i;
+ phys_addr_t this_start, this_end;
+
+ for_each_free_mem_range(i, NUMA_NO_NODE, &this_start, &this_end, NULL) {
+ this_start = clamp_t(phys_addr_t, this_start, start, end);
+ this_end = clamp_t(phys_addr_t, this_end, start, end);
+ if (this_start < this_end) {
+ printk(KERN_INFO " %010llx - %010llx pattern %016llx\n",
+ (unsigned long long)this_start,
+ (unsigned long long)this_end,
+ (unsigned long long)cpu_to_be64(pattern));
+ memtest(pattern, this_start, this_end - this_start);
+ }
+ }
+}
+
+/* default is disabled */
+static int memtest_pattern __initdata;
+
+static int __init parse_memtest(char *arg)
+{
+ if (arg)
+ memtest_pattern = simple_strtoul(arg, NULL, 0);
+ else
+ memtest_pattern = ARRAY_SIZE(patterns);
+
+ return 0;
+}
+
+early_param("memtest", parse_memtest);
+
+void __init early_memtest(unsigned long start, unsigned long end)
+{
+ unsigned int i;
+ unsigned int idx = 0;
+
+ if (!memtest_pattern)
+ return;
+
+ printk(KERN_INFO "early_memtest: # of tests: %d\n", memtest_pattern);
+ for (i = memtest_pattern-1; i < UINT_MAX; --i) {
+ idx = i % ARRAY_SIZE(patterns);
+ do_one_pass(patterns[idx], start, end);
+ }
+}
--
1.7.9.5
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [RFC PATCH 1/4] mm: move memtest under /mm
2015-03-02 14:55 ` [RFC PATCH 1/4] mm: move memtest under /mm Vladimir Murzin
@ 2015-03-03 1:52 ` Randy Dunlap
2015-03-03 9:22 ` Vladimir Murzin
0 siblings, 1 reply; 14+ messages in thread
From: Randy Dunlap @ 2015-03-03 1:52 UTC (permalink / raw)
To: Vladimir Murzin, linux-kernel, linux-mm, linux-arch, x86,
linux-arm-kernel
Cc: tglx, mingo, hpa, akpm, lauraa, catalin.marinas, will.deacon,
linux, arnd, mark.rutland, ard.biesheuvel
On 03/02/15 06:55, Vladimir Murzin wrote:
> There is nothing platform dependent in the core memtest code, so other platform
> might benefit of this feature too.
>
> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
> ---
> arch/x86/Kconfig | 11 ----
> arch/x86/include/asm/e820.h | 8 ---
> arch/x86/mm/Makefile | 2 -
> arch/x86/mm/memtest.c | 118 -------------------------------------------
> include/linux/memblock.h | 8 +++
> lib/Kconfig.debug | 11 ++++
> mm/Makefile | 1 +
> mm/memtest.c | 118 +++++++++++++++++++++++++++++++++++++++++++
> 8 files changed, 138 insertions(+), 139 deletions(-)
> delete mode 100644 arch/x86/mm/memtest.c
> create mode 100644 mm/memtest.c
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index c5cefb3..8eb064fd 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -1732,6 +1732,17 @@ config TEST_UDELAY
>
> If unsure, say N.
>
> +config MEMTEST
> + bool "Memtest"
> + ---help---
> + This option adds a kernel parameter 'memtest', which allows memtest
> + to be set.
> + memtest=0, mean disabled; -- default
> + memtest=1, mean do 1 test pattern;
> + ...
> + memtest=4, mean do 4 test patterns.
This sort of implies a max of 4 test patterns, but it seems to be 17
if I counted correctly, so if someone wants to test all of the possible
'memtest' patterns, they would need to use 'memtest=17', is that correct?
> + If you are unsure how to answer this question, answer N.
Thanks,
--
~Randy
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 1/4] mm: move memtest under /mm
2015-03-03 1:52 ` Randy Dunlap
@ 2015-03-03 9:22 ` Vladimir Murzin
2015-03-03 17:46 ` Randy Dunlap
0 siblings, 1 reply; 14+ messages in thread
From: Vladimir Murzin @ 2015-03-03 9:22 UTC (permalink / raw)
To: Randy Dunlap, linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel
Cc: tglx, mingo, hpa, akpm, lauraa, Catalin Marinas, Will Deacon,
linux, arnd, Mark Rutland, ard.biesheuvel
On 03/03/15 01:52, Randy Dunlap wrote:
> On 03/02/15 06:55, Vladimir Murzin wrote:
>> There is nothing platform dependent in the core memtest code, so other platform
>> might benefit of this feature too.
>>
>> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
>> ---
>> arch/x86/Kconfig | 11 ----
>> arch/x86/include/asm/e820.h | 8 ---
>> arch/x86/mm/Makefile | 2 -
>> arch/x86/mm/memtest.c | 118 -------------------------------------------
>> include/linux/memblock.h | 8 +++
>> lib/Kconfig.debug | 11 ++++
>> mm/Makefile | 1 +
>> mm/memtest.c | 118 +++++++++++++++++++++++++++++++++++++++++++
>> 8 files changed, 138 insertions(+), 139 deletions(-)
>> delete mode 100644 arch/x86/mm/memtest.c
>> create mode 100644 mm/memtest.c
>
>> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
>> index c5cefb3..8eb064fd 100644
>> --- a/lib/Kconfig.debug
>> +++ b/lib/Kconfig.debug
>> @@ -1732,6 +1732,17 @@ config TEST_UDELAY
>>
>> If unsure, say N.
>>
>> +config MEMTEST
>> + bool "Memtest"
>> + ---help---
>> + This option adds a kernel parameter 'memtest', which allows memtest
>> + to be set.
>> + memtest=0, mean disabled; -- default
>> + memtest=1, mean do 1 test pattern;
>> + ...
>> + memtest=4, mean do 4 test patterns.
>
> This sort of implies a max of 4 test patterns, but it seems to be 17
> if I counted correctly, so if someone wants to test all of the possible
> 'memtest' patterns, they would need to use 'memtest=17', is that correct?
>
Yes, that correct. Additional patterns were introduced since 63823126
"x86: memtest: add additional (regular) test patterns", but looks like
Kconfig was not updated that time. Do you want me to fold updates for
that info or make a separate patch?
Thanks
Vladimir
>
>> + If you are unsure how to answer this question, answer N.
>
> Thanks,
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 1/4] mm: move memtest under /mm
2015-03-03 9:22 ` Vladimir Murzin
@ 2015-03-03 17:46 ` Randy Dunlap
0 siblings, 0 replies; 14+ messages in thread
From: Randy Dunlap @ 2015-03-03 17:46 UTC (permalink / raw)
To: Vladimir Murzin, linux-kernel, linux-mm, linux-arch, x86,
linux-arm-kernel
Cc: tglx, mingo, hpa, akpm, lauraa, Catalin Marinas, Will Deacon,
linux, arnd, Mark Rutland, ard.biesheuvel
On 03/03/15 01:22, Vladimir Murzin wrote:
> On 03/03/15 01:52, Randy Dunlap wrote:
>> On 03/02/15 06:55, Vladimir Murzin wrote:
>>> There is nothing platform dependent in the core memtest code, so other platform
>>> might benefit of this feature too.
>>>
>>> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
>>> ---
>>> arch/x86/Kconfig | 11 ----
>>> arch/x86/include/asm/e820.h | 8 ---
>>> arch/x86/mm/Makefile | 2 -
>>> arch/x86/mm/memtest.c | 118 -------------------------------------------
>>> include/linux/memblock.h | 8 +++
>>> lib/Kconfig.debug | 11 ++++
>>> mm/Makefile | 1 +
>>> mm/memtest.c | 118 +++++++++++++++++++++++++++++++++++++++++++
>>> 8 files changed, 138 insertions(+), 139 deletions(-)
>>> delete mode 100644 arch/x86/mm/memtest.c
>>> create mode 100644 mm/memtest.c
>>
>>> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
>>> index c5cefb3..8eb064fd 100644
>>> --- a/lib/Kconfig.debug
>>> +++ b/lib/Kconfig.debug
>>> @@ -1732,6 +1732,17 @@ config TEST_UDELAY
>>>
>>> If unsure, say N.
>>>
>>> +config MEMTEST
>>> + bool "Memtest"
>>> + ---help---
>>> + This option adds a kernel parameter 'memtest', which allows memtest
>>> + to be set.
>>> + memtest=0, mean disabled; -- default
>>> + memtest=1, mean do 1 test pattern;
>>> + ...
>>> + memtest=4, mean do 4 test patterns.
>>
>> This sort of implies a max of 4 test patterns, but it seems to be 17
>> if I counted correctly, so if someone wants to test all of the possible
>> 'memtest' patterns, they would need to use 'memtest=17', is that correct?
>>
>
> Yes, that correct. Additional patterns were introduced since 63823126
> "x86: memtest: add additional (regular) test patterns", but looks like
> Kconfig was not updated that time. Do you want me to fold updates for
> that info or make a separate patch?
Either is OK with me but it probably should be a separate patch.
Thanks.
--
~Randy
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [RFC PATCH 2/4] memtest: use phys_addr_t for physical addresses
2015-03-02 14:55 [RFC PATCH 0/4] make memtest a generic kernel feature Vladimir Murzin
2015-03-02 14:55 ` [RFC PATCH 1/4] mm: move memtest under /mm Vladimir Murzin
@ 2015-03-02 14:55 ` Vladimir Murzin
2015-03-02 14:55 ` [RFC PATCH 3/4] arm64: add support for memtest Vladimir Murzin
` (3 subsequent siblings)
5 siblings, 0 replies; 14+ messages in thread
From: Vladimir Murzin @ 2015-03-02 14:55 UTC (permalink / raw)
To: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel
Cc: tglx, mingo, hpa, akpm, lauraa, catalin.marinas, will.deacon,
linux, arnd, mark.rutland, ard.biesheuvel
Since memtest might be used by other architectures pass input parameters
as phys_addr_t instead of long to prevent overflow.
---
include/linux/memblock.h | 4 ++--
mm/memtest.c | 16 ++++++++--------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 6724cb0..9497ec7 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -366,9 +366,9 @@ static inline unsigned long memblock_region_reserved_end_pfn(const struct memblo
#endif
#ifdef CONFIG_MEMTEST
-extern void early_memtest(unsigned long start, unsigned long end);
+extern void early_memtest(phys_addr_t start, phys_addr_t end);
#else
-static inline void early_memtest(unsigned long start, unsigned long end)
+static inline void early_memtest(phys_addr_t start, phys_addr_t end)
{
}
#endif
diff --git a/mm/memtest.c b/mm/memtest.c
index 1e9da79..1997d93 100644
--- a/mm/memtest.c
+++ b/mm/memtest.c
@@ -29,7 +29,7 @@ static u64 patterns[] __initdata = {
0x7a6c7258554e494cULL, /* yeah ;-) */
};
-static void __init reserve_bad_mem(u64 pattern, u64 start_bad, u64 end_bad)
+static void __init reserve_bad_mem(u64 pattern, phys_addr_t start_bad, phys_addr_t end_bad)
{
printk(KERN_INFO " %016llx bad mem addr %010llx - %010llx reserved\n",
(unsigned long long) pattern,
@@ -38,11 +38,11 @@ static void __init reserve_bad_mem(u64 pattern, u64 start_bad, u64 end_bad)
memblock_reserve(start_bad, end_bad - start_bad);
}
-static void __init memtest(u64 pattern, u64 start_phys, u64 size)
+static void __init memtest(u64 pattern, phys_addr_t start_phys, phys_addr_t size)
{
u64 *p, *start, *end;
- u64 start_bad, last_bad;
- u64 start_phys_aligned;
+ phys_addr_t start_bad, last_bad;
+ phys_addr_t start_phys_aligned;
const size_t incr = sizeof(pattern);
start_phys_aligned = ALIGN(start_phys, incr);
@@ -69,14 +69,14 @@ static void __init memtest(u64 pattern, u64 start_phys, u64 size)
reserve_bad_mem(pattern, start_bad, last_bad + incr);
}
-static void __init do_one_pass(u64 pattern, u64 start, u64 end)
+static void __init do_one_pass(u64 pattern, phys_addr_t start, phys_addr_t end)
{
u64 i;
phys_addr_t this_start, this_end;
for_each_free_mem_range(i, NUMA_NO_NODE, &this_start, &this_end, NULL) {
- this_start = clamp_t(phys_addr_t, this_start, start, end);
- this_end = clamp_t(phys_addr_t, this_end, start, end);
+ this_start = clamp(this_start, start, end);
+ this_end = clamp(this_end, start, end);
if (this_start < this_end) {
printk(KERN_INFO " %010llx - %010llx pattern %016llx\n",
(unsigned long long)this_start,
@@ -102,7 +102,7 @@ static int __init parse_memtest(char *arg)
early_param("memtest", parse_memtest);
-void __init early_memtest(unsigned long start, unsigned long end)
+void __init early_memtest(phys_addr_t start, phys_addr_t end)
{
unsigned int i;
unsigned int idx = 0;
--
1.7.9.5
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread* [RFC PATCH 3/4] arm64: add support for memtest
2015-03-02 14:55 [RFC PATCH 0/4] make memtest a generic kernel feature Vladimir Murzin
2015-03-02 14:55 ` [RFC PATCH 1/4] mm: move memtest under /mm Vladimir Murzin
2015-03-02 14:55 ` [RFC PATCH 2/4] memtest: use phys_addr_t for physical addresses Vladimir Murzin
@ 2015-03-02 14:55 ` Vladimir Murzin
2015-03-02 18:56 ` Will Deacon
2015-03-02 14:55 ` [RFC PATCH 4/4] arm: " Vladimir Murzin
` (2 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Vladimir Murzin @ 2015-03-02 14:55 UTC (permalink / raw)
To: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel
Cc: tglx, mingo, hpa, akpm, lauraa, catalin.marinas, will.deacon,
linux, arnd, mark.rutland, ard.biesheuvel
Add support for memtest command line option.
Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
---
arch/arm64/mm/init.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index ae85da6..597831b 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -190,6 +190,8 @@ void __init bootmem_init(void)
min = PFN_UP(memblock_start_of_DRAM());
max = PFN_DOWN(memblock_end_of_DRAM());
+ early_memtest(min << PAGE_SHIFT, max << PAGE_SHIFT);
+
/*
* Sparsemem tries to allocate bootmem in memory_present(), so must be
* done after the fixed reservations.
--
1.7.9.5
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [RFC PATCH 3/4] arm64: add support for memtest
2015-03-02 14:55 ` [RFC PATCH 3/4] arm64: add support for memtest Vladimir Murzin
@ 2015-03-02 18:56 ` Will Deacon
2015-03-03 9:26 ` Vladimir Murzin
0 siblings, 1 reply; 14+ messages in thread
From: Will Deacon @ 2015-03-02 18:56 UTC (permalink / raw)
To: Vladimir Murzin
Cc: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel, tglx,
mingo, hpa, akpm, lauraa, Catalin Marinas, linux, arnd,
Mark Rutland, ard.biesheuvel
On Mon, Mar 02, 2015 at 02:55:44PM +0000, Vladimir Murzin wrote:
> Add support for memtest command line option.
>
> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
> ---
> arch/arm64/mm/init.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
> index ae85da6..597831b 100644
> --- a/arch/arm64/mm/init.c
> +++ b/arch/arm64/mm/init.c
> @@ -190,6 +190,8 @@ void __init bootmem_init(void)
> min = PFN_UP(memblock_start_of_DRAM());
> max = PFN_DOWN(memblock_end_of_DRAM());
>
> + early_memtest(min << PAGE_SHIFT, max << PAGE_SHIFT);
> +
> /*
> * Sparsemem tries to allocate bootmem in memory_present(), so must be
> * done after the fixed reservations.
This is really neat, thanks for doing this Vladimir!
Acked-by: Will Deacon <will.deacon@arm.com>
For the series, modulo Baruch's comments about Documentation updates.
Will
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 3/4] arm64: add support for memtest
2015-03-02 18:56 ` Will Deacon
@ 2015-03-03 9:26 ` Vladimir Murzin
2015-03-03 14:14 ` Catalin Marinas
0 siblings, 1 reply; 14+ messages in thread
From: Vladimir Murzin @ 2015-03-03 9:26 UTC (permalink / raw)
To: Will Deacon
Cc: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel, tglx,
mingo, hpa, akpm, lauraa, Catalin Marinas, linux, arnd,
Mark Rutland, ard.biesheuvel
On 02/03/15 18:56, Will Deacon wrote:
> On Mon, Mar 02, 2015 at 02:55:44PM +0000, Vladimir Murzin wrote:
>> Add support for memtest command line option.
>>
>> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
>> ---
>> arch/arm64/mm/init.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>> index ae85da6..597831b 100644
>> --- a/arch/arm64/mm/init.c
>> +++ b/arch/arm64/mm/init.c
>> @@ -190,6 +190,8 @@ void __init bootmem_init(void)
>> min = PFN_UP(memblock_start_of_DRAM());
>> max = PFN_DOWN(memblock_end_of_DRAM());
>>
>> + early_memtest(min << PAGE_SHIFT, max << PAGE_SHIFT);
>> +
>> /*
>> * Sparsemem tries to allocate bootmem in memory_present(), so must be
>> * done after the fixed reservations.
>
> This is really neat, thanks for doing this Vladimir!
>
> Acked-by: Will Deacon <will.deacon@arm.com>
>
> For the series, modulo Baruch's comments about Documentation updates.
>
> Will
>
Thanks Will! I'll wait for awhile for other comments and repost updated
version.
I wonder which tree it might go?
Thanks
Vladimir
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
>
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 3/4] arm64: add support for memtest
2015-03-03 9:26 ` Vladimir Murzin
@ 2015-03-03 14:14 ` Catalin Marinas
0 siblings, 0 replies; 14+ messages in thread
From: Catalin Marinas @ 2015-03-03 14:14 UTC (permalink / raw)
To: Vladimir Murzin
Cc: Will Deacon, linux-arch, Mark Rutland, lauraa, arnd,
ard.biesheuvel, x86, linux-kernel, linux-mm, mingo, hpa, linux,
tglx, akpm, linux-arm-kernel
On Tue, Mar 03, 2015 at 09:26:58AM +0000, Vladimir Murzin wrote:
> On 02/03/15 18:56, Will Deacon wrote:
> > On Mon, Mar 02, 2015 at 02:55:44PM +0000, Vladimir Murzin wrote:
> >> Add support for memtest command line option.
> >>
> >> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
> >> ---
> >> arch/arm64/mm/init.c | 2 ++
> >> 1 file changed, 2 insertions(+)
> >>
> >> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
> >> index ae85da6..597831b 100644
> >> --- a/arch/arm64/mm/init.c
> >> +++ b/arch/arm64/mm/init.c
> >> @@ -190,6 +190,8 @@ void __init bootmem_init(void)
> >> min = PFN_UP(memblock_start_of_DRAM());
> >> max = PFN_DOWN(memblock_end_of_DRAM());
> >>
> >> + early_memtest(min << PAGE_SHIFT, max << PAGE_SHIFT);
> >> +
> >> /*
> >> * Sparsemem tries to allocate bootmem in memory_present(), so must be
> >> * done after the fixed reservations.
> >
> > This is really neat, thanks for doing this Vladimir!
> >
> > Acked-by: Will Deacon <will.deacon@arm.com>
> >
> > For the series, modulo Baruch's comments about Documentation updates.
>
> Thanks Will! I'll wait for awhile for other comments and repost updated
> version.
>
> I wonder which tree it might go?
Since it touches mm, x86, arm, arm64, I guess it could go in via the mm
tree (akpm). We could take it via the arm64 tree as well if we have all
the acks in place.
--
Catalin
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [RFC PATCH 4/4] arm: add support for memtest
2015-03-02 14:55 [RFC PATCH 0/4] make memtest a generic kernel feature Vladimir Murzin
` (2 preceding siblings ...)
2015-03-02 14:55 ` [RFC PATCH 3/4] arm64: add support for memtest Vladimir Murzin
@ 2015-03-02 14:55 ` Vladimir Murzin
2015-03-02 15:14 ` [RFC PATCH 0/4] make memtest a generic kernel feature Baruch Siach
2015-03-03 16:37 ` Mark Rutland
5 siblings, 0 replies; 14+ messages in thread
From: Vladimir Murzin @ 2015-03-02 14:55 UTC (permalink / raw)
To: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel
Cc: tglx, mingo, hpa, akpm, lauraa, catalin.marinas, will.deacon,
linux, arnd, mark.rutland, ard.biesheuvel
Add support for memtest command line option.
Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com>
---
arch/arm/mm/init.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 1609b02..3d0e9ae 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -335,6 +335,9 @@ void __init bootmem_init(void)
find_limits(&min, &max_low, &max_high);
+ early_memtest((phys_addr_t)min << PAGE_SHIFT,
+ (phys_addr_t)max_low << PAGE_SHIFT);
+
/*
* Sparsemem tries to allocate bootmem in memory_present(),
* so must be done after the fixed reservations
--
1.7.9.5
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [RFC PATCH 0/4] make memtest a generic kernel feature
2015-03-02 14:55 [RFC PATCH 0/4] make memtest a generic kernel feature Vladimir Murzin
` (3 preceding siblings ...)
2015-03-02 14:55 ` [RFC PATCH 4/4] arm: " Vladimir Murzin
@ 2015-03-02 15:14 ` Baruch Siach
2015-03-03 9:28 ` Vladimir Murzin
2015-03-03 16:37 ` Mark Rutland
5 siblings, 1 reply; 14+ messages in thread
From: Baruch Siach @ 2015-03-02 15:14 UTC (permalink / raw)
To: Vladimir Murzin
Cc: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel,
mark.rutland, lauraa, arnd, ard.biesheuvel, catalin.marinas,
will.deacon, mingo, hpa, linux, tglx, akpm
Hi Vladimir,
On Mon, Mar 02, 2015 at 02:55:41PM +0000, Vladimir Murzin wrote:
> Memtest is a simple feature which fills the memory with a given set of
> patterns and validates memory contents, if bad memory regions is detected it
> reserves them via memblock API. Since memblock API is widely used by other
> architectures this feature can be enabled outside of x86 world.
>
> This patch set promotes memtest to live under generic mm umbrella and enables
> memtest feature for arm/arm64.
Please update the architectures list in the 'memtest' entry at
Documentation/kernel-parameters.txt.
baruch
--
http://baruch.siach.name/blog/ ~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch@tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [RFC PATCH 0/4] make memtest a generic kernel feature
2015-03-02 15:14 ` [RFC PATCH 0/4] make memtest a generic kernel feature Baruch Siach
@ 2015-03-03 9:28 ` Vladimir Murzin
0 siblings, 0 replies; 14+ messages in thread
From: Vladimir Murzin @ 2015-03-03 9:28 UTC (permalink / raw)
To: Baruch Siach
Cc: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel,
Mark Rutland, lauraa, arnd, ard.biesheuvel, Catalin Marinas,
Will Deacon, mingo, hpa, linux, tglx, akpm
On 02/03/15 15:14, Baruch Siach wrote:
> Hi Vladimir,
>
> On Mon, Mar 02, 2015 at 02:55:41PM +0000, Vladimir Murzin wrote:
>> Memtest is a simple feature which fills the memory with a given set of
>> patterns and validates memory contents, if bad memory regions is detected it
>> reserves them via memblock API. Since memblock API is widely used by other
>> architectures this feature can be enabled outside of x86 world.
>>
>> This patch set promotes memtest to live under generic mm umbrella and enables
>> memtest feature for arm/arm64.
>
> Please update the architectures list in the 'memtest' entry at
> Documentation/kernel-parameters.txt.
Thanks for pointing at it. I'll add updates for documentation to my next
version.
Vladimir
>
> baruch
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC PATCH 0/4] make memtest a generic kernel feature
2015-03-02 14:55 [RFC PATCH 0/4] make memtest a generic kernel feature Vladimir Murzin
` (4 preceding siblings ...)
2015-03-02 15:14 ` [RFC PATCH 0/4] make memtest a generic kernel feature Baruch Siach
@ 2015-03-03 16:37 ` Mark Rutland
5 siblings, 0 replies; 14+ messages in thread
From: Mark Rutland @ 2015-03-03 16:37 UTC (permalink / raw)
To: Vladimir Murzin
Cc: linux-kernel, linux-mm, linux-arch, x86, linux-arm-kernel, tglx,
mingo, hpa, akpm, lauraa, Catalin Marinas, Will Deacon, linux,
arnd, ard.biesheuvel
On Mon, Mar 02, 2015 at 02:55:41PM +0000, Vladimir Murzin wrote:
> Hi,
Hi Vladimir,
> Memtest is a simple feature which fills the memory with a given set of
> patterns and validates memory contents, if bad memory regions is detected it
> reserves them via memblock API. Since memblock API is widely used by other
> architectures this feature can be enabled outside of x86 world.
>
> This patch set promotes memtest to live under generic mm umbrella and enables
> memtest feature for arm/arm64.
>
> Patches are built on top of 4.0-rc1
Thanks for putting this together. I've found this extremely useful for
tracking down an issue with some errant DMA on an arm64 platform. For
the first three patches:
Tested-by: Mark Rutland <mark.rutland@arm.com>
Thanks,
Mark.
>
> Vladimir Murzin (4):
> mm: move memtest under /mm
> memtest: use phys_addr_t for physical addresses
> arm64: add support for memtest
> arm: add support for memtest
>
> arch/arm/mm/init.c | 3 ++
> arch/arm64/mm/init.c | 2 +
> arch/x86/Kconfig | 11 ----
> arch/x86/include/asm/e820.h | 8 ---
> arch/x86/mm/Makefile | 2 -
> arch/x86/mm/memtest.c | 118 -------------------------------------------
> include/linux/memblock.h | 8 +++
> lib/Kconfig.debug | 11 ++++
> mm/Makefile | 1 +
> mm/memtest.c | 118 +++++++++++++++++++++++++++++++++++++++++++
> 10 files changed, 143 insertions(+), 139 deletions(-)
> delete mode 100644 arch/x86/mm/memtest.c
> create mode 100644 mm/memtest.c
>
> --
> 1.7.9.5
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 14+ messages in thread