Skip to contentSkip to conversation

x86: corruption-check: fix some style issues

PATCH Applied Arjan van de Ven 3 participants 6 messages Oct 5, 2008 – Oct 27, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/4 x86: corruption-check: fix some style issues

From: Arjan van de Ven <[email protected]>
Date: Sun, 5 Oct 2008 11:08:10 -0700
Subject: [PATCH] x86: corruption-check: fix some style issues

Before moving the code to it's own file, fix some style issues in the corruption check code.

---
 arch/x86/kernel/setup.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)
arch/x86/kernel/setup.c +5 -4
index 6133530..5a21905 100644
@@ -656,7 +656,7 @@ static 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);
 
@@ -695,11 +695,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",
@@ -715,7 +715,8 @@ void check_for_bios_corruption(void)
 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));
+	mod_timer(&periodic_check_timer,
+		round_jiffies(jiffies + corruption_check_period*HZ));
 }
 
 void start_periodic_check_for_corruption(void)
Signature · 8 lines
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
#1 lore raw

PATCH 2/4 x86: corruption check: move the corruption checks into their own file

From: Arjan van de Ven <[email protected]>
Date: Sun, 5 Oct 2008 11:33:42 -0700
Subject: [PATCH] x86: corruption check: move the corruption checks into their own file

The corruption check code is rather sizable and it's likely to grow over time when we add checks for more types of corruptions (there's a few candidates in kerneloops.org that I want to add checks for)... so lets move it to its own file

---
 arch/x86/kernel/Makefile |    1 +
 arch/x86/kernel/check.c  |  158 ++++++++++++++++++++++++++++++++++++++++++++++
 arch/x86/kernel/setup.c  |  152 --------------------------------------------
 include/asm-x86/setup.h  |    4 +
 4 files changed, 163 insertions(+), 152 deletions(-)
 create mode 100644 arch/x86/kernel/check.c
arch/x86/kernel/Makefile +1 -0
index 12a0469..d042063 100644
@@ -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
arch/x86/kernel/check.c new file +158 -0

158 lines not on this page · raw message

arch/x86/kernel/setup.c +0 -152

158 lines not on this page · raw message

include/asm-x86/setup.h +4 -0
index 11b6cc1..5c55fc1 100644
@@ -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);
Signature · 7 lines
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
#2 lore raw

PATCH 3/4 x86: corruption check: run the corruption checks from a work queue

In reply to Arjan van de Ven

From: Arjan van de Ven <[email protected]>
Date: Mon, 22 Sep 2008 13:42:15 -0700
Subject: [PATCH] x86: corruption check: run the corruption checks from a work queue

the periodic 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.

---
 arch/x86/kernel/check.c |   27 +++++++++++++++++----------
 arch/x86/mm/init_32.c   |    2 --
 arch/x86/mm/init_64.c   |    2 --
 include/linux/kernel.h  |    5 -----
 4 files changed, 17 insertions(+), 19 deletions(-)
arch/x86/kernel/check.c +17 -10
index 5056703..55eed17 100644
@@ -1,6 +1,7 @@
 #include <linux/module.h>
 #include <linux/sched.h>
-
+#include <linux/kthread.h>
+#include <linux/workqueue.h>
 #include <asm/e820.h>
 #include <asm/proto.h>
 
@@ -108,13 +109,14 @@ void __init setup_bios_corruption_check(void)
 	update_e820();
 }
 
-static struct timer_list periodic_check_timer;
 
 void check_for_bios_corruption(void)
 {
 	int i;
 	int corruption = 0;
 
+	printk("dot\n");
+
 	if (!memory_corruption_check)
 		return;
 
@@ -135,24 +137,29 @@ 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);
+static DECLARE_DELAYED_WORK(bios_check_work, check_corruption);
+
+static void check_corruption(struct work_struct *dummy)
 {
 	check_for_bios_corruption();
-	mod_timer(&periodic_check_timer,
-		round_jiffies(jiffies + corruption_check_period*HZ));
+	schedule_delayed_work(&bios_check_work,
+		round_jiffies_relative(corruption_check_period*HZ)); 
 }
 
-void start_periodic_check_for_corruption(void)
+static 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);
+	/* First time we run the checks right away */
+	schedule_delayed_work(&bios_check_work, 0);
+	return 0;
 }
+
+module_init(start_periodic_check_for_corruption);
 #endif
 
arch/x86/mm/init_32.c +0 -2
index b646e5b..63b71d3 100644
@@ -970,8 +970,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
arch/x86/mm/init_64.c +0 -2
index a624017..747f6c9 100644
@@ -905,8 +905,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 */
include/linux/kernel.h +0 -5
index a5afee2..b39c7ef 100644
@@ -260,15 +260,10 @@ 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);
 #else
 static inline void check_for_bios_corruption(void)
 {
 }
