ia64: Call migration code on correctable errors
PATCH 2/2 ia64: Call migration code on correctable errors
Migrate data off pages with correctable memory errors. This patch is ia64 specific. It connects the CPE handler to the page migration code. It is implemented as a kernel loadable module, similar to the mca recovery code (mca_recovery.ko). This allows the feature to be turned off by uninstalling the module.
It adds a /sys/firmware/badram/ interface to control migrate_threshold, cpe_polling_threshold, and cmc_polling_threshold.
Signed-off-by Russ Anderson <[email protected]>
--- arch/ia64/Kconfig | 10 arch/ia64/include/asm/mca.h | 14 arch/ia64/include/asm/page.h | 1 arch/ia64/kernel/Makefile | 1 arch/ia64/kernel/cpe_migrate.c | 628 +++++++++++++++++++++++++++++++++++++++++ arch/ia64/kernel/mca.c | 120 ++++++- 6 files changed, 753 insertions(+), 21 deletions(-)
arch/ia64/Kconfig +10 -0
@@ -512,6 +512,16 @@ config COMPAT_FOR_U64_ALIGNMENT config IA64_MCA_RECOVERY tristate "MCA recovery from errors other than TLB." +config IA64_CPE_MIGRATE + tristate "Migrate data off pages with correctable errors" + depends on MEMORY_FAILURE + default m + help + Migrate data off pages with correctable memory errors. Selecting + Y will build this functionality into the kernel. Selecting M will + build this functionality as a kernel loadable module. Installing + the module will turn on the functionality. + config PERFMON bool "Performance monitor support" help
arch/ia64/include/asm/mca.h +14 -0
@@ -137,6 +137,9 @@ extern unsigned long __per_cpu_mca[NR_CPextern int cpe_vector;extern int ia64_cpe_irq; +extern int cpe_poll_enabled; +extern int cpe_poll_threshold; +extern int cmc_poll_threshold;extern void ia64_mca_init (void );extern void ia64_mca_cpu_init (void *);extern void ia64_os_mca_dispatch (void );
@@ -150,14 +153,25 @@ extern void ia64_slave_init_handler(voidextern void ia64_mca_cmc_vector_setup (void );extern int ia64_reg_MCA_extension (int (*fn)(void *,struct ia64_sal_os_state *));extern void ia64_unreg_MCA_extension (void ); +extern int ia64_reg_CE_extension (int (*fn)(void *)); +extern void ia64_unreg_CE_extension (void ); +extern int isolate_lru_page (struct page *page);extern u64 ia64_get_rnat (u64 *);extern void ia64_mca_printk (const char * fmt, ...) __attribute__ ((format (printf,1 ,2 ))); +extern struct list_head badpagelist; +extern unsigned int total_badpages; +struct ia64_mca_notify_die {struct ia64_sal_os_state *sos;int *monarch_cpu;int *data; +}; + +struct ce_history { +struct list_head list; +unsigned long time; };DECLARE_PER_CPU (u64, ia64_mca_pal_base);
arch/ia64/include/asm/page.h +1 -0
@@ -121,6 +121,7 @@ extern unsigned long max_low_pfn;#endif #define page_to_phys (page) (page_to_pfn(page) << PAGE_SHIFT) +#define phys_to_page (kaddr) (pfn_to_page(kaddr >> PAGE_SHIFT))#define virt_to_page (kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)#define pfn_to_kaddr (pfn) __va((pfn) << PAGE_SHIFT)
arch/ia64/kernel/Makefile +1 -0
@@ -31,6 +31,7 @@ obj-$(CONFIG_PERFMON) += perfmon_defaul obj-$(CONFIG_IA64_CYCLONE) += cyclone.o obj-$(CONFIG_CPU_FREQ) += cpufreq/ obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o +obj-$(CONFIG_IA64_CPE_MIGRATE) += cpe_migrate.o obj-$(CONFIG_KPROBES) += kprobes.o jprobes.o obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o crash.o
arch/ia64/kernel/cpe_migrate.c new file +628 -0
628 lines not on this page · raw message
arch/ia64/kernel/mca.c +99 -21
195 lines not on this page · raw message
Signature · 8 lines
Russ Anderson, OS RAS/Partitioning Project Lead SGI - Silicon Graphics Inc [email protected] -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>