linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 0/4] make memtest a generic kernel feature
@ 2015-03-02 14:55 Vladimir Murzin
  2015-03-02 14:55 ` [RFC PATCH 1/4] mm: move memtest under /mm Vladimir Murzin
                   ` (5 more replies)
  0 siblings, 6 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

Hi,

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

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



^ permalink raw reply	[flat|nested] 14+ messages in thread

* [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



^ permalink raw reply related	[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



^ permalink raw reply related	[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



^ permalink raw reply related	[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



^ permalink raw reply related	[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 -

^ 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

^ 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

^ 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,
> 



^ 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>
> 
> 



^ 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
> 



^ 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

^ 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
> 

^ 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

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2015-03-03 17:47 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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-03  1:52   ` Randy Dunlap
2015-03-03  9:22     ` Vladimir Murzin
2015-03-03 17:46       ` Randy Dunlap
2015-03-02 14:55 ` [RFC PATCH 2/4] memtest: use phys_addr_t for physical addresses Vladimir Murzin
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
2015-03-03 14:14       ` Catalin Marinas
2015-03-02 14:55 ` [RFC PATCH 4/4] arm: " Vladimir Murzin
2015-03-02 15:14 ` [RFC PATCH 0/4] make memtest a generic kernel feature Baruch Siach
2015-03-03  9:28   ` Vladimir Murzin
2015-03-03 16:37 ` Mark Rutland

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).