-
-static inline void start_periodic_check_for_corruption(void)
-{
-}
 #endif
 
 /* Values used for system_state */
Signature · 8 lines
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
#3 lore raw

Re: [PATCH 3/4] x86: corruption check: run the corruption checks from a work queue

Quoted 10 lines · Arjan van de Ven

From: Arjan van de Ven <[email protected]>
Date: Mon, 22 Sep 2008 13:42:15 -0700
Subject: [PATCH] x86: corruption check: run the corruption checks from a work queue

the periodic 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.

Hi,

Did you figure out what's causing these corruptions yet?

Can't you do so by simply reserving the memory area in question, clearing the present bit for those pages, and letting the page fault handler catch whatever code is accessing it?

Vegard

Signature · 4 lines
"The animistic metaphor of the bug that maliciously sneaked in while
the programmer was not looking is intellectually dishonest as it
disguises that the error is the programmer's own creation."
	-- E. W. Dijkstra, EWD1036
#4 lore raw

PATCH 4/4 x86: corruption-check: some post-move cleanups

In reply to Arjan van de Ven

From: Arjan van de Ven <[email protected]>
Date: Sun, 5 Oct 2008 12:05:30 -0700
Subject: [PATCH] x86: corruption-check: some post-move cleanups

now that the code is moved and converted to a work queue, there's some minor cleanups that can be done.

---
 arch/x86/kernel/Makefile |    3 ++-
 arch/x86/kernel/check.c  |   10 ++++------
 2 files changed, 6 insertions(+), 7 deletions(-)
arch/x86/kernel/Makefile +2 -1
index d042063..31a41b2 100644
@@ -36,7 +36,6 @@ 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
@@ -106,6 +105,8 @@ microcode-$(CONFIG_MICROCODE_INTEL)	+= microcode_intel.o
 microcode-$(CONFIG_MICROCODE_AMD)	+= microcode_amd.o
 obj-$(CONFIG_MICROCODE)			+= microcode.o
 
+obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o
+
 ###
 # 64 bit specific files
 ifeq ($(CONFIG_X86_64),y)
arch/x86/kernel/check.c +4 -6
index 55eed17..3ba1100 100644
@@ -11,7 +11,6 @@
  * 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;
@@ -23,7 +22,7 @@ static struct e820entry scan_areas[MAX_SCAN_AREAS];
 static int num_scan_areas;
 
 
-static int set_corruption_check(char *arg)
+static __init int set_corruption_check(char *arg)
 {
 	char *end;
 
@@ -33,7 +32,7 @@ static int set_corruption_check(char *arg)
 }
 early_param("memory_corruption_check", set_corruption_check);
 
-static int set_corruption_check_period(char *arg)
+static __init int set_corruption_check_period(char *arg)
 {
 	char *end;
 
@@ -43,7 +42,7 @@ static int set_corruption_check_period(char *arg)
 }
 early_param("memory_corruption_check_period", set_corruption_check_period);
 
-static int set_corruption_check_size(char *arg)
+static __init int set_corruption_check_size(char *arg)
 {
 	char *end;
 	unsigned size;
@@ -134,7 +133,7 @@ void check_for_bios_corruption(void)
 		}
 	}
 
-	WARN(corruption, KERN_ERR "Memory corruption detected in low memory\n");
+	WARN_ONCE(corruption, KERN_ERR "Memory corruption detected in low memory\n");
 }
 
 static void check_corruption(struct work_struct *dummy);
@@ -161,5 +160,4 @@ static int start_periodic_check_for_corruption(void)
 }
 
 module_init(start_periodic_check_for_corruption);
-#endif
 
Signature · 8 lines
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
Applied
#5 lore raw
In reply to Arjan van de Ven
Quoted 11 lines · Arjan van de Ven

From: Arjan van de Ven <[email protected]>
Date: Sun, 5 Oct 2008 11:08:10 -0700
Subject: [PATCH] x86: corruption-check: fix some style issues

Before moving the code to it's own file, fix some style issues in the corruption check code.

---
 arch/x86/kernel/setup.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

i've picked up your fixes into tip/x86/corruption-check:

b43d196: x86: corruption-check: some post-move cleanups
304e629: x86: corruption check: run the corruption checks from a work queue 6784f7d: x86: corruption check: move the corruption checks into their own file 04d2aac: x86: corruption-check: fix some style issues

thanks Arjan!

Ingo