diff options
author | Hugh Dickins <hugh@veritas.com> | 2008-09-07 04:51:33 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-09-07 11:40:00 -0400 |
commit | bb577f980ef35e2b0d00aeed566724e5032aa5eb (patch) | |
tree | 2c9016f7811fb3ea80bbbc8d9856c217110695b7 | |
parent | 5394f80f92642c61fc2a95385be85f2fdcfb5adb (diff) |
x86: add periodic corruption check
Perodically check for corruption in low phusical memory. Don't bother
checking at fault time, since it won't show anything useful.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/kernel/setup.c | 17 | ||||
-rw-r--r-- | arch/x86/mm/fault.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/init_32.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 2 | ||||
-rw-r--r-- | include/linux/kernel.h | 1 |
5 files changed, 22 insertions, 2 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index ee89ebc5aabc..c239b3780973 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -623,6 +623,7 @@ static void __init setup_bios_corruption_check(void) | |||
623 | } | 623 | } |
624 | 624 | ||
625 | static int __read_mostly bios_corruption_check = 1; | 625 | static int __read_mostly bios_corruption_check = 1; |
626 | static struct timer_list periodic_check_timer; | ||
626 | 627 | ||
627 | void check_for_bios_corruption(void) | 628 | void check_for_bios_corruption(void) |
628 | { | 629 | { |
@@ -650,6 +651,22 @@ void check_for_bios_corruption(void) | |||
650 | dump_stack(); | 651 | dump_stack(); |
651 | } | 652 | } |
652 | 653 | ||
654 | static void periodic_check_for_corruption(unsigned long data) | ||
655 | { | ||
656 | check_for_bios_corruption(); | ||
657 | mod_timer(&periodic_check_timer, jiffies + 60*HZ); | ||
658 | } | ||
659 | |||
660 | void start_periodic_check_for_corruption(void) | ||
661 | { | ||
662 | if (!bios_corruption_check) | ||
663 | return; | ||
664 | |||
665 | init_timer(&periodic_check_timer); | ||
666 | periodic_check_timer.function = &periodic_check_for_corruption; | ||
667 | periodic_check_for_corruption(0); | ||
668 | } | ||
669 | |||
653 | static int set_bios_corruption_check(char *arg) | 670 | static int set_bios_corruption_check(char *arg) |
654 | { | 671 | { |
655 | char *end; | 672 | char *end; |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 5140bdf03020..455f3fe67b42 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -848,8 +848,6 @@ no_context: | |||
848 | * Oops. The kernel tried to access some bad page. We'll have to | 848 | * Oops. The kernel tried to access some bad page. We'll have to |
849 | * terminate things with extreme prejudice. | 849 | * terminate things with extreme prejudice. |
850 | */ | 850 | */ |
851 | check_for_bios_corruption(); | ||
852 | |||
853 | #ifdef CONFIG_X86_32 | 851 | #ifdef CONFIG_X86_32 |
854 | bust_spinlocks(1); | 852 | bust_spinlocks(1); |
855 | #else | 853 | #else |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index d37f29376b0c..657a16ad61ba 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -907,6 +907,8 @@ void __init mem_init(void) | |||
907 | int codesize, reservedpages, datasize, initsize; | 907 | int codesize, reservedpages, datasize, initsize; |
908 | int tmp; | 908 | int tmp; |
909 | 909 | ||
910 | start_periodic_check_for_corruption(); | ||
911 | |||
910 | #ifdef CONFIG_FLATMEM | 912 | #ifdef CONFIG_FLATMEM |
911 | BUG_ON(!mem_map); | 913 | BUG_ON(!mem_map); |
912 | #endif | 914 | #endif |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index d3746efb060d..f4db5276fa21 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -769,6 +769,8 @@ void __init mem_init(void) | |||
769 | { | 769 | { |
770 | long codesize, reservedpages, datasize, initsize; | 770 | long codesize, reservedpages, datasize, initsize; |
771 | 771 | ||
772 | start_periodic_check_for_corruption(); | ||
773 | |||
772 | pci_iommu_alloc(); | 774 | pci_iommu_alloc(); |
773 | 775 | ||
774 | /* clear_bss() already clear the empty_zero_page */ | 776 | /* clear_bss() already clear the empty_zero_page */ |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 8017129e6b63..00bb251c6451 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -246,6 +246,7 @@ extern int root_mountflags; | |||
246 | * able to scatter it around anywhere in the kernel. | 246 | * able to scatter it around anywhere in the kernel. |
247 | */ | 247 | */ |
248 | void check_for_bios_corruption(void); | 248 | void check_for_bios_corruption(void); |
249 | void start_periodic_check_for_corruption(void); | ||
249 | #else | 250 | #else |
250 | static inline void check_for_bios_corruption(void) | 251 | static inline void check_for_bios_corruption(void) |
251 | { | 252 | { |