* IA64 Kexec-Kdump kernel patch
@ 2006-08-14 6:47 Zou Nan hai
2006-08-14 21:24 ` Bob Montgomery
` (16 more replies)
0 siblings, 17 replies; 18+ messages in thread
From: Zou Nan hai @ 2006-08-14 6:47 UTC (permalink / raw)
To: linux-ia64
This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel.
Changes since last patch include:
1. re-base the patch to 2.6.18-rc4
2. per-cpu register dumping, so that user space tool can unwind kernel stack.
This should really done by INIT event. But unfortunately it seems that the
firmware on the machine I am using does not handle INIT event correctly...
So current I dump per-cpu registers by simple IPI.
3. fix on_line_cpu issue,
previous patch stop APs by smp_send_stop. AP will clear his bit in
cpu_online_map, then crash tools will see a cpu_online_map which only
contains 1 cpu in vmcore file.
4. reserve efi memmap area and ia64 boot param area for the first kernel.
To test crash dump.
Compile a kernel with CONFIG_KEXEC CONFIG_CRASH_DUMP
CONFIG_PROC_VMCORE enabled.
using this kernel for both host kernel and crash dumping kernel.
Boot this kernel with kernel parameter "crashkernel=XXX@YYY".
XXX should be a size big enough for crash kernel to run, YYY should
be a physical address which contains more than XXX memory and aligned to 64M.
you can check it in /proc/iomem.
Be careful of choosing the size and address to reserve.
The second kernel may hang silently if there is too few memory to use.
After the first kernel boots, the "Crash kernel" region will show in /proc/iomem.
then load the same kernel with command.
kexec -p vmlinux.gz --initrd=initrd --append="root=... maxcpus=1"
trigger a crash with echo c > /proc/sysrq-trigger
after the crash kernel boots,
copy /proc/vmcore to disk
gdb vmlinux-of-first-kernel vmcore
then you can check the stack and variables of first kernel.
kexec -l + kexec -e may not work.
That is because of a recent change in mpt-fusion driver
shutdown code.
There was some delay in mptscsih_remove path.
the code was removed in 2.6.17, that cause MPT fusion driver unable to reinitialize.
add a delay back to mptscsih_remove can solve this problem.
Signed-off-by:
Zou Nan hai <nanhai.zou@intel.com>
diff -Nraup a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
--- a/arch/ia64/hp/common/sba_iommu.c 2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/hp/common/sba_iommu.c 2006-08-15 09:50:03.000000000 +0800
@@ -1623,6 +1623,28 @@ ioc_iova_init(struct ioc *ioc)
READ_REG(ioc->ioc_hpa + IOC_IBASE);
}
+#ifdef CONFIG_KEXEC
+void
+ioc_iova_disable(void)
+{
+ struct ioc *ioc;
+
+ ioc = ioc_list;
+
+ while (ioc != NULL) {
+ /* Disable IOVA translation */
+ WRITE_REG(ioc->ibase & 0xfffffffffffffffe, ioc->ioc_hpa + IOC_IBASE);
+ READ_REG(ioc->ioc_hpa + IOC_IBASE);
+
+ /* Clear I/O TLB of any possible entries */
+ WRITE_REG(ioc->ibase | (get_iovp_order(ioc->iov_size) + iovp_shift), ioc->ioc_hpa + IOC_PCOM);
+ READ_REG(ioc->ioc_hpa + IOC_PCOM);
+
+ ioc = ioc->next;
+ }
+}
+#endif
+
static void __init
ioc_resource_init(struct ioc *ioc)
{
diff -Nraup a/arch/ia64/Kconfig b/arch/ia64/Kconfig
--- a/arch/ia64/Kconfig 2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/Kconfig 2006-08-15 09:50:03.000000000 +0800
@@ -427,6 +427,29 @@ config SGI_SN
source "drivers/sn/Kconfig"
+config KEXEC
+ bool "kexec system call (EXPERIMENTAL)"
+ depends on EXPERIMENTAL
+ help
+ kexec is a system call that implements the ability to shutdown your
+ current kernel, and to start another kernel. It is like a reboot
+ but it is indepedent of the system firmware. And like a reboot
+ you can start any kernel with it, not just Linux.
+
+ The name comes from the similiarity to the exec system call.
+
+ It is an ongoing process to be certain the hardware in a machine
+ is properly shutdown, so do not be surprised if this code does not
+ initially work for you. It may help to enable device hotplugging
+ support. As of this writing the exact hardware interface is
+ strongly in flux, so no good recommendation can be made.
+
+config CRASH_DUMP
+ bool "kernel crash dumps (EXPERIMENTAL)"
+ depends on EXPERIMENTAL
+ help
+ Generate crash dump after being started by kexec.
+
source "drivers/firmware/Kconfig"
source "fs/Kconfig.binfmt"
diff -Nraup a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c
--- a/arch/ia64/kernel/crash.c 1970-01-01 08:00:00.000000000 +0800
+++ b/arch/ia64/kernel/crash.c 2006-08-15 09:50:03.000000000 +0800
@@ -0,0 +1,129 @@
+/*
+ * arch/ia64/kernel/crash.c
+ *
+ * Architecture specific (ia64) functions for kexec based crash dumps.
+ *
+ * Created by: Khalid Aziz <khalid.aziz@hp.com>
+ * Copyright (C) 2005 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2005 Intel Corp Zou Nan hai <nanhai.zou@intel.com>
+ *
+ */
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <linux/irq.h>
+#include <linux/pci.h>
+#include <linux/reboot.h>
+#include <linux/kexec.h>
+#include <linux/irq.h>
+#include <linux/delay.h>
+#include <linux/elf.h>
+#include <linux/elfcore.h>
+#include <linux/device.h>
+#include <asm/uaccess.h>
+
+size_t copy_oldmem_page(unsigned long pfn, char *buf,
+ size_t csize, unsigned long offset, int userbuf)
+{
+ void *vaddr;
+
+ if (!csize)
+ return 0;
+ vaddr = page_address(pfn_to_page(pfn));
+
+ if (userbuf) {
+ if (copy_to_user(buf, (vaddr + offset), csize)) {
+ return -EFAULT;
+ }
+ } else
+ memcpy(buf, (vaddr + offset), csize);
+ return csize;
+}
+
+static void device_shootdown(void)
+{
+ irq_desc_t *idesc;
+ int irq;
+ for (irq = 0; irq < NR_IRQS; irq++) {
+ idesc = irq_desc + irq;
+ if (!idesc || !idesc->action)
+ continue;
+ disable_irq_nosync(irq);
+ idesc->chip->end(irq);
+ idesc->chip->shutdown(irq);
+ }
+
+#ifdef CONFIG_IA64_HP_ZX1
+ ioc_iova_disable();
+#endif
+}
+
+static inline Elf64_Word
+*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data,
+ size_t data_len)
+{
+ struct elf_note *note = (struct elf_note *)buf;
+ note->n_namesz = strlen(name) + 1;
+ note->n_descsz = data_len;
+ note->n_type = type;
+ buf += (sizeof(*note) + 3)/4;
+ memcpy(buf, name, note->n_namesz);
+ buf += (note->n_namesz + 3)/4;
+ memcpy(buf, data, data_len);
+ buf += (data_len + 3)/4;
+ return buf;
+}
+
+static void
+final_note(void *buf)
+{
+ memset(buf, 0, sizeof(struct elf_note));
+}
+
+extern void ia64_dump_cpu_regs(void *);
+
+void
+crash_save_this_cpu()
+{
+ void *buf;
+ struct elf_prstatus prstatus;
+ int cpu = smp_processor_id();
+ unsigned long cfm, sof, sol;
+ elf_greg_t *dst = (elf_greg_t *)&prstatus.pr_reg;
+ memset(&prstatus, 0, sizeof(prstatus));
+ prstatus.pr_pid = current->pid;
+
+ ia64_dump_cpu_regs(dst);
+ cfm = dst[43];
+ sol = (cfm >> 7) & 0x7f;
+ sof = cfm & 0x7f;
+ dst[46] = (unsigned long)ia64_rse_skip_regs((unsigned long *)dst[46],
+ sof - sol);
+
+ buf = (u64 *) per_cpu_ptr(crash_notes, cpu);
+ if (!buf)
+ return;
+ buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus,
+ sizeof(prstatus));
+ final_note(buf);
+}
+
+void
+machine_crash_shutdown(struct pt_regs *pt)
+{
+ /* This function is only called after the system
+ * has paniced or is otherwise in a critical state.
+ * The minimum amount of code to allow a kexec'd kernel
+ * to run successfully needs to happen here.
+ *
+ * In practice this means shooting down the other cpus in
+ * an SMP system.
+ */
+ if (in_interrupt())
+ ia64_eoi();
+ device_shootdown();
+#ifdef CONFIG_SMP
+ kdump_smp_send_stop();
+#endif
+}
diff -Nraup a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
--- a/arch/ia64/kernel/efi.c 2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/efi.c 2006-08-15 09:50:03.000000000 +0800
@@ -26,6 +26,7 @@
#include <linux/types.h>
#include <linux/time.h>
#include <linux/efi.h>
+#include <linux/kexec.h>
#include <asm/io.h>
#include <asm/kregs.h>
@@ -41,7 +42,7 @@ extern efi_status_t efi_call_phys (void
struct efi efi;
EXPORT_SYMBOL(efi);
static efi_runtime_services_t *runtime;
-static unsigned long mem_limit = ~0UL, max_addr = ~0UL;
+static unsigned long mem_limit = ~0UL, max_addr = ~0UL, min_addr = 0UL;
#define efi_call_virt(f, args...) (*(f))(args)
@@ -421,6 +422,8 @@ efi_init (void)
mem_limit = memparse(cp + 4, &cp);
} else if (memcmp(cp, "max_addr=", 9) = 0) {
max_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
+ } else if (memcmp(cp, "min_addr=", 9) = 0) {
+ min_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
} else {
while (*cp != ' ' && *cp)
++cp;
@@ -428,6 +431,8 @@ efi_init (void)
++cp;
}
}
+ if (min_addr != 0UL)
+ printk(KERN_INFO "Ignoring memory below %luMB\n", min_addr >> 20);
if (max_addr != ~0UL)
printk(KERN_INFO "Ignoring memory above %luMB\n", max_addr >> 20);
@@ -894,7 +899,8 @@ find_memmap_space (void)
as = max(contig_low, md->phys_addr);
ae = min(contig_high, efi_md_end(md));
- /* keep within max_addr= command line arg */
+ /* keep within max_addr= and min_addr= command line arg */
+ as = max(as, min_addr);
ae = min(ae, max_addr);
if (ae <= as)
continue;
@@ -1004,7 +1010,8 @@ efi_memmap_init(unsigned long *s, unsign
} else
ae = efi_md_end(md);
- /* keep within max_addr= command line arg */
+ /* keep within max_addr= and min_addr= command line arg */
+ as = max(as, min_addr);
ae = min(ae, max_addr);
if (ae <= as)
continue;
@@ -1116,6 +1123,12 @@ efi_initialize_iomem_resources(struct re
*/
insert_resource(res, code_resource);
insert_resource(res, data_resource);
+#ifdef CONFIG_KEXEC
+ insert_resource(res, &efi_memmap_res);
+ insert_resource(res, &boot_param_res);
+ if (crashk_res.end > crashk_res.start)
+ insert_resource(res, &crashk_res);
+#endif
}
}
}
diff -Nraup a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
--- a/arch/ia64/kernel/entry.S 2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/entry.S 2006-08-15 09:50:03.000000000 +0800
@@ -1575,7 +1575,7 @@ sys_call_table:
data8 sys_mq_timedreceive // 1265
data8 sys_mq_notify
data8 sys_mq_getsetattr
- data8 sys_ni_syscall // reserved for kexec_load
+ data8 sys_kexec_load
data8 sys_ni_syscall // reserved for vserver
data8 sys_waitid // 1270
data8 sys_add_key
diff -Nraup a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c
--- a/arch/ia64/kernel/machine_kexec.c 1970-01-01 08:00:00.000000000 +0800
+++ b/arch/ia64/kernel/machine_kexec.c 2006-08-15 10:12:00.000000000 +0800
@@ -0,0 +1,131 @@
+/*
+ * arch/ia64/kernel/machine_kexec.c
+ *
+ * Handle transition of Linux booting another kernel
+ * Copyright (C) 2005 Hewlett-Packard Development Comapny, L.P.
+ * Copyright (C) 2005 Khalid Aziz <khalid.aziz@hp.com>
+ * Copyright (C) 2006 Intel Corp, Zou Nan hai <nanhai.zou@intel.com>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2. See the file COPYING for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/kexec.h>
+#include <linux/pci.h>
+#include <linux/cpu.h>
+#include <asm/mmu_context.h>
+#include <asm/setup.h>
+#include <asm/mca.h>
+#include <asm/page.h>
+#include <asm/bitops.h>
+#include <asm/tlbflush.h>
+#include <asm/delay.h>
+#include <asm/meminit.h>
+
+typedef void (*relocate_new_kernel_t)(unsigned long, unsigned long,
+ struct ia64_boot_param *, unsigned long);
+static struct kimage *ia64_kimage;
+struct resource efi_memmap_res = {
+ .name = "EFI Memory Map",
+ .start = 0,
+ .end = 0,
+ .flags = IORESOURCE_BUSY | IORESOURCE_MEM
+};
+
+struct resource boot_param_res = {
+ .name = "Boot parameter",
+ .start = 0,
+ .end = 0,
+ .flags = IORESOURCE_BUSY | IORESOURCE_MEM
+};
+
+
+/*
+ * Do what every setup is needed on image and the
+ * reboot code buffer to allow us to avoid allocations
+ * later.
+ */
+int machine_kexec_prepare(struct kimage *image)
+{
+ void *control_code_buffer;
+ const unsigned long *func;
+
+ func = (unsigned long *)&relocate_new_kernel;
+ /* Pre-load control code buffer to minimize work in kexec path */
+ control_code_buffer = page_address(image->control_code_page);
+ memcpy((void *)control_code_buffer, (const void *)func[0],
+ relocate_new_kernel_size);
+ flush_icache_range((unsigned long)control_code_buffer,
+ (unsigned long)control_code_buffer + relocate_new_kernel_size);
+ ia64_kimage = image;
+
+ return 0;
+}
+
+void machine_kexec_cleanup(struct kimage *image)
+{
+}
+
+void machine_shutdown(void)
+{
+#ifdef CONFIG_HOTPLUG_CPU
+ {
+ int cpu;
+
+ for_each_online_cpu(cpu) {
+ if (cpu != smp_processor_id())
+ cpu_down(cpu);
+ }
+ }
+#elif defined(CONFIG_SMP)
+ smp_call_function(kexec_stop_this_cpu, (void *)ia64_kimage->start, 0, 0);
+#endif
+#ifdef CONFIG_PCI
+ {
+ struct pci_dev *dev = NULL;
+ irq_desc_t *idesc;
+ /* Disable all PCI devices */
+ while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
+ if (!(dev->is_enabled))
+ continue;
+ idesc = irq_desc + dev->irq;
+ if (!idesc||!idesc->chip)
+ continue;
+ disable_irq_nosync(dev->irq);
+ idesc->chip->end(dev->irq);
+ idesc->action = NULL;
+ pci_disable_device(dev);
+ }
+ }
+#endif
+
+
+#ifdef CONFIG_IA64_HP_ZX1
+ ioc_iova_disable();
+#endif
+}
+
+/*
+ * Do not allocate memory (or fail in any way) in machine_kexec().
+ * We are past the point of no return, committed to rebooting now.
+ */
+extern void *efi_get_pal_addr(void);
+void machine_kexec(struct kimage *image)
+{
+ relocate_new_kernel_t rnk;
+ void *pal_addr = efi_get_pal_addr();
+ unsigned long code_addr = (unsigned long)page_address(image->control_code_page);
+ if (image->type = KEXEC_TYPE_CRASH)
+ crash_save_this_cpu();
+ /* Interrupts aren't acceptable while we reboot */
+ ia64_set_itv(1<<16);
+ local_irq_disable();
+ rnk = (relocate_new_kernel_t)&code_addr;
+ (*rnk)(image->head, image->start, ia64_boot_param,
+ GRANULEROUNDDOWN((unsigned long) pal_addr));
+ BUG();
+ for (;;);
+}
diff -Nraup a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
--- a/arch/ia64/kernel/Makefile 2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/Makefile 2006-08-15 09:50:03.000000000 +0800
@@ -28,6 +28,7 @@ obj-$(CONFIG_IA64_CYCLONE) += cyclone.o
obj-$(CONFIG_CPU_FREQ) += cpufreq/
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_IA64_UNCACHED_ALLOCATOR) += uncached.o
obj-$(CONFIG_AUDIT) += audit.o
mca_recovery-y += mca_drv.o mca_drv_asm.o
diff -Nraup a/arch/ia64/kernel/relocate_kernel.S b/arch/ia64/kernel/relocate_kernel.S
--- a/arch/ia64/kernel/relocate_kernel.S 1970-01-01 08:00:00.000000000 +0800
+++ b/arch/ia64/kernel/relocate_kernel.S 2006-08-15 09:50:03.000000000 +0800
@@ -0,0 +1,490 @@
+/*
+ * arch/ia64/kernel/relocate_kernel.S
+ *
+ * Relocate kexec'able kernel and start it
+ *
+ * Copyright (C) 2005 Hewlett-Packard Development Company, L.P.
+ * Copyright (C) 2005 Khalid Aziz <khalid.aziz@hp.com>
+ * Copyright (C) 2005 Intel Corp, Zou Nan hai <nanhai.zou@intel.com>
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2. See the file COPYING for more details.
+ */
+#include <linux/config.h>
+#include <asm/asmmacro.h>
+#include <asm/kregs.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/mca_asm.h>
+
+ /* Must be relocatable PIC code callable as a C function
+ */
+GLOBAL_ENTRY(relocate_new_kernel)
+ .prologue
+ alloc r31=ar.pfs,4,0,0,0
+ .body
+.reloc_entry:
+{
+ rsm psr.i| psr.ic
+ mov r2=ip
+}
+ ;;
+{
+ flushrs // must be first insn in group
+ srlz.i
+}
+ ;;
+ dep r2=0,r2,61,3 //to physical address
+ ;;
+ //first switch to physical mode
+ add r3\x1f-.reloc_entry, r2
+ movl r16 = IA64_PSR_AC|IA64_PSR_BN|IA64_PSR_IC
+ mov ar.rsc=0 // put RSE in enforced lazy mode
+ ;;
+ add sp=(memory_stack_end - 16 - .reloc_entry),r2
+ add r8=(register_stack - .reloc_entry),r2
+ ;;
+ mov r18=ar.rnat
+ mov ar.bspstore=r8
+ ;;
+ mov cr.ipsr=r16
+ mov cr.iip=r3
+ mov cr.ifs=r0
+ srlz.i
+ ;;
+ mov ar.rnat=r18
+ rfi
+ ;;
+1:
+ //physical mode code begin
+ mov b6=in1
+ dep r28=0,in2,61,3 //to physical address
+
+ // purge all TC entries
+#define O(member) IA64_CPUINFO_##member##_OFFSET
+ GET_THIS_PADDR(r2, cpu_info) // load phys addr of cpu_info into r2
+ ;;
+ addl r17=O(PTCE_STRIDE),r2
+ addl r2=O(PTCE_BASE),r2
+ ;;
+ ld8 r18=[r2],(O(PTCE_COUNT)-O(PTCE_BASE));; // r18=ptce_base
+ ld4 r19=[r2],4 // r19=ptce_count[0]
+ ld4 r21=[r17],4 // r21=ptce_stride[0]
+ ;;
+ ld4 r20=[r2] // r20=ptce_count[1]
+ ld4 r22=[r17] // r22=ptce_stride[1]
+ mov r24=r0
+ ;;
+ adds r20=-1,r20
+ ;;
+#undef O
+2:
+ cmp.ltu p6,p7=r24,r19
+(p7) br.cond.dpnt.few 4f
+ mov ar.lc=r20
+3:
+ ptc.e r18
+ ;;
+ add r18=r22,r18
+ br.cloop.sptk.few 3b
+ ;;
+ add r18=r21,r18
+ add r24=1,r24
+ ;;
+ br.sptk.few 2b
+4:
+ srlz.i
+ ;;
+ //purge TR entry for kernel text and data
+ movl r16=KERNEL_START
+ mov r18=KERNEL_TR_PAGE_SHIFT<<2
+ ;;
+ ptr.i r16, r18
+ ptr.d r16, r18
+ ;;
+ srlz.i
+ ;;
+
+ // purge TR entry for percpu data
+ movl r16=PERCPU_ADDR
+ mov r18=PERCPU_PAGE_SHIFT<<2
+ ;;
+ ptr.d r16,r18
+ ;;
+ srlz.d
+ ;;
+
+ // purge TR entry for pal code
+ mov r16=in3
+ mov r18=IA64_GRANULE_SHIFT<<2
+ ;;
+ ptr.i r16,r18
+ ;;
+ srlz.i
+ ;;
+
+ // purge TR entry for stack
+ mov r16=IA64_KR(CURRENT_STACK)
+ ;;
+ shl r16=r16,IA64_GRANULE_SHIFT
+ movl r19=PAGE_OFFSET
+ ;;
+ add r16=r19,r16
+ mov r18=IA64_GRANULE_SHIFT<<2
+ ;;
+ ptr.d r16,r18
+ ;;
+ srlz.i
+ ;;
+
+ //copy segments
+ movl r16=PAGE_MASK
+ mov r30=in0 // in0 is page_list
+ br.sptk.few .dest_page
+ ;;
+.loop:
+ ld8 r30=[in0], 8;;
+.dest_page:
+ tbit.z p0, p6=r30, 0;; // 0x1 dest page
+(p6) and r17=r30, r16
+(p6) br.cond.sptk.few .loop;;
+
+ tbit.z p0, p6=r30, 1;; // 0x2 indirect page
+(p6) and in0=r30, r16
+(p6) br.cond.sptk.few .loop;;
+
+ tbit.z p0, p6=r30, 2;; // 0x4 end flag
+(p6) br.cond.sptk.few .end_loop;;
+
+ tbit.z p6, p0=r30, 3;; // 0x8 source page
+(p6) br.cond.sptk.few .loop
+
+ and r18=r30, r16
+
+ // simple copy page, may optimize later
+ movl r14=PAGE_SIZE/8 - 1;;
+ mov ar.lc=r14;;
+1:
+ ld8 r14=[r18], 8;;
+ st8 [r17]=r14, 8;;
+ fc.i r17
+ br.ctop.sptk.few 1b
+ br.sptk.few .loop
+ ;;
+
+.end_loop:
+ sync.i // for fc.i
+ ;;
+ srlz.i
+ ;;
+ srlz.d
+ ;;
+ br.call.sptk.many b0¶;;
+
+.align 32
+memory_stack:
+ .fill 8192, 1, 0
+memory_stack_end:
+register_stack:
+ .fill 8192, 1, 0
+register_stack_end:
+relocate_new_kernel_end:
+END(relocate_new_kernel)
+
+GLOBAL_ENTRY(kexec_fake_sal_rendez)
+ .prologue
+ alloc r31=ar.pfs,3,0,0,0
+ .body
+.rendez_entry:
+ rsm psr.i | psr.ic
+ mov r25=ip
+ ;;
+ {
+ flushrs
+ srlz.i
+ }
+ ;;
+ /* See where I am running, and compute gp */
+ {
+ mov ar.rsc = 0 /* Put RSE in enforce lacy, LE mode */
+ mov gp = ip /* gp = relocate_new_kernel */
+ }
+
+ movl r8=0x00000100000000
+ ;;
+ mov cr.iva=r8
+ /* Transition from virtual to physical mode */
+ srlz.i
+ ;;
+ add r17_-.rendez_entry, r25
+ movl r16=(IA64_PSR_AC | IA64_PSR_BN | IA64_PSR_IC | IA64_PSR_MFL)
+ ;;
+ tpa r17=r17
+ mov cr.ipsr=r16
+ ;;
+ mov cr.iip=r17
+ mov cr.ifs=r0
+ ;;
+ rfi
+ ;;
+5:
+ mov b6=in0 /* _start addr */
+ mov r8=in1 /* ap_wakeup_vector */
+ mov r26=in2 /* PAL addr */
+ ;;
+ /* Purge kernel TRs */
+ movl r16=KERNEL_START
+ mov r18=KERNEL_TR_PAGE_SHIFT<<2
+ ;;
+ ptr.i r16,r18
+ ptr.d r16,r18
+ ;;
+ srlz.i
+ ;;
+ srlz.d
+ ;;
+ /* Purge percpu TR */
+ movl r16=PERCPU_ADDR
+ mov r18=PERCPU_PAGE_SHIFT<<2
+ ;;
+ ptr.d r16,r18
+ ;;
+ srlz.d
+ ;;
+ /* Purge PAL TR */
+ mov r18=IA64_GRANULE_SHIFT<<2
+ ;;
+ ptr.i r26,r18
+ ;;
+ srlz.i
+ ;;
+ /* Purge stack TR */
+ mov r16=IA64_KR(CURRENT_STACK)
+ ;;
+ shl r16=r16,IA64_GRANULE_SHIFT
+ movl r19=PAGE_OFFSET
+ ;;
+ add r16=r19,r16
+ mov r18=IA64_GRANULE_SHIFT<<2
+ ;;
+ ptr.d r16,r18
+ ;;
+ srlz.i
+ ;;
+
+ /* Ensure we can read and clear external interrupts */
+ mov cr.tpr=r0
+ srlz.d
+
+ shr.u r9=r8,6 /* which irr */
+ ;;
+ and r8c,r8 /* bit offset into irr */
+ ;;
+ mov r10=1;;
+ ;;
+ shl r10=r10,r8 /* bit mask off irr we want */
+ cmp.eq p6,p0=0,r9
+ ;;
+(p6) br.cond.sptk.few check_irr0
+ cmp.eq p7,p0=1,r9
+ ;;
+(p7) br.cond.sptk.few check_irr1
+ cmp.eq p8,p0=2,r9
+ ;;
+(p8) br.cond.sptk.few check_irr2
+ cmp.eq p9,p0=3,r9
+ ;;
+(p9) br.cond.sptk.few check_irr3
+
+check_irr0:
+ mov r8=cr.irr0
+ ;;
+ and r8=r8,r10
+ ;;
+ cmp.eq p6,p0=0,r8
+(p6) br.cond.sptk.few check_irr0
+ br.few call_start
+
+check_irr1:
+ mov r8=cr.irr1
+ ;;
+ and r8=r8,r10
+ ;;
+ cmp.eq p6,p0=0,r8
+(p6) br.cond.sptk.few check_irr1
+ br.few call_start
+
+check_irr2:
+ mov r8=cr.irr2
+ ;;
+ and r8=r8,r10
+ ;;
+ cmp.eq p6,p0=0,r8
+(p6) br.cond.sptk.few check_irr2
+ br.few call_start
+
+check_irr3:
+ mov r8=cr.irr3
+ ;;
+ and r8=r8,r10
+ ;;
+ cmp.eq p6,p0=0,r8
+(p6) br.cond.sptk.few check_irr3
+ br.few call_start
+
+call_start:
+ mov cr.eoi=r0
+ ;;
+ srlz.d
+ ;;
+ mov r8=cr.ivr
+ ;;
+ srlz.d
+ ;;
+ cmp.eq p0,p6\x15,r8
+(p6) br.cond.sptk.few call_start
+ br.sptk.few b6
+kexec_fake_sal_rendez_end:
+END(kexec_fake_sal_rendez)
+
+ .global relocate_new_kernel_size
+relocate_new_kernel_size:
+ data8 kexec_fake_sal_rendez_end - relocate_new_kernel
+
+GLOBAL_ENTRY(ia64_dump_cpu_regs)
+ .prologue
+ alloc loc0=ar.pfs,1,2,0,0
+ .body
+ mov ar.rsc=0 // put RSE in enforced lazy mode
+ add loc1=4*8, in0 // save r4 and r5 first
+ ;;
+{
+ flushrs // flush dirty regs to backing store
+ srlz.i
+}
+ st8 [loc1]=r4, 8
+ ;;
+ st8 [loc1]=r5, 8
+ ;;
+ add loc12*8, in0
+ mov r4=ar.rnat
+ ;;
+ st8 [in0]=r0, 8 // r0
+ st8 [loc1]=r4, 8 // rnat
+ mov r5=pr
+ ;;
+ st8 [in0]=r1, 8 // r1
+ st8 [loc1]=r5, 8 // pr
+ mov r4°
+ ;;
+ st8 [in0]=r2, 8 // r2
+ st8 [loc1]=r4, 8 // b0
+ mov r5±;
+ ;;
+ st8 [in0]=r3, 24 // r3
+ st8 [loc1]=r5, 8 // b1
+ mov r4²
+ ;;
+ st8 [in0]=r6, 8 // r6
+ st8 [loc1]=r4, 8 // b2
+ mov r5³
+ ;;
+ st8 [in0]=r7, 8 // r7
+ st8 [loc1]=r5, 8 // b3
+ mov r4´
+ ;;
+ st8 [in0]=r8, 8 // r8
+ st8 [loc1]=r4, 8 // b4
+ mov r5µ
+ ;;
+ st8 [in0]=r9, 8 // r9
+ st8 [loc1]=r5, 8 // b5
+ mov r4¶
+ ;;
+ st8 [in0]=r10, 8 // r10
+ st8 [loc1]=r5, 8 // b6
+ mov r5·
+ ;;
+ st8 [in0]=r11, 8 // r11
+ st8 [loc1]=r5, 8 // b7
+ mov r4°
+ ;;
+ st8 [in0]=r12, 8 // r12
+ st8 [loc1]=r4, 8 // ip
+ mov r5=loc0
+ ;;
+ st8 [in0]=r13, 8 // r13
+ extr.u r5=r5, 0, 38 // ar.pfs.pfm
+ mov r4=r0 // user mask
+ ;;
+ st8 [in0]=r14, 8 // r14
+ st8 [loc1]=r5, 8 // cfm
+ ;;
+ st8 [in0]=r15, 8 // r15
+ st8 [loc1]=r4, 8 // user mask
+ mov r5=ar.rsc
+ ;;
+ st8 [in0]=r16, 8 // r16
+ st8 [loc1]=r5, 8 // ar.rsc
+ mov r4=ar.bsp
+ ;;
+ st8 [in0]=r17, 8 // r17
+ st8 [loc1]=r4, 8 // ar.bsp
+ mov r5=ar.bspstore
+ ;;
+ st8 [in0]=r18, 8 // r18
+ st8 [loc1]=r5, 8 // ar.bspstore
+ mov r4=ar.rnat
+ ;;
+ st8 [in0]=r19, 8 // r19
+ st8 [loc1]=r4, 8 // ar.rnat
+ mov r5=ar.ccv
+ ;;
+ st8 [in0]=r20, 8 // r20
+ st8 [loc1]=r5, 8 // ar.ccv
+ mov r4=ar.unat
+ ;;
+ st8 [in0]=r21, 8 // r21
+ st8 [loc1]=r4, 8 // ar.unat
+ mov r5 = ar.fpsr
+ ;;
+ st8 [in0]=r22, 8 // r22
+ st8 [loc1]=r5, 8 // ar.fpsr
+ mov r4 = ar.unat
+ ;;
+ st8 [in0]=r23, 8 // r23
+ st8 [loc1]=r4, 8 // unat
+ mov r5 = ar.fpsr
+ ;;
+ st8 [in0]=r24, 8 // r24
+ st8 [loc1]=r5, 8 // fpsr
+ mov r4 = ar.pfs
+ ;;
+ st8 [in0]=r25, 8 // r25
+ st8 [loc1]=r4, 8 // ar.pfs
+ mov r5 = ar.lc
+ ;;
+ st8 [in0]=r26, 8 // r26
+ st8 [loc1]=r5, 8 // ar.lc
+ mov r4 = ar.ec
+ ;;
+ st8 [in0]=r27, 8 // r27
+ st8 [loc1]=r4, 8 // ar.ec
+ mov r5 = ar.csd
+ ;;
+ st8 [in0]=r28, 8 // r28
+ st8 [loc1]=r5, 8 // ar.csd
+ mov r4 = ar.ssd
+ ;;
+ st8 [in0]=r29, 8 // r29
+ st8 [loc1]=r4, 8 // ar.ssd
+ ;;
+ st8 [in0]=r30, 8 // r30
+ ;;
+ st8 [in0]=r31, 8 // r31
+ mov ar.pfs=loc0
+ ;;
+ br.ret.sptk.many rp
+END(ia64_dump_cpu_regs)
+
+
diff -Nraup a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
--- a/arch/ia64/kernel/setup.c 2006-08-15 05:52:14.000000000 +0800
+++ b/arch/ia64/kernel/setup.c 2006-08-15 09:50:03.000000000 +0800
@@ -43,6 +43,8 @@
#include <linux/initrd.h>
#include <linux/pm.h>
#include <linux/cpufreq.h>
+#include <linux/kexec.h>
+#include <linux/crash_dump.h>
#include <asm/ia32.h>
#include <asm/machvec.h>
@@ -250,6 +252,41 @@ reserve_memory (void)
}
#endif
+#ifdef CONFIG_KEXEC
+ /* crashkernel=size@addr specifies the location to reserve for
+ * a crash kernel. By reserving this memory we guarantee
+ * that linux never set's it up as a DMA target.
+ * Useful for holding code to do something appropriate
+ * after a kernel panic.
+ */
+ {
+ char *from = strstr(saved_command_line, "crashkernel=");
+ if (from) {
+ unsigned long size, base;
+ size = memparse(from + 12, &from);
+ if (*from = '@') {
+ base = memparse(from + 1, &from);
+ rsvd_region[n].start + (unsigned long)__va(base);
+ rsvd_region[n].end + (unsigned long)__va(base + size);
+ crashk_res.start = base;
+ crashk_res.end = base + size - 1;
+ n++;
+ }
+ }
+ efi_memmap_res.start = ia64_boot_param->efi_memmap;
+ efi_memmap_res.end = efi_memmap_res.start +
+ ia64_boot_param->efi_memmap_size;
+ printk("efi_memmap start %lx %lx\n",
+ efi_memmap_res.start,
+ efi_memmap_res.end);
+ boot_param_res.start = __pa(ia64_boot_param);
+ boot_param_res.end = boot_param_res.start +
+ sizeof(*ia64_boot_param);
+ }
+#endif
+
efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end);
n++;
@@ -484,6 +521,16 @@ setup_arch (char **cmdline_p)
if (!nomca)
ia64_mca_init();
+#ifdef CONFIG_CRASH_DUMP
+ {
+ char *from = strstr(saved_command_line, "elfcorehdr=");
+
+ if (from)
+ elfcorehdr_addr = memparse(from+11, &from);
+ saved_max_pfn = (unsigned long) -1;
+ }
+#endif
+
platform_setup(cmdline_p);
paging_init();
}
diff -Nraup a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c
--- a/arch/ia64/kernel/smp.c 2006-06-18 09:49:35.000000000 +0800
+++ b/arch/ia64/kernel/smp.c 2006-08-15 10:12:17.000000000 +0800
@@ -30,6 +30,7 @@
#include <linux/delay.h>
#include <linux/efi.h>
#include <linux/bitops.h>
+#include <linux/kexec.h>
#include <asm/atomic.h>
#include <asm/current.h>
@@ -66,6 +67,7 @@ static volatile struct call_data_struct
#define IPI_CALL_FUNC 0
#define IPI_CPU_STOP 1
+#define IPI_KDUMP_CPU_STOP 3
/* This needs to be cacheline aligned because it is written to by *other* CPUs. */
static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned;
@@ -84,6 +86,34 @@ unlock_ipi_calllock(void)
spin_unlock_irq(&call_lock);
}
+#ifdef CONFIG_KEXEC
+/*
+ * Stop the CPU and put it in fake SAL rendezvous. This allows CPU to wake
+ * up with IPI from boot processor
+ */
+void
+kexec_stop_this_cpu (void *func)
+{
+ unsigned long pta, impl_va_bits, pal_base;
+
+ /*
+ * Remove this CPU by putting it into fake SAL rendezvous
+ */
+ cpu_clear(smp_processor_id(), cpu_online_map);
+ max_xtp();
+ ia64_eoi();
+
+ /* Disable VHPT */
+ impl_va_bits = ffz(~(local_cpu_data->unimpl_va_mask | (7UL << 61)));
+ pta = POW2(61) - POW2(vmlpt_bits);
+ ia64_set_pta(pta | (0 << 8) | (vmlpt_bits << 2) | 0);
+
+ local_irq_disable();
+ pal_base = __get_cpu_var(ia64_mca_pal_base);
+ kexec_fake_sal_rendez(func, ap_wakeup_vector, pal_base);
+}
+#endif
+
static void
stop_this_cpu (void)
{
@@ -155,7 +185,15 @@ handle_IPI (int irq, void *dev_id, struc
case IPI_CPU_STOP:
stop_this_cpu();
break;
-
+#ifdef CONFIG_CRASH_DUMP
+ case IPI_KDUMP_CPU_STOP:
+ {
+ local_irq_disable();
+ crash_save_this_cpu();
+ cpu_halt();
+ }
+ break;
+#endif
default:
printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);
break;
@@ -371,6 +409,13 @@ smp_send_stop (void)
{
send_IPI_allbutself(IPI_CPU_STOP);
}
+#ifdef CONFIG_CRASH_DUMP
+void
+kdump_smp_send_stop()
+{
+ send_IPI_allbutself(IPI_KDUMP_CPU_STOP);
+}
+#endif
int __init
setup_profiling_timer (unsigned int multiplier)
diff -Nraup a/include/asm-ia64/kexec.h b/include/asm-ia64/kexec.h
--- a/include/asm-ia64/kexec.h 1970-01-01 08:00:00.000000000 +0800
+++ b/include/asm-ia64/kexec.h 2006-08-15 09:50:03.000000000 +0800
@@ -0,0 +1,38 @@
+#ifndef _ASM_IA64_KEXEC_H
+#define _ASM_IA64_KEXEC_H
+
+
+/* Maximum physical address we can use pages from */
+#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
+/* Maximum address we can reach in physical address mode */
+#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
+/* Maximum address we can use for the control code buffer */
+#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
+
+#define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096)
+
+/* The native architecture */
+#define KEXEC_ARCH KEXEC_ARCH_IA_64
+
+#define MAX_NOTE_BYTES 1024
+
+#define pte_bits 3
+#define vmlpt_bits (impl_va_bits - PAGE_SHIFT + pte_bits)
+#define POW2(n) (1ULL << (n))
+
+DECLARE_PER_CPU(u64, ia64_mca_pal_base);
+const extern unsigned int relocate_new_kernel_size;
+volatile extern long kexec_rendez;
+extern void relocate_new_kernel(unsigned long, unsigned long,
+ struct ia64_boot_param *, unsigned long);
+extern void kexec_fake_sal_rendez(void *start, unsigned long wake_up,
+ unsigned long pal_base);
+static inline void
+crash_setup_regs(struct pt_regs *newregs, struct pt_regs *oldregs)
+{
+}
+extern struct resource efi_memmap_res;
+extern struct resource boot_param_res;
+extern void kdump_smp_send_stop(void);
+extern void crash_save_this_cpu(void);
+#endif /* _ASM_IA64_KEXEC_H */
diff -Nraup a/include/asm-ia64/machvec_hpzx1.h b/include/asm-ia64/machvec_hpzx1.h
--- a/include/asm-ia64/machvec_hpzx1.h 2006-06-18 09:49:35.000000000 +0800
+++ b/include/asm-ia64/machvec_hpzx1.h 2006-08-15 09:50:03.000000000 +0800
@@ -34,4 +34,6 @@ extern ia64_mv_dma_mapping_error sba_dma
#define platform_dma_supported sba_dma_supported
#define platform_dma_mapping_error sba_dma_mapping_error
+extern void ioc_iova_disable(void);
+
#endif /* _ASM_IA64_MACHVEC_HPZX1_h */
diff -Nraup a/include/asm-ia64/meminit.h b/include/asm-ia64/meminit.h
--- a/include/asm-ia64/meminit.h 2006-08-15 05:52:24.000000000 +0800
+++ b/include/asm-ia64/meminit.h 2006-08-15 09:50:03.000000000 +0800
@@ -15,11 +15,12 @@
* - initrd (optional)
* - command line string
* - kernel code & data
+ * - crash dumping code reserved region
* - Kernel memory map built from EFI memory map
*
* More could be added if necessary
*/
-#define IA64_MAX_RSVD_REGIONS 6
+#define IA64_MAX_RSVD_REGIONS 7
struct rsvd_region {
unsigned long start; /* virtual address of beginning of element */
diff -Nraup a/include/asm-ia64/smp.h b/include/asm-ia64/smp.h
--- a/include/asm-ia64/smp.h 2006-08-15 05:52:24.000000000 +0800
+++ b/include/asm-ia64/smp.h 2006-08-15 09:50:03.000000000 +0800
@@ -128,6 +128,9 @@ extern void smp_send_reschedule (int cpu
extern void lock_ipi_calllock(void);
extern void unlock_ipi_calllock(void);
extern void identify_siblings (struct cpuinfo_ia64 *);
+#ifdef CONFIG_KEXEC
+extern void kexec_stop_this_cpu(void *);
+#endif
#else
diff -Nraup a/kernel/irq/manage.c b/kernel/irq/manage.c
--- a/kernel/irq/manage.c 2006-08-15 05:52:24.000000000 +0800
+++ b/kernel/irq/manage.c 2006-08-15 09:50:03.000000000 +0800
@@ -475,4 +475,3 @@ int request_irq(unsigned int irq,
return retval;
}
EXPORT_SYMBOL(request_irq);
-
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai @ 2006-08-14 21:24 ` Bob Montgomery 2006-08-15 0:47 ` Zou Nan hai ` (15 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Bob Montgomery @ 2006-08-14 21:24 UTC (permalink / raw) To: linux-ia64 On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote: > This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. Contrary to expectations, my experience with this patch on a 2.6.18-rc4 kernel is that kexec -l, kexec -e is now working without my adding any delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case hangs. My "got here" printk's on the console indicate: SysRq : Trigger a crashdump machine_crash_shutdown device_shootdown machine_kexec type: 1 And then it hangs. My test system: hp A6870A server rx2600 From /proc/iomem: 04a1f000-3f5e3fff : System RAM 10000000-17ffffff : Crash kernel # cat /proc/cmdline BOOT_IMAGE=scsi0:/EFI/debian/boot/vmlinuz-2.6.18-rc4-bobm root=/dev/sda4 raid=noautodetect crashkernel\x128M@256M panic=1 ro relevant CONFIG settings (from /proc/config.gz) CONFIG_HOTPLUG=y CONFIG_IA64_HP_ZX1=y # CONFIG_IA64_HP_ZX1_SWIOTLB is not set CONFIG_HOTPLUG_CPU=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_SPARSEMEM_MANUAL is not set # CONFIG_SPARSEMEM_STATIC is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_KEXEC=y CONFIG_CRASH_DUMP=y CONFIG_ACPI_HOTPLUG_CPU=y # CONFIG_HOTPLUG_PCI is not set CONFIG_AGP_HP_ZX1=y CONFIG_PROC_VMCORE=y Bob Montgomery ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai 2006-08-14 21:24 ` Bob Montgomery @ 2006-08-15 0:47 ` Zou Nan hai 2006-08-15 1:56 ` Jay Lan ` (14 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Zou Nan hai @ 2006-08-15 0:47 UTC (permalink / raw) To: linux-ia64 On Tue, 2006-08-15 at 09:56, Jay Lan wrote: > Bob Montgomery wrote: > > On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote: > > > >>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. > > > > > ... Jay, Thanks very much, please try the following updated patch which simplify the device_shootdown code. Signed-off-by: Zou Nan hai <nanhai.zou@intel.com> diff -Nraup linux-2.6.18-rc4/arch/ia64/hp/common/sba_iommu.c linux-2.6.18-rc4-kdump/arch/ia64/hp/common/sba_iommu.c --- linux-2.6.18-rc4/arch/ia64/hp/common/sba_iommu.c 2006-08-16 05:06:57.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/hp/common/sba_iommu.c 2006-08-16 05:10:10.000000000 +0800 @@ -1623,6 +1623,28 @@ ioc_iova_init(struct ioc *ioc) READ_REG(ioc->ioc_hpa + IOC_IBASE); } +#ifdef CONFIG_KEXEC +void +ioc_iova_disable(void) +{ + struct ioc *ioc; + + ioc = ioc_list; + + while (ioc != NULL) { + /* Disable IOVA translation */ + WRITE_REG(ioc->ibase & 0xfffffffffffffffe, ioc->ioc_hpa + IOC_IBASE); + READ_REG(ioc->ioc_hpa + IOC_IBASE); + + /* Clear I/O TLB of any possible entries */ + WRITE_REG(ioc->ibase | (get_iovp_order(ioc->iov_size) + iovp_shift), ioc->ioc_hpa + IOC_PCOM); + READ_REG(ioc->ioc_hpa + IOC_PCOM); + + ioc = ioc->next; + } +} +#endif + static void __init ioc_resource_init(struct ioc *ioc) { diff -Nraup linux-2.6.18-rc4/arch/ia64/Kconfig linux-2.6.18-rc4-kdump/arch/ia64/Kconfig --- linux-2.6.18-rc4/arch/ia64/Kconfig 2006-08-16 05:06:57.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/Kconfig 2006-08-16 05:10:10.000000000 +0800 @@ -427,6 +427,29 @@ config SGI_SN source "drivers/sn/Kconfig" +config KEXEC + bool "kexec system call (EXPERIMENTAL)" + depends on EXPERIMENTAL + help + kexec is a system call that implements the ability to shutdown your + current kernel, and to start another kernel. It is like a reboot + but it is indepedent of the system firmware. And like a reboot + you can start any kernel with it, not just Linux. + + The name comes from the similiarity to the exec system call. + + It is an ongoing process to be certain the hardware in a machine + is properly shutdown, so do not be surprised if this code does not + initially work for you. It may help to enable device hotplugging + support. As of this writing the exact hardware interface is + strongly in flux, so no good recommendation can be made. + +config CRASH_DUMP + bool "kernel crash dumps (EXPERIMENTAL)" + depends on EXPERIMENTAL + help + Generate crash dump after being started by kexec. + source "drivers/firmware/Kconfig" source "fs/Kconfig.binfmt" diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/crash.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/crash.c --- linux-2.6.18-rc4/arch/ia64/kernel/crash.c 1970-01-01 08:00:00.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/crash.c 2006-08-16 05:10:37.000000000 +0800 @@ -0,0 +1,125 @@ +/* + * arch/ia64/kernel/crash.c + * + * Architecture specific (ia64) functions for kexec based crash dumps. + * + * Created by: Khalid Aziz <khalid.aziz@hp.com> + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Copyright (C) 2005 Intel Corp Zou Nan hai <nanhai.zou@intel.com> + * + */ +#include <linux/init.h> +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/smp.h> +#include <linux/irq.h> +#include <linux/pci.h> +#include <linux/reboot.h> +#include <linux/kexec.h> +#include <linux/irq.h> +#include <linux/delay.h> +#include <linux/elf.h> +#include <linux/elfcore.h> +#include <linux/device.h> +#include <asm/uaccess.h> + +size_t copy_oldmem_page(unsigned long pfn, char *buf, + size_t csize, unsigned long offset, int userbuf) +{ + void *vaddr; + + if (!csize) + return 0; + vaddr = page_address(pfn_to_page(pfn)); + + if (userbuf) { + if (copy_to_user(buf, (vaddr + offset), csize)) { + return -EFAULT; + } + } else + memcpy(buf, (vaddr + offset), csize); + return csize; +} + +static void device_shootdown(void) +{ + irq_desc_t *idesc; + int irq; + for (irq = 0; irq < NR_IRQS; irq++) { + idesc = irq_desc + irq; + if (idesc) + kdump_disable_irq(irq); + } +#ifdef CONFIG_IA64_HP_ZX1 + ioc_iova_disable(); +#endif +} + +static inline Elf64_Word +*append_elf_note(Elf64_Word *buf, char *name, unsigned type, void *data, + size_t data_len) +{ + struct elf_note *note = (struct elf_note *)buf; + note->n_namesz = strlen(name) + 1; + note->n_descsz = data_len; + note->n_type = type; + buf += (sizeof(*note) + 3)/4; + memcpy(buf, name, note->n_namesz); + buf += (note->n_namesz + 3)/4; + memcpy(buf, data, data_len); + buf += (data_len + 3)/4; + return buf; +} + +static void +final_note(void *buf) +{ + memset(buf, 0, sizeof(struct elf_note)); +} + +extern void ia64_dump_cpu_regs(void *); + +void +crash_save_this_cpu() +{ + void *buf; + struct elf_prstatus prstatus; + int cpu = smp_processor_id(); + unsigned long cfm, sof, sol; + elf_greg_t *dst = (elf_greg_t *)&prstatus.pr_reg; + memset(&prstatus, 0, sizeof(prstatus)); + prstatus.pr_pid = current->pid; + + ia64_dump_cpu_regs(dst); + cfm = dst[43]; + sol = (cfm >> 7) & 0x7f; + sof = cfm & 0x7f; + dst[46] = (unsigned long)ia64_rse_skip_regs((unsigned long *)dst[46], + sof - sol); + + buf = (u64 *) per_cpu_ptr(crash_notes, cpu); + if (!buf) + return; + buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus, + sizeof(prstatus)); + final_note(buf); +} + +void +machine_crash_shutdown(struct pt_regs *pt) +{ + /* This function is only called after the system + * has paniced or is otherwise in a critical state. + * The minimum amount of code to allow a kexec'd kernel + * to run successfully needs to happen here. + * + * In practice this means shooting down the other cpus in + * an SMP system. + */ + if (in_interrupt()) + ia64_eoi(); + device_shootdown(); +#ifdef CONFIG_SMP + kdump_smp_send_stop(); +#endif +} diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/efi.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/efi.c --- linux-2.6.18-rc4/arch/ia64/kernel/efi.c 2006-08-16 05:06:57.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/efi.c 2006-08-16 05:10:10.000000000 +0800 @@ -26,6 +26,7 @@ #include <linux/types.h> #include <linux/time.h> #include <linux/efi.h> +#include <linux/kexec.h> #include <asm/io.h> #include <asm/kregs.h> @@ -41,7 +42,7 @@ extern efi_status_t efi_call_phys (void struct efi efi; EXPORT_SYMBOL(efi); static efi_runtime_services_t *runtime; -static unsigned long mem_limit = ~0UL, max_addr = ~0UL; +static unsigned long mem_limit = ~0UL, max_addr = ~0UL, min_addr = 0UL; #define efi_call_virt(f, args...) (*(f))(args) @@ -421,6 +422,8 @@ efi_init (void) mem_limit = memparse(cp + 4, &cp); } else if (memcmp(cp, "max_addr=", 9) = 0) { max_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp)); + } else if (memcmp(cp, "min_addr=", 9) = 0) { + min_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp)); } else { while (*cp != ' ' && *cp) ++cp; @@ -428,6 +431,8 @@ efi_init (void) ++cp; } } + if (min_addr != 0UL) + printk(KERN_INFO "Ignoring memory below %luMB\n", min_addr >> 20); if (max_addr != ~0UL) printk(KERN_INFO "Ignoring memory above %luMB\n", max_addr >> 20); @@ -894,7 +899,8 @@ find_memmap_space (void) as = max(contig_low, md->phys_addr); ae = min(contig_high, efi_md_end(md)); - /* keep within max_addr= command line arg */ + /* keep within max_addr= and min_addr= command line arg */ + as = max(as, min_addr); ae = min(ae, max_addr); if (ae <= as) continue; @@ -1004,7 +1010,8 @@ efi_memmap_init(unsigned long *s, unsign } else ae = efi_md_end(md); - /* keep within max_addr= command line arg */ + /* keep within max_addr= and min_addr= command line arg */ + as = max(as, min_addr); ae = min(ae, max_addr); if (ae <= as) continue; @@ -1116,6 +1123,12 @@ efi_initialize_iomem_resources(struct re */ insert_resource(res, code_resource); insert_resource(res, data_resource); +#ifdef CONFIG_KEXEC + insert_resource(res, &efi_memmap_res); + insert_resource(res, &boot_param_res); + if (crashk_res.end > crashk_res.start) + insert_resource(res, &crashk_res); +#endif } } } diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/entry.S linux-2.6.18-rc4-kdump/arch/ia64/kernel/entry.S --- linux-2.6.18-rc4/arch/ia64/kernel/entry.S 2006-08-16 05:06:57.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/entry.S 2006-08-16 05:10:10.000000000 +0800 @@ -1575,7 +1575,7 @@ sys_call_table: data8 sys_mq_timedreceive // 1265 data8 sys_mq_notify data8 sys_mq_getsetattr - data8 sys_ni_syscall // reserved for kexec_load + data8 sys_kexec_load data8 sys_ni_syscall // reserved for vserver data8 sys_waitid // 1270 data8 sys_add_key diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/iosapic.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/iosapic.c --- linux-2.6.18-rc4/arch/ia64/kernel/iosapic.c 2006-08-16 05:06:57.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/iosapic.c 2006-08-16 05:10:27.000000000 +0800 @@ -288,6 +288,24 @@ nop (unsigned int irq) /* do nothing... */ } +#ifdef CONFIG_CRASH_DUMP +void +kdump_disable_irq(unsigned int irq) +{ + u32 low32; + ia64_vector vec = irq_to_vector(irq); + struct iosapic_rte_info *rte; + + low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK; + list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, + rte_list) { + iosapic_write(rte->addr, + IOSAPIC_RTE_LOW(rte->rte_index), low32); + iosapic_eoi(rte->addr, vec); + } +} +#endif + static void mask_irq (unsigned int irq) { diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/machine_kexec.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/machine_kexec.c --- linux-2.6.18-rc4/arch/ia64/kernel/machine_kexec.c 1970-01-01 08:00:00.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/machine_kexec.c 2006-08-16 05:10:10.000000000 +0800 @@ -0,0 +1,131 @@ +/* + * arch/ia64/kernel/machine_kexec.c + * + * Handle transition of Linux booting another kernel + * Copyright (C) 2005 Hewlett-Packard Development Comapny, L.P. + * Copyright (C) 2005 Khalid Aziz <khalid.aziz@hp.com> + * Copyright (C) 2006 Intel Corp, Zou Nan hai <nanhai.zou@intel.com> + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + */ + +#include <linux/kernel.h> +#include <linux/config.h> +#include <linux/mm.h> +#include <linux/kexec.h> +#include <linux/pci.h> +#include <linux/cpu.h> +#include <asm/mmu_context.h> +#include <asm/setup.h> +#include <asm/mca.h> +#include <asm/page.h> +#include <asm/bitops.h> +#include <asm/tlbflush.h> +#include <asm/delay.h> +#include <asm/meminit.h> + +typedef void (*relocate_new_kernel_t)(unsigned long, unsigned long, + struct ia64_boot_param *, unsigned long); +static struct kimage *ia64_kimage; +struct resource efi_memmap_res = { + .name = "EFI Memory Map", + .start = 0, + .end = 0, + .flags = IORESOURCE_BUSY | IORESOURCE_MEM +}; + +struct resource boot_param_res = { + .name = "Boot parameter", + .start = 0, + .end = 0, + .flags = IORESOURCE_BUSY | IORESOURCE_MEM +}; + + +/* + * Do what every setup is needed on image and the + * reboot code buffer to allow us to avoid allocations + * later. + */ +int machine_kexec_prepare(struct kimage *image) +{ + void *control_code_buffer; + const unsigned long *func; + + func = (unsigned long *)&relocate_new_kernel; + /* Pre-load control code buffer to minimize work in kexec path */ + control_code_buffer = page_address(image->control_code_page); + memcpy((void *)control_code_buffer, (const void *)func[0], + relocate_new_kernel_size); + flush_icache_range((unsigned long)control_code_buffer, + (unsigned long)control_code_buffer + relocate_new_kernel_size); + ia64_kimage = image; + + return 0; +} + +void machine_kexec_cleanup(struct kimage *image) +{ +} + +void machine_shutdown(void) +{ +#ifdef CONFIG_HOTPLUG_CPU + { + int cpu; + + for_each_online_cpu(cpu) { + if (cpu != smp_processor_id()) + cpu_down(cpu); + } + } +#elif defined(CONFIG_SMP) + smp_call_function(kexec_stop_this_cpu, (void *)ia64_kimage->start, 0, 0); +#endif +#ifdef CONFIG_PCI + { + struct pci_dev *dev = NULL; + irq_desc_t *idesc; + /* Disable all PCI devices */ + while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { + if (!(dev->is_enabled)) + continue; + idesc = irq_desc + dev->irq; + if (!idesc||!idesc->chip) + continue; + disable_irq_nosync(dev->irq); + idesc->chip->end(dev->irq); + idesc->action = NULL; + pci_disable_device(dev); + } + } +#endif + + +#ifdef CONFIG_IA64_HP_ZX1 + ioc_iova_disable(); +#endif +} + +/* + * Do not allocate memory (or fail in any way) in machine_kexec(). + * We are past the point of no return, committed to rebooting now. + */ +extern void *efi_get_pal_addr(void); +void machine_kexec(struct kimage *image) +{ + relocate_new_kernel_t rnk; + void *pal_addr = efi_get_pal_addr(); + unsigned long code_addr = (unsigned long)page_address(image->control_code_page); + if (image->type = KEXEC_TYPE_CRASH) + crash_save_this_cpu(); + /* Interrupts aren't acceptable while we reboot */ + ia64_set_itv(1<<16); + local_irq_disable(); + rnk = (relocate_new_kernel_t)&code_addr; + (*rnk)(image->head, image->start, ia64_boot_param, + GRANULEROUNDDOWN((unsigned long) pal_addr)); + BUG(); + for (;;); +} diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/Makefile linux-2.6.18-rc4-kdump/arch/ia64/kernel/Makefile --- linux-2.6.18-rc4/arch/ia64/kernel/Makefile 2006-08-16 05:06:57.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/Makefile 2006-08-16 05:10:10.000000000 +0800 @@ -28,6 +28,7 @@ obj-$(CONFIG_IA64_CYCLONE) += cyclone.o obj-$(CONFIG_CPU_FREQ) += cpufreq/ 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_IA64_UNCACHED_ALLOCATOR) += uncached.o obj-$(CONFIG_AUDIT) += audit.o mca_recovery-y += mca_drv.o mca_drv_asm.o diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/relocate_kernel.S linux-2.6.18-rc4-kdump/arch/ia64/kernel/relocate_kernel.S --- linux-2.6.18-rc4/arch/ia64/kernel/relocate_kernel.S 1970-01-01 08:00:00.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/relocate_kernel.S 2006-08-16 05:10:10.000000000 +0800 @@ -0,0 +1,490 @@ +/* + * arch/ia64/kernel/relocate_kernel.S + * + * Relocate kexec'able kernel and start it + * + * Copyright (C) 2005 Hewlett-Packard Development Company, L.P. + * Copyright (C) 2005 Khalid Aziz <khalid.aziz@hp.com> + * Copyright (C) 2005 Intel Corp, Zou Nan hai <nanhai.zou@intel.com> + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + */ +#include <linux/config.h> +#include <asm/asmmacro.h> +#include <asm/kregs.h> +#include <asm/page.h> +#include <asm/pgtable.h> +#include <asm/mca_asm.h> + + /* Must be relocatable PIC code callable as a C function + */ +GLOBAL_ENTRY(relocate_new_kernel) + .prologue + alloc r31=ar.pfs,4,0,0,0 + .body +.reloc_entry: +{ + rsm psr.i| psr.ic + mov r2=ip +} + ;; +{ + flushrs // must be first insn in group + srlz.i +} + ;; + dep r2=0,r2,61,3 //to physical address + ;; + //first switch to physical mode + add r3\x1f-.reloc_entry, r2 + movl r16 = IA64_PSR_AC|IA64_PSR_BN|IA64_PSR_IC + mov ar.rsc=0 // put RSE in enforced lazy mode + ;; + add sp=(memory_stack_end - 16 - .reloc_entry),r2 + add r8=(register_stack - .reloc_entry),r2 + ;; + mov r18=ar.rnat + mov ar.bspstore=r8 + ;; + mov cr.ipsr=r16 + mov cr.iip=r3 + mov cr.ifs=r0 + srlz.i + ;; + mov ar.rnat=r18 + rfi + ;; +1: + //physical mode code begin + mov b6=in1 + dep r28=0,in2,61,3 //to physical address + + // purge all TC entries +#define O(member) IA64_CPUINFO_##member##_OFFSET + GET_THIS_PADDR(r2, cpu_info) // load phys addr of cpu_info into r2 + ;; + addl r17=O(PTCE_STRIDE),r2 + addl r2=O(PTCE_BASE),r2 + ;; + ld8 r18=[r2],(O(PTCE_COUNT)-O(PTCE_BASE));; // r18=ptce_base + ld4 r19=[r2],4 // r19=ptce_count[0] + ld4 r21=[r17],4 // r21=ptce_stride[0] + ;; + ld4 r20=[r2] // r20=ptce_count[1] + ld4 r22=[r17] // r22=ptce_stride[1] + mov r24=r0 + ;; + adds r20=-1,r20 + ;; +#undef O +2: + cmp.ltu p6,p7=r24,r19 +(p7) br.cond.dpnt.few 4f + mov ar.lc=r20 +3: + ptc.e r18 + ;; + add r18=r22,r18 + br.cloop.sptk.few 3b + ;; + add r18=r21,r18 + add r24=1,r24 + ;; + br.sptk.few 2b +4: + srlz.i + ;; + //purge TR entry for kernel text and data + movl r16=KERNEL_START + mov r18=KERNEL_TR_PAGE_SHIFT<<2 + ;; + ptr.i r16, r18 + ptr.d r16, r18 + ;; + srlz.i + ;; + + // purge TR entry for percpu data + movl r16=PERCPU_ADDR + mov r18=PERCPU_PAGE_SHIFT<<2 + ;; + ptr.d r16,r18 + ;; + srlz.d + ;; + + // purge TR entry for pal code + mov r16=in3 + mov r18=IA64_GRANULE_SHIFT<<2 + ;; + ptr.i r16,r18 + ;; + srlz.i + ;; + + // purge TR entry for stack + mov r16=IA64_KR(CURRENT_STACK) + ;; + shl r16=r16,IA64_GRANULE_SHIFT + movl r19=PAGE_OFFSET + ;; + add r16=r19,r16 + mov r18=IA64_GRANULE_SHIFT<<2 + ;; + ptr.d r16,r18 + ;; + srlz.i + ;; + + //copy segments + movl r16=PAGE_MASK + mov r30=in0 // in0 is page_list + br.sptk.few .dest_page + ;; +.loop: + ld8 r30=[in0], 8;; +.dest_page: + tbit.z p0, p6=r30, 0;; // 0x1 dest page +(p6) and r17=r30, r16 +(p6) br.cond.sptk.few .loop;; + + tbit.z p0, p6=r30, 1;; // 0x2 indirect page +(p6) and in0=r30, r16 +(p6) br.cond.sptk.few .loop;; + + tbit.z p0, p6=r30, 2;; // 0x4 end flag +(p6) br.cond.sptk.few .end_loop;; + + tbit.z p6, p0=r30, 3;; // 0x8 source page +(p6) br.cond.sptk.few .loop + + and r18=r30, r16 + + // simple copy page, may optimize later + movl r14=PAGE_SIZE/8 - 1;; + mov ar.lc=r14;; +1: + ld8 r14=[r18], 8;; + st8 [r17]=r14, 8;; + fc.i r17 + br.ctop.sptk.few 1b + br.sptk.few .loop + ;; + +.end_loop: + sync.i // for fc.i + ;; + srlz.i + ;; + srlz.d + ;; + br.call.sptk.many b0¶;; + +.align 32 +memory_stack: + .fill 8192, 1, 0 +memory_stack_end: +register_stack: + .fill 8192, 1, 0 +register_stack_end: +relocate_new_kernel_end: +END(relocate_new_kernel) + +GLOBAL_ENTRY(kexec_fake_sal_rendez) + .prologue + alloc r31=ar.pfs,3,0,0,0 + .body +.rendez_entry: + rsm psr.i | psr.ic + mov r25=ip + ;; + { + flushrs + srlz.i + } + ;; + /* See where I am running, and compute gp */ + { + mov ar.rsc = 0 /* Put RSE in enforce lacy, LE mode */ + mov gp = ip /* gp = relocate_new_kernel */ + } + + movl r8=0x00000100000000 + ;; + mov cr.iva=r8 + /* Transition from virtual to physical mode */ + srlz.i + ;; + add r17_-.rendez_entry, r25 + movl r16=(IA64_PSR_AC | IA64_PSR_BN | IA64_PSR_IC | IA64_PSR_MFL) + ;; + tpa r17=r17 + mov cr.ipsr=r16 + ;; + mov cr.iip=r17 + mov cr.ifs=r0 + ;; + rfi + ;; +5: + mov b6=in0 /* _start addr */ + mov r8=in1 /* ap_wakeup_vector */ + mov r26=in2 /* PAL addr */ + ;; + /* Purge kernel TRs */ + movl r16=KERNEL_START + mov r18=KERNEL_TR_PAGE_SHIFT<<2 + ;; + ptr.i r16,r18 + ptr.d r16,r18 + ;; + srlz.i + ;; + srlz.d + ;; + /* Purge percpu TR */ + movl r16=PERCPU_ADDR + mov r18=PERCPU_PAGE_SHIFT<<2 + ;; + ptr.d r16,r18 + ;; + srlz.d + ;; + /* Purge PAL TR */ + mov r18=IA64_GRANULE_SHIFT<<2 + ;; + ptr.i r26,r18 + ;; + srlz.i + ;; + /* Purge stack TR */ + mov r16=IA64_KR(CURRENT_STACK) + ;; + shl r16=r16,IA64_GRANULE_SHIFT + movl r19=PAGE_OFFSET + ;; + add r16=r19,r16 + mov r18=IA64_GRANULE_SHIFT<<2 + ;; + ptr.d r16,r18 + ;; + srlz.i + ;; + + /* Ensure we can read and clear external interrupts */ + mov cr.tpr=r0 + srlz.d + + shr.u r9=r8,6 /* which irr */ + ;; + and r8c,r8 /* bit offset into irr */ + ;; + mov r10=1;; + ;; + shl r10=r10,r8 /* bit mask off irr we want */ + cmp.eq p6,p0=0,r9 + ;; +(p6) br.cond.sptk.few check_irr0 + cmp.eq p7,p0=1,r9 + ;; +(p7) br.cond.sptk.few check_irr1 + cmp.eq p8,p0=2,r9 + ;; +(p8) br.cond.sptk.few check_irr2 + cmp.eq p9,p0=3,r9 + ;; +(p9) br.cond.sptk.few check_irr3 + +check_irr0: + mov r8=cr.irr0 + ;; + and r8=r8,r10 + ;; + cmp.eq p6,p0=0,r8 +(p6) br.cond.sptk.few check_irr0 + br.few call_start + +check_irr1: + mov r8=cr.irr1 + ;; + and r8=r8,r10 + ;; + cmp.eq p6,p0=0,r8 +(p6) br.cond.sptk.few check_irr1 + br.few call_start + +check_irr2: + mov r8=cr.irr2 + ;; + and r8=r8,r10 + ;; + cmp.eq p6,p0=0,r8 +(p6) br.cond.sptk.few check_irr2 + br.few call_start + +check_irr3: + mov r8=cr.irr3 + ;; + and r8=r8,r10 + ;; + cmp.eq p6,p0=0,r8 +(p6) br.cond.sptk.few check_irr3 + br.few call_start + +call_start: + mov cr.eoi=r0 + ;; + srlz.d + ;; + mov r8=cr.ivr + ;; + srlz.d + ;; + cmp.eq p0,p6\x15,r8 +(p6) br.cond.sptk.few call_start + br.sptk.few b6 +kexec_fake_sal_rendez_end: +END(kexec_fake_sal_rendez) + + .global relocate_new_kernel_size +relocate_new_kernel_size: + data8 kexec_fake_sal_rendez_end - relocate_new_kernel + +GLOBAL_ENTRY(ia64_dump_cpu_regs) + .prologue + alloc loc0=ar.pfs,1,2,0,0 + .body + mov ar.rsc=0 // put RSE in enforced lazy mode + add loc1=4*8, in0 // save r4 and r5 first + ;; +{ + flushrs // flush dirty regs to backing store + srlz.i +} + st8 [loc1]=r4, 8 + ;; + st8 [loc1]=r5, 8 + ;; + add loc12*8, in0 + mov r4=ar.rnat + ;; + st8 [in0]=r0, 8 // r0 + st8 [loc1]=r4, 8 // rnat + mov r5=pr + ;; + st8 [in0]=r1, 8 // r1 + st8 [loc1]=r5, 8 // pr + mov r4° + ;; + st8 [in0]=r2, 8 // r2 + st8 [loc1]=r4, 8 // b0 + mov r5±; + ;; + st8 [in0]=r3, 24 // r3 + st8 [loc1]=r5, 8 // b1 + mov r4² + ;; + st8 [in0]=r6, 8 // r6 + st8 [loc1]=r4, 8 // b2 + mov r5³ + ;; + st8 [in0]=r7, 8 // r7 + st8 [loc1]=r5, 8 // b3 + mov r4´ + ;; + st8 [in0]=r8, 8 // r8 + st8 [loc1]=r4, 8 // b4 + mov r5µ + ;; + st8 [in0]=r9, 8 // r9 + st8 [loc1]=r5, 8 // b5 + mov r4¶ + ;; + st8 [in0]=r10, 8 // r10 + st8 [loc1]=r5, 8 // b6 + mov r5· + ;; + st8 [in0]=r11, 8 // r11 + st8 [loc1]=r5, 8 // b7 + mov r4° + ;; + st8 [in0]=r12, 8 // r12 + st8 [loc1]=r4, 8 // ip + mov r5=loc0 + ;; + st8 [in0]=r13, 8 // r13 + extr.u r5=r5, 0, 38 // ar.pfs.pfm + mov r4=r0 // user mask + ;; + st8 [in0]=r14, 8 // r14 + st8 [loc1]=r5, 8 // cfm + ;; + st8 [in0]=r15, 8 // r15 + st8 [loc1]=r4, 8 // user mask + mov r5=ar.rsc + ;; + st8 [in0]=r16, 8 // r16 + st8 [loc1]=r5, 8 // ar.rsc + mov r4=ar.bsp + ;; + st8 [in0]=r17, 8 // r17 + st8 [loc1]=r4, 8 // ar.bsp + mov r5=ar.bspstore + ;; + st8 [in0]=r18, 8 // r18 + st8 [loc1]=r5, 8 // ar.bspstore + mov r4=ar.rnat + ;; + st8 [in0]=r19, 8 // r19 + st8 [loc1]=r4, 8 // ar.rnat + mov r5=ar.ccv + ;; + st8 [in0]=r20, 8 // r20 + st8 [loc1]=r5, 8 // ar.ccv + mov r4=ar.unat + ;; + st8 [in0]=r21, 8 // r21 + st8 [loc1]=r4, 8 // ar.unat + mov r5 = ar.fpsr + ;; + st8 [in0]=r22, 8 // r22 + st8 [loc1]=r5, 8 // ar.fpsr + mov r4 = ar.unat + ;; + st8 [in0]=r23, 8 // r23 + st8 [loc1]=r4, 8 // unat + mov r5 = ar.fpsr + ;; + st8 [in0]=r24, 8 // r24 + st8 [loc1]=r5, 8 // fpsr + mov r4 = ar.pfs + ;; + st8 [in0]=r25, 8 // r25 + st8 [loc1]=r4, 8 // ar.pfs + mov r5 = ar.lc + ;; + st8 [in0]=r26, 8 // r26 + st8 [loc1]=r5, 8 // ar.lc + mov r4 = ar.ec + ;; + st8 [in0]=r27, 8 // r27 + st8 [loc1]=r4, 8 // ar.ec + mov r5 = ar.csd + ;; + st8 [in0]=r28, 8 // r28 + st8 [loc1]=r5, 8 // ar.csd + mov r4 = ar.ssd + ;; + st8 [in0]=r29, 8 // r29 + st8 [loc1]=r4, 8 // ar.ssd + ;; + st8 [in0]=r30, 8 // r30 + ;; + st8 [in0]=r31, 8 // r31 + mov ar.pfs=loc0 + ;; + br.ret.sptk.many rp +END(ia64_dump_cpu_regs) + + diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/setup.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/setup.c --- linux-2.6.18-rc4/arch/ia64/kernel/setup.c 2006-08-16 05:06:57.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/setup.c 2006-08-16 05:10:10.000000000 +0800 @@ -43,6 +43,8 @@ #include <linux/initrd.h> #include <linux/pm.h> #include <linux/cpufreq.h> +#include <linux/kexec.h> +#include <linux/crash_dump.h> #include <asm/ia32.h> #include <asm/machvec.h> @@ -250,6 +252,41 @@ reserve_memory (void) } #endif +#ifdef CONFIG_KEXEC + /* crashkernel=size@addr specifies the location to reserve for + * a crash kernel. By reserving this memory we guarantee + * that linux never set's it up as a DMA target. + * Useful for holding code to do something appropriate + * after a kernel panic. + */ + { + char *from = strstr(saved_command_line, "crashkernel="); + if (from) { + unsigned long size, base; + size = memparse(from + 12, &from); + if (*from = '@') { + base = memparse(from + 1, &from); + rsvd_region[n].start + (unsigned long)__va(base); + rsvd_region[n].end + (unsigned long)__va(base + size); + crashk_res.start = base; + crashk_res.end = base + size - 1; + n++; + } + } + efi_memmap_res.start = ia64_boot_param->efi_memmap; + efi_memmap_res.end = efi_memmap_res.start + + ia64_boot_param->efi_memmap_size; + printk("efi_memmap start %lx %lx\n", + efi_memmap_res.start, + efi_memmap_res.end); + boot_param_res.start = __pa(ia64_boot_param); + boot_param_res.end = boot_param_res.start + + sizeof(*ia64_boot_param); + } +#endif + efi_memmap_init(&rsvd_region[n].start, &rsvd_region[n].end); n++; @@ -484,6 +521,16 @@ setup_arch (char **cmdline_p) if (!nomca) ia64_mca_init(); +#ifdef CONFIG_CRASH_DUMP + { + char *from = strstr(saved_command_line, "elfcorehdr="); + + if (from) + elfcorehdr_addr = memparse(from+11, &from); + saved_max_pfn = (unsigned long) -1; + } +#endif + platform_setup(cmdline_p); paging_init(); } diff -Nraup linux-2.6.18-rc4/arch/ia64/kernel/smp.c linux-2.6.18-rc4-kdump/arch/ia64/kernel/smp.c --- linux-2.6.18-rc4/arch/ia64/kernel/smp.c 2006-06-18 09:49:35.000000000 +0800 +++ linux-2.6.18-rc4-kdump/arch/ia64/kernel/smp.c 2006-08-16 05:10:10.000000000 +0800 @@ -30,6 +30,7 @@ #include <linux/delay.h> #include <linux/efi.h> #include <linux/bitops.h> +#include <linux/kexec.h> #include <asm/atomic.h> #include <asm/current.h> @@ -66,6 +67,7 @@ static volatile struct call_data_struct #define IPI_CALL_FUNC 0 #define IPI_CPU_STOP 1 +#define IPI_KDUMP_CPU_STOP 3 /* This needs to be cacheline aligned because it is written to by *other* CPUs. */ static DEFINE_PER_CPU(u64, ipi_operation) ____cacheline_aligned; @@ -84,6 +86,34 @@ unlock_ipi_calllock(void) spin_unlock_irq(&call_lock); } +#ifdef CONFIG_KEXEC +/* + * Stop the CPU and put it in fake SAL rendezvous. This allows CPU to wake + * up with IPI from boot processor + */ +void +kexec_stop_this_cpu (void *func) +{ + unsigned long pta, impl_va_bits, pal_base; + + /* + * Remove this CPU by putting it into fake SAL rendezvous + */ + cpu_clear(smp_processor_id(), cpu_online_map); + max_xtp(); + ia64_eoi(); + + /* Disable VHPT */ + impl_va_bits = ffz(~(local_cpu_data->unimpl_va_mask | (7UL << 61))); + pta = POW2(61) - POW2(vmlpt_bits); + ia64_set_pta(pta | (0 << 8) | (vmlpt_bits << 2) | 0); + + local_irq_disable(); + pal_base = __get_cpu_var(ia64_mca_pal_base); + kexec_fake_sal_rendez(func, ap_wakeup_vector, pal_base); +} +#endif + static void stop_this_cpu (void) { @@ -155,7 +185,15 @@ handle_IPI (int irq, void *dev_id, struc case IPI_CPU_STOP: stop_this_cpu(); break; - +#ifdef CONFIG_CRASH_DUMP + case IPI_KDUMP_CPU_STOP: + { + local_irq_disable(); + crash_save_this_cpu(); + cpu_halt(); + } + break; +#endif default: printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which); break; @@ -371,6 +409,13 @@ smp_send_stop (void) { send_IPI_allbutself(IPI_CPU_STOP); } +#ifdef CONFIG_CRASH_DUMP +void +kdump_smp_send_stop() +{ + send_IPI_allbutself(IPI_KDUMP_CPU_STOP); +} +#endif int __init setup_profiling_timer (unsigned int multiplier) diff -Nraup linux-2.6.18-rc4/include/asm-ia64/kexec.h linux-2.6.18-rc4-kdump/include/asm-ia64/kexec.h --- linux-2.6.18-rc4/include/asm-ia64/kexec.h 1970-01-01 08:00:00.000000000 +0800 +++ linux-2.6.18-rc4-kdump/include/asm-ia64/kexec.h 2006-08-16 05:11:16.000000000 +0800 @@ -0,0 +1,40 @@ +#ifndef _ASM_IA64_KEXEC_H +#define _ASM_IA64_KEXEC_H + + +/* Maximum physical address we can use pages from */ +#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL) +/* Maximum address we can reach in physical address mode */ +#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL) +/* Maximum address we can use for the control code buffer */ +#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE + +#define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096) + +/* The native architecture */ +#define KEXEC_ARCH KEXEC_ARCH_IA_64 + +#define MAX_NOTE_BYTES 1024 + +#define pte_bits 3 +#define vmlpt_bits (impl_va_bits - PAGE_SHIFT + pte_bits) +#define POW2(n) (1ULL << (n)) + +DECLARE_PER_CPU(u64, ia64_mca_pal_base); +const extern unsigned int relocate_new_kernel_size; +volatile extern long kexec_rendez; +extern void relocate_new_kernel(unsigned long, unsigned long, + struct ia64_boot_param *, unsigned long); +extern void kexec_fake_sal_rendez(void *start, unsigned long wake_up, + unsigned long pal_base); +static inline void +crash_setup_regs(struct pt_regs *newregs, struct pt_regs *oldregs) +{ +} +extern struct resource efi_memmap_res; +extern struct resource boot_param_res; +extern void kdump_smp_send_stop(void); +extern void kdump_disable_irq(unsigned int irq); +extern void crash_save_this_cpu(void); + +#endif /* _ASM_IA64_KEXEC_H */ diff -Nraup linux-2.6.18-rc4/include/asm-ia64/machvec_hpzx1.h linux-2.6.18-rc4-kdump/include/asm-ia64/machvec_hpzx1.h --- linux-2.6.18-rc4/include/asm-ia64/machvec_hpzx1.h 2006-06-18 09:49:35.000000000 +0800 +++ linux-2.6.18-rc4-kdump/include/asm-ia64/machvec_hpzx1.h 2006-08-16 05:10:10.000000000 +0800 @@ -34,4 +34,6 @@ extern ia64_mv_dma_mapping_error sba_dma #define platform_dma_supported sba_dma_supported #define platform_dma_mapping_error sba_dma_mapping_error +extern void ioc_iova_disable(void); + #endif /* _ASM_IA64_MACHVEC_HPZX1_h */ diff -Nraup linux-2.6.18-rc4/include/asm-ia64/meminit.h linux-2.6.18-rc4-kdump/include/asm-ia64/meminit.h --- linux-2.6.18-rc4/include/asm-ia64/meminit.h 2006-08-16 05:07:22.000000000 +0800 +++ linux-2.6.18-rc4-kdump/include/asm-ia64/meminit.h 2006-08-16 05:10:10.000000000 +0800 @@ -15,11 +15,12 @@ * - initrd (optional) * - command line string * - kernel code & data + * - crash dumping code reserved region * - Kernel memory map built from EFI memory map * * More could be added if necessary */ -#define IA64_MAX_RSVD_REGIONS 6 +#define IA64_MAX_RSVD_REGIONS 7 struct rsvd_region { unsigned long start; /* virtual address of beginning of element */ diff -Nraup linux-2.6.18-rc4/include/asm-ia64/smp.h linux-2.6.18-rc4-kdump/include/asm-ia64/smp.h --- linux-2.6.18-rc4/include/asm-ia64/smp.h 2006-08-16 05:07:23.000000000 +0800 +++ linux-2.6.18-rc4-kdump/include/asm-ia64/smp.h 2006-08-16 05:10:10.000000000 +0800 @@ -128,6 +128,9 @@ extern void smp_send_reschedule (int cpu extern void lock_ipi_calllock(void); extern void unlock_ipi_calllock(void); extern void identify_siblings (struct cpuinfo_ia64 *); +#ifdef CONFIG_KEXEC +extern void kexec_stop_this_cpu(void *); +#endif #else diff -Nraup linux-2.6.18-rc4/kernel/irq/manage.c linux-2.6.18-rc4-kdump/kernel/irq/manage.c --- linux-2.6.18-rc4/kernel/irq/manage.c 2006-08-16 05:07:28.000000000 +0800 +++ linux-2.6.18-rc4-kdump/kernel/irq/manage.c 2006-08-16 05:10:10.000000000 +0800 @@ -475,4 +475,3 @@ int request_irq(unsigned int irq, return retval; } EXPORT_SYMBOL(request_irq); - ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai 2006-08-14 21:24 ` Bob Montgomery 2006-08-15 0:47 ` Zou Nan hai @ 2006-08-15 1:56 ` Jay Lan 2006-08-15 17:39 ` Bob Montgomery ` (13 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Jay Lan @ 2006-08-15 1:56 UTC (permalink / raw) To: linux-ia64 Bob Montgomery wrote: > On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote: > >>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. > > > Contrary to expectations, my experience with this patch on a 2.6.18-rc4 > kernel is that kexec -l, kexec -e is now working without my adding any > delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case > hangs. > > My "got here" printk's on the console indicate: > > SysRq : Trigger a crashdump > machine_crash_shutdown > device_shootdown > machine_kexec type: 1 > > And then it hangs. Hi, I got it further down. > > My test system: hp A6870A server rx2600 >>From /proc/iomem: > 04a1f000-3f5e3fff : System RAM > 10000000-17ffffff : Crash kernel > My test system is a zx6000. Here is from /proc/iomem: 04aaf000-3e417fff : System RAM 10000000-17ffffff : Crash kernel I used 'make tiger_defconfig', then set on CONFIG_KEXEC, CONFIG_CRASH_DUMP, and CONFIG_PROC_VMCOR. Here are shown on console: SysRq : Trigger a crashdump kernel BUG at kernel/irq/migration.c:39! bash[4846]: bugcheck! 0 [1] Modules linked in: radeon drm agpgart nfs lockd sunrpc binfmt_misc dm_mirror dmi Pid: 4846, CPU 0, comm: bash psr : 00001010085a2010 ifs : 800000000000038b ip : [<a0000001000e2520>] Notdip is at move_native_irq+0x1a0/0x360 unat: 0000000000000000 pfs : 000000000000038b rsc : 0000000000000003 rnat: 0000000000000000 bsps: 0000000000000000 pr : 000000000059a999 ldrs: 0000000000000000 ccv : 0000000000000000 fpsr: 0009804c8a70033f csd : 0000000000000000 ssd : 0000000000000000 b0 : a0000001000e2520 b6 : a0000001000bc7c0 b7 : a00000010004ec60 f6 : 1003e00000000000000a0 f7 : 1003e20c49ba5e353f7cf f8 : 1003e00000000000004e2 f9 : 1003e000000000fa00000 f10 : 1003e000000003b9aca00 f11 : 1003e431bde82d7b634db r1 : a000000100b663c0 r2 : 0000000000001000 r3 : a000000100910e88 r8 : 000000000000002c r9 : 00000000000000fd r10 : a00000010097c750 r11 : 0000000000000000 r12 : e00000001c157c60 r13 : e00000001c150000 r14 : 0000000000004000 r15 : a000000100910e88 r16 : a000000100910e90 r17 : 0000000000004000 r18 : 0000000000000000 r19 : 0000000000000001 r20 : a000000100985f98 r21 : a000000100985f98 r22 : 0000000000000004 r23 : 0000000000000000 r24 : e00000003f3e0f64 r25 : 0000000000000000 r26 : e00000003f3e0f6c r27 : e00000003f3e0f50 r28 : e00000003f3e0008 r29 : 0000000000000000 r30 : 0000000000000000 r31 : 0000000000000000 Call Trace: [<a0000001000138e0>] show_stack+0x40/0xa0 spà0000001c1577f0 bspà0000001c1514a8 [<a000000100014540>] show_regs+0x840/0x880 spà0000001c1579c0 bspà0000001c151450 [<a000000100036400>] die+0x1c0/0x2c0 spà0000001c1579c0 bspà0000001c151408 [<a000000100036550>] die_if_kernel+0x50/0x80 spà0000001c1579e0 bspà0000001c1513d0 [<a000000100037c50>] ia64_bad_break+0x270/0x4a0 spà0000001c1579e0 bspà0000001c1513a8 [<a00000010000c320>] ia64_leave_kernel+0x0/0x280 spà0000001c157a90 bspà0000001c1513a8 [<a0000001000e2520>] move_native_irq+0x1a0/0x360 spà0000001c157c60 bspà0000001c151350 [<a00000010004ec90>] iosapic_end_level_irq+0x30/0xe0 spà0000001c157c60 bspà0000001c151330 [<a00000010005d4e0>] machine_crash_shutdown+0x120/0x220 spà0000001c157c60 bspà0000001c151300 [<a0000001000d5890>] crash_kexec+0x70/0xc0 spà0000001c157c60 bspà0000001c1512e0 [<a00000010045ee00>] sysrq_handle_crashdump+0x20/0x40 spà0000001c157e20 bspà0000001c1512b8 [<a00000010045efe0>] __handle_sysrq+0x160/0x300 spà0000001c157e20 bspà0000001c151268 [<a0000001001ba0b0>] write_sysrq_trigger+0xb0/0xe0 spà0000001c157e20 bspà0000001c151238 [<a00000010012fad0>] vfs_write+0x1b0/0x340 spà0000001c157e20 bspà0000001c1511e0 [<a000000100130750>] sys_write+0x70/0xe0 spà0000001c157e20 bspà0000001c151168 [<a00000010000c180>] ia64_ret_from_syscall+0x0/0x20 spà0000001c157e30 bspà0000001c151168 [<a000000000010620>] __kernel_syscall_via_break+0x0/0x20 spà0000001c158000 bspà0000001c151168 <4>hda: lost interrupt mptscsih: ioc0: attempting task abort! (scà0000003e42ba00) sd 0:0:0:0: command: cdb[0]=0x4d: 4d 00 6f 00 00 00 00 00 04 00 mptbase: Initiating ioc0 recovery mptscsih: ioc0: task abort: SUCCESS (scà0000003e42ba00) mptscsih: ioc0: attempting task abort! (scà0000003e42ba00) sd 0:0:0:0: command: cdb[0]=0x0: 00 00 00 00 00 00 mptbase: Initiating ioc0 recovery mptscsih: ioc0: task abort: SUCCESS (scà0000003e42ba00) mptscsih: ioc0: attempting task abort! (scà0000003e429c00) sd 0:0:0:0: command: cdb[0]=0x0: 00 00 00 00 00 00 mptbase: Initiating ioc0 recovery mptscsih: ioc0: task abort: SUCCESS (scà0000003e429c00) mptscsih: ioc0: attempting task abort! (scà0000003e42bd00) sd 0:0:0:0: command: cdb[0]=0x0: 00 00 00 00 00 00 ide-cd: cmd 0x3 timed out hda: lost interrupt ... ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (2 preceding siblings ...) 2006-08-15 1:56 ` Jay Lan @ 2006-08-15 17:39 ` Bob Montgomery 2006-08-15 19:15 ` Jay Lan ` (12 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Bob Montgomery @ 2006-08-15 17:39 UTC (permalink / raw) To: linux-ia64 On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote: > > ... > Jay, > Thanks very much, please try the following updated patch which > simplify the device_shootdown code. > My system continues to hang with the new patch. I can get a printk just before jumping to the new code in machine_kexec. We're going to try hooking up the ITP now. Bob Montgomery ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (3 preceding siblings ...) 2006-08-15 17:39 ` Bob Montgomery @ 2006-08-15 19:15 ` Jay Lan 2006-08-15 19:31 ` Bob Montgomery ` (11 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Jay Lan @ 2006-08-15 19:15 UTC (permalink / raw) To: linux-ia64 Zou Nan hai wrote: > On Tue, 2006-08-15 at 09:56, Jay Lan wrote: > >>Bob Montgomery wrote: >> >>>On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote: >>> >>> >>>>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. >>> >>> > >>... > > Jay, > Thanks very much, please try the following updated patch which > simplify the device_shootdown code. > > > Signed-off-by: Zou Nan hai <nanhai.zou@intel.com> > Since you did not indicate version number different from the previous one, i would call it 2.6.18-rc4-v2. With this version, the crash dump kernel tried to boot... and failed at "exec of init()" for "No such file or directory". Here is the output at the console: SysRq : Trigger a crashdump Linux version 2.6.18-rc4 (jlan@holism.engr.sgi.com) (gcc version 4.1.0 200603046 Ignoring memory below 256MB Ignoring memory above 384MB EFI v1.10 by HP: SALsystab=0x3fb38000 ACPI 2.0=0x3fb2e000 SMBIOS=0x3fb3a000 HCD0 PCDP: v0 at 0x3fb2c000 Explicit "console="; ignoring PCDP efi_memmap start 17fd4000 17fd47e0 Initial ramdisk at: 0xe000000017e6c000 (1420052 bytes) SAL 3.1: HP version 2.31 SAL Platform features: None SAL: AP wakeup using external interrupt vector 0xff No logical to physical processor mapping available ACPI: Local APIC address c0000000fee00000 GSI 36 (level, low) -> CPU 0 (0x0000) vector 48 2 CPUs available, 2 CPUs total MCA related initialization done SMP: Allowing 2 CPUs, 0 hotplug CPUs Built 1 zonelists. Total pages: 8191 Kernel command line: root=LABEL=/ init 1 irqpoll console=ttyS0,38400n8 maxcpus=M Misrouted IRQ fixup and polling support enabled This may significantly impact system performance PID hash table entries: 512 (order: 9, 4096 bytes) irq 51, desc: a00000010082e380, depth: 1, count: 0, unhandled: 0 ->handle_irq(): a0000001007bf9c0, __stop___param+0x3a70/0x1c0b0 ->chip(): a000000100946468, no_irq_chip+0x0/0x80 ->action(): 0000000000000000 IRQ_DISABLED set Unexpected irq vector 0x33 on CPU 0! Console: colour dummy device 80x25 Dentry cache hash table entries: 16384 (order: 3, 131072 bytes) Inode-cache hash table entries: 8192 (order: 2, 65536 bytes) Placing software IO TLB between 0x11124000 - 0x15124000 Memory: 46144k/131056k available (6965k code, 84912k reserved, 2751k data, 256k) McKinley Errata 9 workaround not needed; disabling it Mount-cache hash table entries: 1024 ACPI: Core revision 20060707 Boot processor id 0x0/0x0 Brought up 1 CPUs Total of 1 processors activated (1945.60 BogoMIPS). migration_cost=0 checking if image is initramfs... it is Freeing initrd memory: 1376kB freed DMI 2.3 present. NET: Registered protocol family 16 ACPI: bus type pci registered ACPI: Interpreter enabled ACPI: Using IOSAPIC for interrupt routing ACPI: PCI Root Bridge [PCI0] (0000:00) ACPI: PCI Root Bridge [PCI1] (0000:20) ACPI: PCI Root Bridge [PCI2] (0000:40) ACPI: PCI Root Bridge [PCI3] (0000:60) ACPI: PCI Root Bridge [PCI4] (0000:80) ACPI: PCI Root Bridge [PCI6] (0000:c0) Linux Plug and Play Support v0.97 (c) Adam Belay pnp: PnP ACPI init GSI 34 (edge, high) -> CPU 0 (0x0000) vector 49 GSI 35 (edge, high) -> CPU 0 (0x0000) vector 50 pnp: PnP ACPI: found 10 devices SCSI subsystem initialized usbcore: registered new driver usbfs usbcore: registered new driver hub NET: Registered protocol family 2 IP route cache hash table entries: 1024 (order: -1, 8192 bytes) TCP established hash table entries: 4096 (order: 2, 65536 bytes) TCP bind hash table entries: 2048 (order: 1, 32768 bytes) TCP: Hash tables configured (established 4096 bind 2048) TCP reno registered perfmon: version 2.0 IRQ 238 perfmon: Itanium 2 PMU detected, 16 PMCs, 18 PMDs, 4 counters (47 bits) PAL Information Facility v0.5 perfmon: added sampling format default_format perfmon_default_smpl: default_format v2.0 registered Total HugeTLB memory allocated, 0 SGI XFS with large block/inode numbers, no debug enabled Initializing Cryptographic API io scheduler noop registered io scheduler anticipatory registered (default) io scheduler deadline registered io scheduler cfq registered EFI Time Services Driver v0.4 Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled 00:04: ttyS0 at MMIO 0xff5e0000 (irq = 49) is a 16550A 00:05: ttyS1 at MMIO 0xff5e2000 (irq = 50) is a 16550A RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize Intel(R) PRO/1000 Network Driver - version 7.1.9-k4 Copyright (c) 1999-2006 Intel Corporation. tg3.c:v3.64 (July 31, 2006) GSI 29 (level, low) -> CPU 0 (0x0000) vector 51 ACPI: PCI Interrupt 0000:20:02.0[A] -> GSI 29 (level, low) -> IRQ 51 eth0: Tigon3 [partno(BCM95700A6) rev 0105 PHY(5701)] (PCI:66MHz:64-bit) 10/100/e eth0: RXcsums[1] LinkChgREG[0] MIirq[0] ASF[0] Split[0] WireSpeed[1] TSOcap[0] eth0: dma_rwctrl[76ff2d0f] dma_mask[64-bit] netconsole: not configured, aborting Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx CMD649: IDE controller at PCI slot 0000:00:02.0 GSI 21 (level, low) -> CPU 0 (0x0000) vector 52 ACPI: PCI Interrupt 0000:00:02.0[A] -> GSI 21 (level, low) -> IRQ 52 CMD649: chipset revision 2 CMD649: 100% native mode on irq 52 ide0: BM-DMA at 0x0d40-0x0d47, BIOS settings: hda:DMA, hdb:pio ide1: BM-DMA at 0x0d48-0x0d4f, BIOS settings: hdc:pio, hdd:pio hda: DV-28E-C, ATAPI CD/DVD-ROM drive ide0 at 0xd58-0xd5f,0xd66 on irq 52 hda: ATAPI 24X DVD-ROM drive, 256kB Cache, UDMA(33) Uniform CD-ROM driver Revision: 3.20 ide-floppy driver 0.99.newide Fusion MPT base driver 3.04.01 Copyright (c) 1999-2005 LSI Logic Corporation Fusion MPT SPI Host driver 3.04.01 GSI 27 (level, low) -> CPU 0 (0x0000) vector 53 ACPI: PCI Interrupt 0000:20:01.0[A] -> GSI 27 (level, low) -> IRQ 53 mptbase: Initiating ioc0 bringup ioc0: 53C1030: Capabilities={Initiator,Target} scsi0 : ioc0: LSI53C1030, FwRev\x01032300h, Ports=1, MaxQ%5, IRQS Vendor: HP 73.4G Model: MAS3735NC Rev: HPC3 Type: Direct-Access ANSI SCSI revision: 03 target0:0:0: Beginning Domain Validation target0:0:0: Ending Domain Validation target0:0:0: FAST-160 WIDE SCSI 320.0 MB/s DT IU QAS RTI PCOMP (6.25 ns, offse) SCSI device sda: 143374738 512-byte hdwr sectors (73408 MB) sda: Write Protect is off SCSI device sda: drive cache: write through w/ FUA SCSI device sda: 143374738 512-byte hdwr sectors (73408 MB) sda: Write Protect is off SCSI device sda: drive cache: write through w/ FUA sda: sda1 sda2 sda3 sd 0:0:0:0: Attached scsi disk sda GSI 28 (level, low) -> CPU 0 (0x0000) vector 54 ACPI: PCI Interrupt 0000:20:01.1[B] -> GSI 28 (level, low) -> IRQ 54 mptbase: Initiating ioc1 bringup ioc1: 53C1030: Capabilities={Initiator,Target} scsi1 : ioc1: LSI53C1030, FwRev\x01032300h, Ports=1, MaxQ%5, IRQT Fusion MPT FC Host driver 3.04.01 Fusion MPT misc device (ioctl) driver 3.04.01 mptctl: Registered with Fusion MPT base driver mptctl: /dev/mptctl @ (major,minor\x10,220) USB Universal Host Controller Interface driver v3.0 usbcore: registered new driver usbhid drivers/usb/input/hid-core.c: v2.6:USB HID core driver mice: PS/2 mouse device common for all mice EFI Variables Facility v0.08 2004-May-17 TCP bic registered NET: Registered protocol family 1 NET: Registered protocol family 17 Freeing unused kernel memory: 256kB freed Red Hat nash version 5.0.32 starting Mounting proc filesystem Mounting sysfs filesystem Creating /dev Creating initial device nodes Setting up hotplug. Creating block device nodes. Creating root device. Mounting root filesystem.EXT3-fs: INFO: recovery required on readonly filesyste. EXT3-fs: write access will be enabled during recovery. kjournald starting. Commit interval 5 seconds EXT3-fs: recovery complete. EXT3-fs: mounted filesystem with ordered data mode. Setting up other filesystems. Setting up new root fs Kernel panic - not syncing: Attempted to kill init! Switching to ne w root and running init. unmounting old /dev unmounting old /proc unmounting old /sys WARNING: can't access exec of init () failed!!!: No such file or directory Regards, - jay ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (4 preceding siblings ...) 2006-08-15 19:15 ` Jay Lan @ 2006-08-15 19:31 ` Bob Montgomery 2006-08-15 19:46 ` Keshavamurthy Anil S ` (10 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Bob Montgomery @ 2006-08-15 19:31 UTC (permalink / raw) To: linux-ia64 On Tue, 2006-08-15 at 12:46 -0700, Keshavamurthy Anil S wrote: > On Mon, Aug 14, 2006 at 05:24:57PM -0400, Bob Montgomery wrote: > > On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote: > > > This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. > > > > Contrary to expectations, my experience with this patch on a 2.6.18-rc4 > > kernel is that kexec -l, kexec -e is now working without my adding any > > delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case > > hangs. > > > > # cat /proc/cmdline > > BOOT_IMAGE=scsi0:/EFI/debian/boot/vmlinuz-2.6.18-rc4-bobm root=/dev/sda4 > > raid=noautodetect crashkernel\x128M@256M panic=1 ro > > Can you change crashkernelQ2M@256 and try > kexec -p, echo c > /proc/sysrq-trigger case. 04a40000-3f5e3fff : System RAM 10000000-2fffffff : Crash kernel bobm@urlp2:~$ cat /proc/cmdline root=/dev/sda4 crashkernelQ2M@256M panic=1 ro # kexec -p vmlinux.strip --append="root=/dev/sda4 maxcpus=1 panic=1 irqpoll ro" # echo c >/proc/sysrq-trigger Still hangs with no indication on the console after my printk("bye\n") just before the br.call at the end of machine_kexec. Bob M. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (5 preceding siblings ...) 2006-08-15 19:31 ` Bob Montgomery @ 2006-08-15 19:46 ` Keshavamurthy Anil S 2006-08-15 22:36 ` Zou Nan hai ` (9 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Keshavamurthy Anil S @ 2006-08-15 19:46 UTC (permalink / raw) To: linux-ia64 On Mon, Aug 14, 2006 at 05:24:57PM -0400, Bob Montgomery wrote: > On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote: > > This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. > > Contrary to expectations, my experience with this patch on a 2.6.18-rc4 > kernel is that kexec -l, kexec -e is now working without my adding any > delays to mptscsih, and the kexec -p, echo c >/proc/sysrq-trigger case > hangs. > > # cat /proc/cmdline > BOOT_IMAGE=scsi0:/EFI/debian/boot/vmlinuz-2.6.18-rc4-bobm root=/dev/sda4 > raid=noautodetect crashkernel\x128M@256M panic=1 ro Can you change crashkernelQ2M@256 and try kexec -p, echo c > /proc/sysrq-trigger case. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (6 preceding siblings ...) 2006-08-15 19:46 ` Keshavamurthy Anil S @ 2006-08-15 22:36 ` Zou Nan hai 2006-08-15 22:40 ` Zou Nan hai ` (8 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Zou Nan hai @ 2006-08-15 22:36 UTC (permalink / raw) To: linux-ia64 On Wed, 2006-08-16 at 03:15, Jay Lan wrote: > Zou Nan hai wrote: > > On Tue, 2006-08-15 at 09:56, Jay Lan wrote: > > > >>Bob Montgomery wrote: > >> > >>>On Mon, 2006-08-14 at 14:47 +0800, Zou Nan hai wrote: > >>> > >>> > >>>>This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. > >>> > >>> > > > > > WARNING: can't access > exec of init () failed!!!: No such file or directory > > Did you pass the correct kernel parameter to --append? It seems that root filesystem was not able to be mounted. > Regards, > - jay Thanks Zou Nan hai ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (7 preceding siblings ...) 2006-08-15 22:36 ` Zou Nan hai @ 2006-08-15 22:40 ` Zou Nan hai 2006-08-16 18:25 ` Bob Montgomery ` (7 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Zou Nan hai @ 2006-08-15 22:40 UTC (permalink / raw) To: linux-ia64 On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote: > On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote: > > > ... > > Jay, > > Thanks very much, please try the following updated patch which > > simplify the device_shootdown code. > > > > My system continues to hang with the new patch. I can get a printk just > before jumping to the new code in machine_kexec. We're going to try > hooking up the ITP now. > > Bob Montgomery If you are not seeing "I am in purgatory" in console, that probably means crash kernel segments and purgatory code was copied into some wrong physical address. Can you check the crashkernel="..." parameter Thanks Zou Nan hai ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (8 preceding siblings ...) 2006-08-15 22:40 ` Zou Nan hai @ 2006-08-16 18:25 ` Bob Montgomery 2006-08-16 22:34 ` Jay Lan ` (6 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Bob Montgomery @ 2006-08-16 18:25 UTC (permalink / raw) To: linux-ia64 On Wed, 2006-08-16 at 06:40 +0800, Zou Nan hai wrote: > On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote: > > On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote: > > If you are not seeing "I am in purgatory" in console, that probably > means crash kernel segments and purgatory code was copied into some > wrong physical address. > > Can you check the crashkernel="..." parameter > Thanks Today, we have had success by changing the configuration of our kernels from zx1 to tiger. Now we'll try to figure out what it is about the zx1 config parameters that causes the crash_kexec path to break. Bob Montgomery ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (9 preceding siblings ...) 2006-08-16 18:25 ` Bob Montgomery @ 2006-08-16 22:34 ` Jay Lan 2006-08-16 22:46 ` Jay Lan ` (5 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Jay Lan @ 2006-08-16 22:34 UTC (permalink / raw) To: linux-ia64 Zou Nan hai wrote: > On Wed, 2006-08-16 at 03:15, Jay Lan wrote: > >>Zou Nan hai wrote: >> > > Did you pass the correct kernel parameter to --append? > It seems that root filesystem was not able to be mounted. > I finally was able to boot up the crash dump kernel. Unfortunately the 'cp vmcore /var/tmp' crashed due to out of memory. :( The memory on the regular kernel showed: [root@holism tmp]# free total used free shared buffers cached Mem: 805312 443520 361792 0 36288 295936 -/+ buffers/cache: 111296 694016 Swap: 6143968 0 6143968 and the memory on the crash dump kernel showed: [root@holism tmp]# free total used free shared buffers cached Mem: 47776 45952 1824 0 1056 11856 -/+ buffers/cache: 33040 14736 Swap: 6143968 54720 6089248 It came down from 805312 k to 47776 k with only 1824 free. How much memory do i need to do a 'cp /proc/vmcore /var/tmp'? Thanks, - jay ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (10 preceding siblings ...) 2006-08-16 22:34 ` Jay Lan @ 2006-08-16 22:46 ` Jay Lan 2006-08-17 0:34 ` Jay Lan ` (4 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Jay Lan @ 2006-08-16 22:46 UTC (permalink / raw) To: linux-ia64 Bob Montgomery wrote: > On Wed, 2006-08-16 at 06:40 +0800, Zou Nan hai wrote: > >>On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote: >> >>>On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote: > > >> If you are not seeing "I am in purgatory" in console, that probably >>means crash kernel segments and purgatory code was copied into some >>wrong physical address. >> >> Can you check the crashkernel="..." parameter >> Thanks > > > Today, we have had success by changing the configuration of our kernels > from zx1 to tiger. Now we'll try to figure out what it is about the zx1 > config parameters that causes the crash_kexec path to break. I had problem with the zx1 defconfig on my zx6000 also. Since i recalled Horms said he was successful with tiger config so i switched. :) - jay > > Bob Montgomery > > - > To unsubscribe from this list: send the line "unsubscribe linux-ia64" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (11 preceding siblings ...) 2006-08-16 22:46 ` Jay Lan @ 2006-08-17 0:34 ` Jay Lan 2006-08-17 0:38 ` Jack Steiner ` (3 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Jay Lan @ 2006-08-17 0:34 UTC (permalink / raw) To: linux-ia64 Jay Lan wrote: > Zou Nan hai wrote: > >> On Wed, 2006-08-16 at 03:15, Jay Lan wrote: >> >>> Zou Nan hai wrote: >>> >> >> Did you pass the correct kernel parameter to --append? >> It seems that root filesystem was not able to be mounted. >> > > I finally was able to boot up the crash dump kernel. > Unfortunately the 'cp vmcore /var/tmp' crashed due to > out of memory. :( Incresing boot parameter from 128M@256M to 256M@256M fixed the problem. :) Thanks you, Nanhai! - jay > > ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (12 preceding siblings ...) 2006-08-17 0:34 ` Jay Lan @ 2006-08-17 0:38 ` Jack Steiner 2006-08-17 2:57 ` Horms ` (2 subsequent siblings) 16 siblings, 0 replies; 18+ messages in thread From: Jack Steiner @ 2006-08-17 0:38 UTC (permalink / raw) To: linux-ia64 On Wed, Aug 16, 2006 at 03:34:52PM -0700, Jay Lan wrote: > Zou Nan hai wrote: > >On Wed, 2006-08-16 at 03:15, Jay Lan wrote: > > > >>Zou Nan hai wrote: > >> > > > > Did you pass the correct kernel parameter to --append? > > It seems that root filesystem was not able to be mounted. > > > > I finally was able to boot up the crash dump kernel. > Unfortunately the 'cp vmcore /var/tmp' crashed due to > out of memory. :( Why did the crash occur? Was the disk full? Otherwise, the cached pages _should_ have been written to disk. Do you have a console log? > > The memory on the regular kernel showed: > [root@holism tmp]# free > total used free shared buffers cached > Mem: 805312 443520 361792 0 36288 295936 > -/+ buffers/cache: 111296 694016 > Swap: 6143968 0 6143968 > > and the memory on the crash dump kernel showed: > [root@holism tmp]# free > total used free shared buffers cached > Mem: 47776 45952 1824 0 1056 11856 > -/+ buffers/cache: 33040 14736 > Swap: 6143968 54720 6089248 > > > It came down from 805312 k to 47776 k with only 1824 free. > How much memory do i need to do a 'cp /proc/vmcore /var/tmp'? > > Thanks, > - jay > > > - > To unsubscribe from this list: send the line "unsubscribe linux-ia64" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Thanks Jack Steiner (steiner@sgi.com) 651-683-5302 Principal Engineer SGI - Silicon Graphics, Inc. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (13 preceding siblings ...) 2006-08-17 0:38 ` Jack Steiner @ 2006-08-17 2:57 ` Horms 2006-08-17 3:56 ` Zou Nan hai 2006-08-17 18:53 ` Jay Lan 16 siblings, 0 replies; 18+ messages in thread From: Horms @ 2006-08-17 2:57 UTC (permalink / raw) To: linux-ia64 On 14 Aug 2006 14:47:54 +0800, Zou Nan hai wrote: > This patch is the kexec-kdump patch re-based to 2.6.18-rc4 kernel. I will post incremental versions of these latest kexec patches, hopefully today. So anyone who is intrested, please be a little patient. -- Horms H: http://www.vergenet.net/~horms/ W: http://www.valinux.co.jp/en/ ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (14 preceding siblings ...) 2006-08-17 2:57 ` Horms @ 2006-08-17 3:56 ` Zou Nan hai 2006-08-17 18:53 ` Jay Lan 16 siblings, 0 replies; 18+ messages in thread From: Zou Nan hai @ 2006-08-17 3:56 UTC (permalink / raw) To: linux-ia64 On Thu, 2006-08-17 at 02:25, Bob Montgomery wrote: > On Wed, 2006-08-16 at 06:40 +0800, Zou Nan hai wrote: > > On Wed, 2006-08-16 at 01:39, Bob Montgomery wrote: > > > On Tue, 2006-08-15 at 08:47 +0800, Zou Nan hai wrote: > > > > > If you are not seeing "I am in purgatory" in console, that probably > > means crash kernel segments and purgatory code was copied into some > > wrong physical address. > > > > Can you check the crashkernel="..." parameter > > Thanks > > Today, we have had success by changing the configuration of our kernels > from zx1 to tiger. Now we'll try to figure out what it is about the zx1 > config parameters that causes the crash_kexec path to break. > > Bob Montgomery Hi Bob, Could you take a look at the ioc_iova_disable code in crash path? That piece of code is from HP. It will only execute if CONFIG_IA64_HP_ZX1 is defined. I don't have much knowledge of the I/O MMU stuff on HP machines.... Thanks Zou Nan hai ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: IA64 Kexec-Kdump kernel patch 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai ` (15 preceding siblings ...) 2006-08-17 3:56 ` Zou Nan hai @ 2006-08-17 18:53 ` Jay Lan 16 siblings, 0 replies; 18+ messages in thread From: Jay Lan @ 2006-08-17 18:53 UTC (permalink / raw) To: linux-ia64 Jack Steiner wrote: > On Wed, Aug 16, 2006 at 03:34:52PM -0700, Jay Lan wrote: > > > > Why did the crash occur? Was the disk full? Otherwise, the cached > pages _should_ have been written to disk. > > Do you have a console log? > Hi Jack, I reserved insufficient memory for the crash dump kernel. Once i increased from 128M to 256M, the problem went away. Thanks, - jay oom-killer: gfp_mask=0x200d2, order=0 Call Trace: [<a0000001000138e0>] show_stack+0x40/0xa0 spà00000015d57a40 bspà00000015d514a0 [<a000000100013970>] dump_stack+0x30/0x60 spà00000015d57c10 bspà00000015d51488 [<a0000001000eb000>] out_of_memory+0x60/0x3a0 spà00000015d57c10 bspà00000015d51448 [<a0000001000eeb50>] __alloc_pages+0x3d0/0x520 spà00000015d57c20 bspà00000015d513d0 [<a0000001000e65d0>] generic_file_buffered_write+0x310/0xd00 spà00000015d57c30 bspà00000015d512f0 [<a0000001000e7620>] __generic_file_aio_write_nolock+0x660/0x740 spà00000015d57cc0 bspà00000015d51280 [<a0000001000e77f0>] generic_file_aio_write+0xf0/0x200 spà00000015d57d30 bspà00000015d51220 [<a0000001002343c0>] ext3_file_write+0x60/0x200 spà00000015d57d40 bspà00000015d511e0 [<a00000010012e470>] do_sync_write+0x170/0x1e0 spà00000015d57d40 bspà00000015d511a0 [<a00000010012fb30>] vfs_write+0x1b0/0x340 spà00000015d57e20 bspà00000015d51150 [<a0000001001307b0>] sys_write+0x70/0xe0 spà00000015d57e20 bspà00000015d510d8 [<a00000010000c180>] ia64_ret_from_syscall+0x0/0x20 spà00000015d57e30 bspà00000015d510d8 [<a000000000010620>] __kernel_syscall_via_break+0x0/0x20 spà00000015d58000 bspà00000015d510d8 ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2006-08-17 18:53 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-08-14 6:47 IA64 Kexec-Kdump kernel patch Zou Nan hai 2006-08-14 21:24 ` Bob Montgomery 2006-08-15 0:47 ` Zou Nan hai 2006-08-15 1:56 ` Jay Lan 2006-08-15 17:39 ` Bob Montgomery 2006-08-15 19:15 ` Jay Lan 2006-08-15 19:31 ` Bob Montgomery 2006-08-15 19:46 ` Keshavamurthy Anil S 2006-08-15 22:36 ` Zou Nan hai 2006-08-15 22:40 ` Zou Nan hai 2006-08-16 18:25 ` Bob Montgomery 2006-08-16 22:34 ` Jay Lan 2006-08-16 22:46 ` Jay Lan 2006-08-17 0:34 ` Jay Lan 2006-08-17 0:38 ` Jack Steiner 2006-08-17 2:57 ` Horms 2006-08-17 3:56 ` Zou Nan hai 2006-08-17 18:53 ` Jay Lan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox