* [PATCH 1/3] corruption check: move the corruption checks into their own file
@ 2008-09-24 4:53 Arjan van de Ven
2008-09-24 4:54 ` [PATCH 2/3] corruption check: run the corruption checks from a work queue Arjan van de Ven
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Arjan van de Ven @ 2008-09-24 4:53 UTC (permalink / raw)
To: linux-kernel, mingo, Hugh Dickins, Jeremy Fitzhardinge,
Randy.Dunlap
>From 19058f850aaf82d8185f06b54582a3d8e1ca8d97 Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <arjan@linux.intel.com>
Date: Mon, 22 Sep 2008 09:35:06 -0700
Subject: [PATCH] corruption check: move the corruption checks into their own file
There'll be more checks over time (based on kerneloops data I have
several ideas already) and making the checks their own file rather
than setup.c makes sense in that light.
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
---
arch/x86/kernel/Makefile | 1 +
arch/x86/kernel/check.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++
arch/x86/kernel/setup.c | 151 --------------------------------------------
include/asm-x86/setup.h | 4 +
4 files changed, 161 insertions(+), 151 deletions(-)
create mode 100644 arch/x86/kernel/check.c
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index c71722d..5d788ea 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -36,6 +36,7 @@ obj-y += bootflag.o e820.o
obj-y += pci-dma.o quirks.o i8237.o topology.o kdebugfs.o
obj-y += alternative.o i8253.o pci-nommu.o
obj-y += tsc.o io_delay.o rtc.o
+obj-y += check.o
obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o
obj-y += process.o
diff --git a/arch/x86/kernel/check.c b/arch/x86/kernel/check.c
new file mode 100644
index 0000000..a7e80ed
--- /dev/null
+++ b/arch/x86/kernel/check.c
@@ -0,0 +1,156 @@
+#include <linux/module.h>
+#include <linux/sched.h>
+
+#include <asm/e820.h>
+#include <asm/proto.h>
+
+/*
+ * Some BIOSes seem to corrupt the low 64k of memory during events
+ * like suspend/resume and unplugging an HDMI cable. Reserve all
+ * remaining free memory in that area and fill it with a distinct
+ * pattern.
+ */
+#ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
+#define MAX_SCAN_AREAS 8
+
+static int __read_mostly memory_corruption_check = -1;
+
+static unsigned __read_mostly corruption_check_size = 64*1024;
+static unsigned __read_mostly corruption_check_period = 60; /* seconds */
+
+static struct e820entry scan_areas[MAX_SCAN_AREAS];
+static int num_scan_areas;
+
+
+static int set_corruption_check(char *arg)
+{
+ char *end;
+
+ memory_corruption_check = simple_strtol(arg, &end, 10);
+
+ return (*end == 0) ? 0 : -EINVAL;
+}
+early_param("memory_corruption_check", set_corruption_check);
+
+static int set_corruption_check_period(char *arg)
+{
+ char *end;
+
+ corruption_check_period = simple_strtoul(arg, &end, 10);
+
+ return (*end == 0) ? 0 : -EINVAL;
+}
+early_param("memory_corruption_check_period", set_corruption_check_period);
+
+static int set_corruption_check_size(char *arg)
+{
+ char *end;
+ unsigned size;
+
+ size = memparse(arg, &end);
+
+ if (*end == '\0')
+ corruption_check_size = size;
+
+ return (size == corruption_check_size) ? 0 : -EINVAL;
+}
+early_param("memory_corruption_check_size", set_corruption_check_size);
+
+
+void __init setup_bios_corruption_check(void)
+{
+ u64 addr = PAGE_SIZE; /* assume first page is reserved anyway */
+
+ if (memory_corruption_check == -1) {
+ memory_corruption_check =
+#ifdef CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK
+ 1
+#else
+ 0
+#endif
+ ;
+ }
+
+ if (corruption_check_size == 0)
+ memory_corruption_check = 0;
+
+ if (!memory_corruption_check)
+ return;
+
+ corruption_check_size = round_up(corruption_check_size, PAGE_SIZE);
+
+ while(addr < corruption_check_size && num_scan_areas < MAX_SCAN_AREAS) {
+ u64 size;
+ addr = find_e820_area_size(addr, &size, PAGE_SIZE);
+
+ if (addr == 0)
+ break;
+
+ if ((addr + size) > corruption_check_size)
+ size = corruption_check_size - addr;
+
+ if (size == 0)
+ break;
+
+ e820_update_range(addr, size, E820_RAM, E820_RESERVED);
+ scan_areas[num_scan_areas].addr = addr;
+ scan_areas[num_scan_areas].size = size;
+ num_scan_areas++;
+
+ /* Assume we've already mapped this early memory */
+ memset(__va(addr), 0, size);
+
+ addr += size;
+ }
+
+ printk(KERN_INFO "Scanning %d areas for low memory corruption\n",
+ num_scan_areas);
+ update_e820();
+}
+
+static struct timer_list periodic_check_timer;
+
+void check_for_bios_corruption(void)
+{
+ int i;
+ int corruption = 0;
+
+ if (!memory_corruption_check)
+ return;
+
+ for(i = 0; i < num_scan_areas; i++) {
+ unsigned long *addr = __va(scan_areas[i].addr);
+ unsigned long size = scan_areas[i].size;
+
+ for(; size; addr++, size -= sizeof(unsigned long)) {
+ if (!*addr)
+ continue;
+ printk(KERN_ERR "Corrupted low memory at %p (%lx phys) = %08lx\n",
+ addr, __pa(addr), *addr);
+ corruption = 1;
+ *addr = 0;
+ }
+ }
+
+ WARN(corruption, KERN_ERR "Memory corruption detected in low memory\n");
+}
+
+static void periodic_check_for_corruption(unsigned long data)
+{
+ check_for_bios_corruption();
+ mod_timer(&periodic_check_timer, round_jiffies(jiffies + corruption_check_period*HZ));
+}
+
+void start_periodic_check_for_corruption(void)
+{
+ if (!memory_corruption_check || corruption_check_period == 0)
+ return;
+
+ printk(KERN_INFO "Scanning for low memory corruption every %d seconds\n",
+ corruption_check_period);
+
+ init_timer(&periodic_check_timer);
+ periodic_check_timer.function = &periodic_check_for_corruption;
+ periodic_check_for_corruption(0);
+}
+#endif
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 3d677b5..a243fe4 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -581,157 +581,6 @@ static struct x86_quirks default_x86_quirks __initdata;
struct x86_quirks *x86_quirks __initdata = &default_x86_quirks;
-/*
- * Some BIOSes seem to corrupt the low 64k of memory during events
- * like suspend/resume and unplugging an HDMI cable. Reserve all
- * remaining free memory in that area and fill it with a distinct
- * pattern.
- */
-#ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
-#define MAX_SCAN_AREAS 8
-
-static int __read_mostly memory_corruption_check = -1;
-
-static unsigned __read_mostly corruption_check_size = 64*1024;
-static unsigned __read_mostly corruption_check_period = 60; /* seconds */
-
-static struct e820entry scan_areas[MAX_SCAN_AREAS];
-static int num_scan_areas;
-
-
-static int set_corruption_check(char *arg)
-{
- char *end;
-
- memory_corruption_check = simple_strtol(arg, &end, 10);
-
- return (*end == 0) ? 0 : -EINVAL;
-}
-early_param("memory_corruption_check", set_corruption_check);
-
-static int set_corruption_check_period(char *arg)
-{
- char *end;
-
- corruption_check_period = simple_strtoul(arg, &end, 10);
-
- return (*end == 0) ? 0 : -EINVAL;
-}
-early_param("memory_corruption_check_period", set_corruption_check_period);
-
-static int set_corruption_check_size(char *arg)
-{
- char *end;
- unsigned size;
-
- size = memparse(arg, &end);
-
- if (*end == '\0')
- corruption_check_size = size;
-
- return (size == corruption_check_size) ? 0 : -EINVAL;
-}
-early_param("memory_corruption_check_size", set_corruption_check_size);
-
-
-static void __init setup_bios_corruption_check(void)
-{
- u64 addr = PAGE_SIZE; /* assume first page is reserved anyway */
-
- if (memory_corruption_check == -1) {
- memory_corruption_check =
-#ifdef CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK
- 1
-#else
- 0
-#endif
- ;
- }
-
- if (corruption_check_size == 0)
- memory_corruption_check = 0;
-
- if (!memory_corruption_check)
- return;
-
- corruption_check_size = round_up(corruption_check_size, PAGE_SIZE);
-
- while(addr < corruption_check_size && num_scan_areas < MAX_SCAN_AREAS) {
- u64 size;
- addr = find_e820_area_size(addr, &size, PAGE_SIZE);
-
- if (addr == 0)
- break;
-
- if ((addr + size) > corruption_check_size)
- size = corruption_check_size - addr;
-
- if (size == 0)
- break;
-
- e820_update_range(addr, size, E820_RAM, E820_RESERVED);
- scan_areas[num_scan_areas].addr = addr;
- scan_areas[num_scan_areas].size = size;
- num_scan_areas++;
-
- /* Assume we've already mapped this early memory */
- memset(__va(addr), 0, size);
-
- addr += size;
- }
-
- printk(KERN_INFO "Scanning %d areas for low memory corruption\n",
- num_scan_areas);
- update_e820();
-}
-
-static struct timer_list periodic_check_timer;
-
-void check_for_bios_corruption(void)
-{
- int i;
- int corruption = 0;
-
- if (!memory_corruption_check)
- return;
-
- for(i = 0; i < num_scan_areas; i++) {
- unsigned long *addr = __va(scan_areas[i].addr);
- unsigned long size = scan_areas[i].size;
-
- for(; size; addr++, size -= sizeof(unsigned long)) {
- if (!*addr)
- continue;
- printk(KERN_ERR "Corrupted low memory at %p (%lx phys) = %08lx\n",
- addr, __pa(addr), *addr);
- corruption = 1;
- *addr = 0;
- }
- }
-
- WARN(corruption, KERN_ERR "Memory corruption detected in low memory\n");
-}
-
-static void periodic_check_for_corruption(unsigned long data)
-{
- check_for_bios_corruption();
- mod_timer(&periodic_check_timer, round_jiffies(jiffies + corruption_check_period*HZ));
-}
-
-void start_periodic_check_for_corruption(void)
-{
- if (!memory_corruption_check || corruption_check_period == 0)
- return;
-
- printk(KERN_INFO "Scanning for low memory corruption every %d seconds\n",
- corruption_check_period);
-
- init_timer(&periodic_check_timer);
- periodic_check_timer.function = &periodic_check_for_corruption;
- periodic_check_for_corruption(0);
-}
-#endif
-
static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
{
printk(KERN_NOTICE
diff --git a/include/asm-x86/setup.h b/include/asm-x86/setup.h
index 11b6cc1..5c55fc1 100644
--- a/include/asm-x86/setup.h
+++ b/include/asm-x86/setup.h
@@ -8,6 +8,10 @@
/* Interrupt control for vSMPowered x86_64 systems */
void vsmp_init(void);
+
+void setup_bios_corruption_check(void);
+
+
#ifdef CONFIG_X86_VISWS
extern void visws_early_detect(void);
extern int is_visws_box(void);
--
1.5.5.1
--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/3] corruption check: run the corruption checks from a work queue
2008-09-24 4:53 [PATCH 1/3] corruption check: move the corruption checks into their own file Arjan van de Ven
@ 2008-09-24 4:54 ` Arjan van de Ven
2008-09-24 5:54 ` Andrew Morton
2008-09-24 4:54 ` [PATCH 3/3] corruption check: fix various checkpatch warnings Arjan van de Ven
2008-09-24 5:53 ` [PATCH 1/3] corruption check: move the corruption checks into their own file Andrew Morton
2 siblings, 1 reply; 8+ messages in thread
From: Arjan van de Ven @ 2008-09-24 4:54 UTC (permalink / raw)
To: linux-kernel
Cc: Arjan van de Ven, mingo, Hugh Dickins, Jeremy Fitzhardinge,
Randy.Dunlap
From: Arjan van de Ven <arjan@linux.intel.com>
Date: Mon, 22 Sep 2008 13:42:15 -0700
Subject: [PATCH] corruption check: run the corruption checks from a work queue
the corruption checks are better off run from a work queue; there's nothing
time critical about them and this way the amount of interrupt-context work
is reduced.
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
---
arch/x86/kernel/check.c | 21 +++++++++++++++++----
arch/x86/mm/init_32.c | 2 --
arch/x86/mm/init_64.c | 2 --
include/linux/kernel.h | 2 +-
4 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/arch/x86/kernel/check.c b/arch/x86/kernel/check.c
index a7e80ed..b22733f 100644
--- a/arch/x86/kernel/check.c
+++ b/arch/x86/kernel/check.c
@@ -1,5 +1,6 @@
#include <linux/module.h>
#include <linux/sched.h>
+#include <linux/kthread.h>
#include <asm/e820.h>
#include <asm/proto.h>
@@ -135,22 +136,34 @@ void check_for_bios_corruption(void)
WARN(corruption, KERN_ERR "Memory corruption detected in low memory\n");
}
-static void periodic_check_for_corruption(unsigned long data)
+static void check_corruption(struct work_struct *dummy)
{
check_for_bios_corruption();
+}
+
+static void periodic_check_for_corruption(unsigned long data)
+{
+ static DECLARE_WORK(corruptioncheck_work, check_corruption);
+ schedule_work(&corruptioncheck_work);
mod_timer(&periodic_check_timer, round_jiffies(jiffies + corruption_check_period*HZ));
}
-void start_periodic_check_for_corruption(void)
+
+
+int start_periodic_check_for_corruption(void)
{
if (!memory_corruption_check || corruption_check_period == 0)
- return;
+ return 0;
printk(KERN_INFO "Scanning for low memory corruption every %d seconds\n",
corruption_check_period);
init_timer(&periodic_check_timer);
periodic_check_timer.function = &periodic_check_for_corruption;
- periodic_check_for_corruption(0);
+ mod_timer(&periodic_check_timer,
+ round_jiffies(jiffies + corruption_check_period*HZ));
+ return 0;
}
+
+module_init(start_periodic_check_for_corruption);
#endif
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
index b4c3a92..16ea9d0 100644
--- a/arch/x86/mm/init_32.c
+++ b/arch/x86/mm/init_32.c
@@ -905,8 +905,6 @@ void __init mem_init(void)
int codesize, reservedpages, datasize, initsize;
int tmp;
- start_periodic_check_for_corruption();
-
#ifdef CONFIG_FLATMEM
BUG_ON(!mem_map);
#endif
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index b565721..b65492e 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -822,8 +822,6 @@ void __init mem_init(void)
{
long codesize, reservedpages, datasize, initsize;
- start_periodic_check_for_corruption();
-
pci_iommu_alloc();
/* clear_bss() already clear the empty_zero_page */
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index a5afee2..01085d2 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -260,7 +260,7 @@ extern int root_mountflags;
* able to scatter it around anywhere in the kernel.
*/
void check_for_bios_corruption(void);
-void start_periodic_check_for_corruption(void);
+int start_periodic_check_for_corruption(void);
#else
static inline void check_for_bios_corruption(void)
{
--
1.5.5.1
--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/3] corruption check: fix various checkpatch warnings
2008-09-24 4:53 [PATCH 1/3] corruption check: move the corruption checks into their own file Arjan van de Ven
2008-09-24 4:54 ` [PATCH 2/3] corruption check: run the corruption checks from a work queue Arjan van de Ven
@ 2008-09-24 4:54 ` Arjan van de Ven
2008-09-24 5:53 ` [PATCH 1/3] corruption check: move the corruption checks into their own file Andrew Morton
2 siblings, 0 replies; 8+ messages in thread
From: Arjan van de Ven @ 2008-09-24 4:54 UTC (permalink / raw)
To: linux-kernel
Cc: Arjan van de Ven, mingo, Hugh Dickins, Jeremy Fitzhardinge,
Randy.Dunlap
>From 9e49c38637f335d5c91a0f1c4deea7ce2c20aa34 Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <arjan@linux.intel.com>
Date: Tue, 23 Sep 2008 11:09:10 -0700
Subject: [PATCH] corruption check: fix various checkpatch warnings
Cleanups as suggested by Randy / checkpatch.pl
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
---
arch/x86/kernel/check.c | 8 ++++----
include/linux/kernel.h | 5 -----
2 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/arch/x86/kernel/check.c b/arch/x86/kernel/check.c
index b22733f..c59bfe6 100644
--- a/arch/x86/kernel/check.c
+++ b/arch/x86/kernel/check.c
@@ -80,7 +80,7 @@ void __init setup_bios_corruption_check(void)
corruption_check_size = round_up(corruption_check_size, PAGE_SIZE);
- while(addr < corruption_check_size && num_scan_areas < MAX_SCAN_AREAS) {
+ while (addr < corruption_check_size && num_scan_areas < MAX_SCAN_AREAS) {
u64 size;
addr = find_e820_area_size(addr, &size, PAGE_SIZE);
@@ -119,11 +119,11 @@ void check_for_bios_corruption(void)
if (!memory_corruption_check)
return;
- for(i = 0; i < num_scan_areas; i++) {
+ for (i = 0; i < num_scan_areas; i++) {
unsigned long *addr = __va(scan_areas[i].addr);
unsigned long size = scan_areas[i].size;
- for(; size; addr++, size -= sizeof(unsigned long)) {
+ for (; size; addr++, size -= sizeof(unsigned long)) {
if (!*addr)
continue;
printk(KERN_ERR "Corrupted low memory at %p (%lx phys) = %08lx\n",
@@ -150,7 +150,7 @@ static void periodic_check_for_corruption(unsigned long data)
-int start_periodic_check_for_corruption(void)
+static int start_periodic_check_for_corruption(void)
{
if (!memory_corruption_check || corruption_check_period == 0)
return 0;
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 01085d2..b39c7ef 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -260,15 +260,10 @@ extern int root_mountflags;
* able to scatter it around anywhere in the kernel.
*/
void check_for_bios_corruption(void);
-int start_periodic_check_for_corruption(void);
#else
static inline void check_for_bios_corruption(void)
{
}
-
-static inline void start_periodic_check_for_corruption(void)
-{
-}
#endif
/* Values used for system_state */
--
1.5.5.1
--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] corruption check: move the corruption checks into their own file
2008-09-24 4:53 [PATCH 1/3] corruption check: move the corruption checks into their own file Arjan van de Ven
2008-09-24 4:54 ` [PATCH 2/3] corruption check: run the corruption checks from a work queue Arjan van de Ven
2008-09-24 4:54 ` [PATCH 3/3] corruption check: fix various checkpatch warnings Arjan van de Ven
@ 2008-09-24 5:53 ` Andrew Morton
2008-09-24 17:16 ` Arjan van de Ven
2 siblings, 1 reply; 8+ messages in thread
From: Andrew Morton @ 2008-09-24 5:53 UTC (permalink / raw)
To: Arjan van de Ven
Cc: linux-kernel, mingo, Hugh Dickins, Jeremy Fitzhardinge,
Randy.Dunlap
On Tue, 23 Sep 2008 21:53:35 -0700 Arjan van de Ven <arjan@infradead.org> wrote:
>
> >From 19058f850aaf82d8185f06b54582a3d8e1ca8d97 Mon Sep 17 00:00:00 2001
> From: Arjan van de Ven <arjan@linux.intel.com>
> Date: Mon, 22 Sep 2008 09:35:06 -0700
> Subject: [PATCH] corruption check: move the corruption checks into their own file
>
> There'll be more checks over time (based on kerneloops data I have
> several ideas already) and making the checks their own file rather
> than setup.c makes sense in that light.
>
> Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
> ---
> arch/x86/kernel/Makefile | 1 +
> arch/x86/kernel/check.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++
> arch/x86/kernel/setup.c | 151 --------------------------------------------
So this is long-standing code. Let's pretend otherwise ;)
> include/asm-x86/setup.h | 4 +
> 4 files changed, 161 insertions(+), 151 deletions(-)
> create mode 100644 arch/x86/kernel/check.c
>
> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
> index c71722d..5d788ea 100644
> --- a/arch/x86/kernel/Makefile
> +++ b/arch/x86/kernel/Makefile
> @@ -36,6 +36,7 @@ obj-y += bootflag.o e820.o
> obj-y += pci-dma.o quirks.o i8237.o topology.o kdebugfs.o
> obj-y += alternative.o i8253.o pci-nommu.o
> obj-y += tsc.o io_delay.o rtc.o
> +obj-y += check.o
>
> obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o
> obj-y += process.o
> diff --git a/arch/x86/kernel/check.c b/arch/x86/kernel/check.c
> new file mode 100644
> index 0000000..a7e80ed
> --- /dev/null
> +++ b/arch/x86/kernel/check.c
> @@ -0,0 +1,156 @@
> +#include <linux/module.h>
> +#include <linux/sched.h>
> +
> +#include <asm/e820.h>
> +#include <asm/proto.h>
> +
> +/*
> + * Some BIOSes seem to corrupt the low 64k of memory during events
> + * like suspend/resume and unplugging an HDMI cable. Reserve all
> + * remaining free memory in that area and fill it with a distinct
> + * pattern.
> + */
> +#ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
> +#define MAX_SCAN_AREAS 8
> +
> +static int __read_mostly memory_corruption_check = -1;
> +
> +static unsigned __read_mostly corruption_check_size = 64*1024;
> +static unsigned __read_mostly corruption_check_period = 60; /* seconds */
> +
> +static struct e820entry scan_areas[MAX_SCAN_AREAS];
> +static int num_scan_areas;
> +
> +
> +static int set_corruption_check(char *arg)
> +{
> + char *end;
> +
> + memory_corruption_check = simple_strtol(arg, &end, 10);
> +
> + return (*end == 0) ? 0 : -EINVAL;
> +}
> +early_param("memory_corruption_check", set_corruption_check);
__init?
> +static int set_corruption_check_period(char *arg)
> +{
> + char *end;
> +
> + corruption_check_period = simple_strtoul(arg, &end, 10);
> +
> + return (*end == 0) ? 0 : -EINVAL;
> +}
> +early_param("memory_corruption_check_period", set_corruption_check_period);
__init?
> +static int set_corruption_check_size(char *arg)
> +{
> + char *end;
> + unsigned size;
> +
> + size = memparse(arg, &end);
> +
> + if (*end == '\0')
> + corruption_check_size = size;
> +
> + return (size == corruption_check_size) ? 0 : -EINVAL;
> +}
> +early_param("memory_corruption_check_size", set_corruption_check_size);
__init?
> +
> +void __init setup_bios_corruption_check(void)
> +{
> + u64 addr = PAGE_SIZE; /* assume first page is reserved anyway */
> +
> + if (memory_corruption_check == -1) {
> + memory_corruption_check =
> +#ifdef CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK
> + 1
> +#else
> + 0
> +#endif
> + ;
> + }
> +
> + if (corruption_check_size == 0)
> + memory_corruption_check = 0;
> +
> + if (!memory_corruption_check)
> + return;
> +
> + corruption_check_size = round_up(corruption_check_size, PAGE_SIZE);
> +
> + while(addr < corruption_check_size && num_scan_areas < MAX_SCAN_AREAS) {
> + u64 size;
> + addr = find_e820_area_size(addr, &size, PAGE_SIZE);
> +
> + if (addr == 0)
> + break;
> +
> + if ((addr + size) > corruption_check_size)
> + size = corruption_check_size - addr;
> +
> + if (size == 0)
> + break;
> +
> + e820_update_range(addr, size, E820_RAM, E820_RESERVED);
> + scan_areas[num_scan_areas].addr = addr;
> + scan_areas[num_scan_areas].size = size;
> + num_scan_areas++;
> +
> + /* Assume we've already mapped this early memory */
> + memset(__va(addr), 0, size);
> +
> + addr += size;
> + }
> +
> + printk(KERN_INFO "Scanning %d areas for low memory corruption\n",
> + num_scan_areas);
> + update_e820();
> +}
> +
> +static struct timer_list periodic_check_timer;
Could use DEFINE_TIMER() here.
> +void check_for_bios_corruption(void)
> +{
> + int i;
> + int corruption = 0;
> +
> + if (!memory_corruption_check)
> + return;
> +
> + for(i = 0; i < num_scan_areas; i++) {
> + unsigned long *addr = __va(scan_areas[i].addr);
> + unsigned long size = scan_areas[i].size;
> +
> + for(; size; addr++, size -= sizeof(unsigned long)) {
> + if (!*addr)
> + continue;
> + printk(KERN_ERR "Corrupted low memory at %p (%lx phys) = %08lx\n",
> + addr, __pa(addr), *addr);
> + corruption = 1;
> + *addr = 0;
> + }
> + }
> +
> + WARN(corruption, KERN_ERR "Memory corruption detected in low memory\n");
> +}
> +
> +static void periodic_check_for_corruption(unsigned long data)
> +{
> + check_for_bios_corruption();
> + mod_timer(&periodic_check_timer, round_jiffies(jiffies + corruption_check_period*HZ));
> +}
> +
> +void start_periodic_check_for_corruption(void)
> +{
> + if (!memory_corruption_check || corruption_check_period == 0)
> + return;
> +
> + printk(KERN_INFO "Scanning for low memory corruption every %d seconds\n",
> + corruption_check_period);
> +
> + init_timer(&periodic_check_timer);
> + periodic_check_timer.function = &periodic_check_for_corruption;
and zap those.
> + periodic_check_for_corruption(0);
> +}
> +#endif
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] corruption check: run the corruption checks from a work queue
2008-09-24 4:54 ` [PATCH 2/3] corruption check: run the corruption checks from a work queue Arjan van de Ven
@ 2008-09-24 5:54 ` Andrew Morton
0 siblings, 0 replies; 8+ messages in thread
From: Andrew Morton @ 2008-09-24 5:54 UTC (permalink / raw)
To: Arjan van de Ven
Cc: linux-kernel, mingo, Hugh Dickins, Jeremy Fitzhardinge,
Randy.Dunlap
On Tue, 23 Sep 2008 21:54:13 -0700 Arjan van de Ven <arjan@infradead.org> wrote:
>
> From: Arjan van de Ven <arjan@linux.intel.com>
> Date: Mon, 22 Sep 2008 13:42:15 -0700
> Subject: [PATCH] corruption check: run the corruption checks from a work queue
>
> the corruption checks are better off run from a work queue; there's nothing
> time critical about them and this way the amount of interrupt-context work
> is reduced.
>
> ...
>
> +int start_periodic_check_for_corruption(void)
> {
> if (!memory_corruption_check || corruption_check_period == 0)
> - return;
> + return 0;
>
> printk(KERN_INFO "Scanning for low memory corruption every %d seconds\n",
> corruption_check_period);
>
> init_timer(&periodic_check_timer);
> periodic_check_timer.function = &periodic_check_for_corruption;
> - periodic_check_for_corruption(0);
> + mod_timer(&periodic_check_timer,
> + round_jiffies(jiffies + corruption_check_period*HZ));
> + return 0;
> }
Could use schedule_delayed_work() and zap the timer altogether?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] corruption check: move the corruption checks into their own file
2008-09-24 5:53 ` [PATCH 1/3] corruption check: move the corruption checks into their own file Andrew Morton
@ 2008-09-24 17:16 ` Arjan van de Ven
2008-09-24 19:36 ` Randy Dunlap
2008-09-25 10:40 ` Ingo Molnar
0 siblings, 2 replies; 8+ messages in thread
From: Arjan van de Ven @ 2008-09-24 17:16 UTC (permalink / raw)
To: Andrew Morton
Cc: linux-kernel, mingo, Hugh Dickins, Jeremy Fitzhardinge,
Randy.Dunlap
On Tue, 23 Sep 2008 22:53:06 -0700
Andrew Morton <akpm@linux-foundation.org> wrote:
> __init?
I got flamed already for changing code while it's just being moved ....
I'll look at your cleanup suggestions as another separate patch
please ;(
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] corruption check: move the corruption checks into their own file
2008-09-24 17:16 ` Arjan van de Ven
@ 2008-09-24 19:36 ` Randy Dunlap
2008-09-25 10:40 ` Ingo Molnar
1 sibling, 0 replies; 8+ messages in thread
From: Randy Dunlap @ 2008-09-24 19:36 UTC (permalink / raw)
To: Arjan van de Ven
Cc: Andrew Morton, linux-kernel, mingo, Hugh Dickins,
Jeremy Fitzhardinge, Randy.Dunlap
On Wed, 24 Sep 2008 10:16:08 -0700 Arjan van de Ven wrote:
> On Tue, 23 Sep 2008 22:53:06 -0700
> Andrew Morton <akpm@linux-foundation.org> wrote:
>
>
> > __init?
>
> I got flamed already for changing code while it's just being moved ....
You mean what Ingo said? I don't see any flames in what he said.
Maybe you got flames by private email??
> I'll look at your cleanup suggestions as another separate patch
> please ;(
whatever.
---
~Randy
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/3] corruption check: move the corruption checks into their own file
2008-09-24 17:16 ` Arjan van de Ven
2008-09-24 19:36 ` Randy Dunlap
@ 2008-09-25 10:40 ` Ingo Molnar
1 sibling, 0 replies; 8+ messages in thread
From: Ingo Molnar @ 2008-09-25 10:40 UTC (permalink / raw)
To: Arjan van de Ven
Cc: Andrew Morton, linux-kernel, Hugh Dickins, Jeremy Fitzhardinge,
Randy.Dunlap
* Arjan van de Ven <arjan@infradead.org> wrote:
> I'll look at your cleanup suggestions as another separate patch please
yes, that's natural. Anything that isnt super-important to backmerge
should go into a separate patch.
Ingo
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-09-25 10:40 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-24 4:53 [PATCH 1/3] corruption check: move the corruption checks into their own file Arjan van de Ven
2008-09-24 4:54 ` [PATCH 2/3] corruption check: run the corruption checks from a work queue Arjan van de Ven
2008-09-24 5:54 ` Andrew Morton
2008-09-24 4:54 ` [PATCH 3/3] corruption check: fix various checkpatch warnings Arjan van de Ven
2008-09-24 5:53 ` [PATCH 1/3] corruption check: move the corruption checks into their own file Andrew Morton
2008-09-24 17:16 ` Arjan van de Ven
2008-09-24 19:36 ` Randy Dunlap
2008-09-25 10:40 ` Ingo Molnar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox