93dae5b70e
When a cpu really is stuck in the kernel, it can be often impossible to figure out which cpu is stuck where. The worst case is when the stuck cpu has interrupts disabled. Therefore, implement a global cpu state capture that uses SMP message interrupts which are not disabled by the normal IRQ enable/disable APIs of the kernel. As long as we can get a sysrq 'y' to the kernel, we can get a dump. Even if the console interrupt cpu is wedged, we can trigger it from userspace using /proc/sysrq-trigger The output is made compact so that this facility is more useful on high cpu count systems, which is where this facility will likely find itself the most useful :) Signed-off-by: David S. Miller <davem@davemloft.net>
64 lines
1.2 KiB
C
64 lines
1.2 KiB
C
/* smp.h: Sparc64 specific SMP stuff.
|
|
*
|
|
* Copyright (C) 1996, 2008 David S. Miller (davem@davemloft.net)
|
|
*/
|
|
|
|
#ifndef _SPARC64_SMP_H
|
|
#define _SPARC64_SMP_H
|
|
|
|
#include <linux/threads.h>
|
|
#include <asm/asi.h>
|
|
#include <asm/starfire.h>
|
|
#include <asm/spitfire.h>
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <linux/cpumask.h>
|
|
#include <linux/cache.h>
|
|
|
|
#endif /* !(__ASSEMBLY__) */
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
/*
|
|
* Private routines/data
|
|
*/
|
|
|
|
#include <linux/bitops.h>
|
|
#include <asm/atomic.h>
|
|
#include <asm/percpu.h>
|
|
|
|
DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
|
|
extern cpumask_t cpu_core_map[NR_CPUS];
|
|
extern int sparc64_multi_core;
|
|
|
|
/*
|
|
* General functions that each host system must provide.
|
|
*/
|
|
|
|
extern int hard_smp_processor_id(void);
|
|
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
|
|
|
extern void smp_fill_in_sib_core_maps(void);
|
|
extern void cpu_play_dead(void);
|
|
|
|
extern void smp_fetch_global_regs(void);
|
|
|
|
#ifdef CONFIG_HOTPLUG_CPU
|
|
extern int __cpu_disable(void);
|
|
extern void __cpu_die(unsigned int cpu);
|
|
#endif
|
|
|
|
#endif /* !(__ASSEMBLY__) */
|
|
|
|
#else
|
|
|
|
#define hard_smp_processor_id() 0
|
|
#define smp_fill_in_sib_core_maps() do { } while (0)
|
|
#define smp_fetch_global_regs() do { } while (0)
|
|
|
|
#endif /* !(CONFIG_SMP) */
|
|
|
|
#endif /* !(_SPARC64_SMP_H) */
|