[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] [IA64] backport CONFIG_KEXEC/CONFIG_CRASH_DUMP permutations



# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1190924551 21600
# Node ID d3f72c686185330ef5a577f19959703245eeca93
# Parent  be065a274674c792a2bd5787c635d972d65770b7
[IA64] backport CONFIG_KEXEC/CONFIG_CRASH_DUMP permutations

From: Simon Horman <horms@xxxxxxxxxxxx>
Upstream Linux changeset 45a98fc622ae700eed34eb2be00743910d50dbe1

[IA64] CONFIG_KEXEC/CONFIG_CRASH_DUMP permutations

Actually, on reflection I think that there is a good case for
keeping the options separate. I am thinking particularly of people
who want a very small crashdump kernel and thus don't want to compile
in kexec.

The patch below should fix things up so that all valid combinations of
KEXEC, CRASH_DUMP and VMCORE compile cleanly - VMCORE depends on
CRASH_DUMP which is why I said valid combinations. In a nutshell
it just untangles unrelated code and switches around a few defines.

Please note that it creats a new file, arch/ia64/kernel/crash_dump.c
This is in keeping with the i386 implementation.

Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
Signed-off-by: Tony Luck <tony.luck@xxxxxxxxx>
---
 arch/ia64/kernel/Makefile     |    1 
 arch/ia64/kernel/crash.c      |   22 -------------------
 arch/ia64/kernel/crash_dump.c |   48 ++++++++++++++++++++++++++++++++++++++++++
 arch/ia64/kernel/mca.c        |    2 -
 arch/ia64/kernel/setup.c      |   15 +++++++++++++
 arch/ia64/kernel/smp.c        |    4 +--
 arch/ia64/mm/contig.c         |    6 +++++
 7 files changed, 73 insertions(+), 25 deletions(-)

diff -r be065a274674 -r d3f72c686185 arch/ia64/kernel/Makefile
--- a/arch/ia64/kernel/Makefile Fri Sep 28 09:51:31 2007 -0600
+++ b/arch/ia64/kernel/Makefile Thu Sep 27 14:22:31 2007 -0600
@@ -29,6 +29,7 @@ obj-$(CONFIG_IA64_MCA_RECOVERY)       += mca_r
 obj-$(CONFIG_IA64_MCA_RECOVERY)        += mca_recovery.o
 obj-$(CONFIG_KPROBES)          += kprobes.o jprobes.o
 obj-$(CONFIG_KEXEC)            += machine_kexec.o relocate_kernel.o crash.o
+obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
 obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR)  += uncached.o
 obj-$(CONFIG_AUDIT)            += audit.o
 mca_recovery-y                 += mca_drv.o mca_drv_asm.o
diff -r be065a274674 -r d3f72c686185 arch/ia64/kernel/crash.c
--- a/arch/ia64/kernel/crash.c  Fri Sep 28 09:51:31 2007 -0600
+++ b/arch/ia64/kernel/crash.c  Thu Sep 27 14:22:31 2007 -0600
@@ -19,29 +19,11 @@
 
 #include <asm/kdebug.h>
 #include <asm/mca.h>
-#include <asm/uaccess.h>
 
 int kdump_status[NR_CPUS];
 atomic_t kdump_cpu_freezed;
 atomic_t kdump_in_progress;
 int kdump_on_init = 1;
-ssize_t
-copy_oldmem_page(unsigned long pfn, char *buf,
-               size_t csize, unsigned long offset, int userbuf)
-{
-       void  *vaddr;
-
-       if (!csize)
-               return 0;
-       vaddr = __va(pfn<<PAGE_SHIFT);
-       if (userbuf) {
-               if (copy_to_user(buf, (vaddr + offset), csize)) {
-                       return -EFAULT;
-               }
-       } else
-               memcpy(buf, (vaddr + offset), csize);
-       return csize;
-}
 
 static inline Elf64_Word
 *append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
@@ -224,14 +206,10 @@ static int
 static int
 machine_crash_setup(void)
 {
-       char *from = strstr(saved_command_line, "elfcorehdr=");
        static struct notifier_block kdump_init_notifier_nb = {
                .notifier_call = kdump_init_notifier,
        };
        int ret;
-       if (from)
-               elfcorehdr_addr = memparse(from+11, &from);
-       saved_max_pfn = (unsigned long)-1;
        if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0)
                return ret;
 #ifdef CONFIG_SYSCTL
diff -r be065a274674 -r d3f72c686185 arch/ia64/kernel/crash_dump.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/arch/ia64/kernel/crash_dump.c     Thu Sep 27 14:22:31 2007 -0600
@@ -0,0 +1,48 @@
+/*
+ *     kernel/crash_dump.c - Memory preserving reboot related code.
+ *
+ *     Created by: Simon Horman <horms@xxxxxxxxxxxx>
+ *     Original code moved from kernel/crash.c
+ *     Original code comment copied from the i386 version of this file
+ */
+
+#include <linux/errno.h>
+#include <linux/types.h>
+
+#include <linux/uaccess.h>
+
+/**
+ * copy_oldmem_page - copy one page from "oldmem"
+ * @pfn: page frame number to be copied
+ * @buf: target memory address for the copy; this can be in kernel address
+ *     space or user address space (see @userbuf)
+ * @csize: number of bytes to copy
+ * @offset: offset in bytes into the page (based on pfn) to begin the copy
+ * @userbuf: if set, @buf is in user address space, use copy_to_user(),
+ *     otherwise @buf is in kernel address space, use memcpy().
+ *
+ * Copy a page from "oldmem". For this page, there is no pte mapped
+ * in the current kernel. We stitch up a pte, similar to kmap_atomic.
+ *
+ * Calling copy_to_user() in atomic context is not desirable. Hence first
+ * copying the data to a pre-allocated kernel page and then copying to user
+ * space in non-atomic context.
+ */
+ssize_t
+copy_oldmem_page(unsigned long pfn, char *buf,
+               size_t csize, unsigned long offset, int userbuf)
+{
+       void  *vaddr;
+
+       if (!csize)
+               return 0;
+       vaddr = __va(pfn<<PAGE_SHIFT);
+       if (userbuf) {
+               if (copy_to_user(buf, (vaddr + offset), csize)) {
+                       return -EFAULT;
+               }
+       } else
+               memcpy(buf, (vaddr + offset), csize);
+       return csize;
+}
+
diff -r be065a274674 -r d3f72c686185 arch/ia64/kernel/mca.c
--- a/arch/ia64/kernel/mca.c    Fri Sep 28 09:51:31 2007 -0600
+++ b/arch/ia64/kernel/mca.c    Thu Sep 27 14:22:31 2007 -0600
@@ -1090,7 +1090,7 @@ ia64_mca_handler(struct pt_regs *regs, s
                ia64_sal_clear_state_info(SAL_INFO_TYPE_MCA);
                sos->os_status = IA64_MCA_CORRECTED;
        } else {
-#ifdef CONFIG_CRASH_DUMP
+#ifdef CONFIG_KEXEC
                atomic_set(&kdump_in_progress, 1);
                monarch_cpu = -1;
 #endif
diff -r be065a274674 -r d3f72c686185 arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c  Fri Sep 28 09:51:31 2007 -0600
+++ b/arch/ia64/kernel/setup.c  Thu Sep 27 14:22:31 2007 -0600
@@ -488,6 +488,21 @@ static __init int setup_nomca(char *s)
        return 0;
 }
 early_param("nomca", setup_nomca);
+
+#ifdef CONFIG_PROC_VMCORE
+/* elfcorehdr= specifies the location of elf core header
+ * stored by the crashed kernel.
+ */
+static int __init parse_elfcorehdr(char *arg)
+{
+       if (!arg)
+               return -EINVAL;
+
+        elfcorehdr_addr = memparse(arg, &arg);
+       return 0;
+}
+early_param("elfcorehdr", parse_elfcorehdr);
+#endif /* CONFIG_PROC_VMCORE */
 
 void __init
 setup_arch (char **cmdline_p)
diff -r be065a274674 -r d3f72c686185 arch/ia64/kernel/smp.c
--- a/arch/ia64/kernel/smp.c    Fri Sep 28 09:51:31 2007 -0600
+++ b/arch/ia64/kernel/smp.c    Thu Sep 27 14:22:31 2007 -0600
@@ -157,7 +157,7 @@ handle_IPI (int irq, void *dev_id, struc
                              case IPI_CPU_STOP:
                                stop_this_cpu();
                                break;
-#ifdef CONFIG_CRASH_DUMP
+#ifdef CONFIG_KEXEC
                              case IPI_KDUMP_CPU_STOP:
                                unw_init_running(kdump_cpu_freeze, NULL);
                                break;
@@ -219,7 +219,7 @@ send_IPI_self (int op)
        send_IPI_single(smp_processor_id(), op);
 }
 
-#ifdef CONFIG_CRASH_DUMP
+#ifdef CONFIG_KEXEC
 void
 kdump_smp_send_stop()
 {
diff -r be065a274674 -r d3f72c686185 arch/ia64/mm/contig.c
--- a/arch/ia64/mm/contig.c     Fri Sep 28 09:51:31 2007 -0600
+++ b/arch/ia64/mm/contig.c     Thu Sep 27 14:22:31 2007 -0600
@@ -174,6 +174,12 @@ find_memory (void)
        reserve_bootmem(bootmap_start, bootmap_size);
 
        find_initrd();
+
+#ifdef CONFIG_CRASH_DUMP
+       /* If we are doing a crash dump, we still need to know the real mem
+        * size before original memory map is * reset. */
+       saved_max_pfn = max_pfn;
+#endif
 }
 
 #ifdef CONFIG_SMP

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.