mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-05-24 10:39:52 +00:00
Merge branch 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, UV: Make kdump avoid stack dumps - fix !CONFIG_KEXEC breakage x86, UV: Initialize BAU hub map x86, UV: Make kdump avoid stack dumps
This commit is contained in:
commit
c206d44ffd
4 changed files with 27 additions and 12 deletions
|
@ -33,5 +33,11 @@ extern void __show_regs(struct pt_regs *regs, int all);
|
||||||
extern void show_regs(struct pt_regs *regs);
|
extern void show_regs(struct pt_regs *regs);
|
||||||
extern unsigned long oops_begin(void);
|
extern unsigned long oops_begin(void);
|
||||||
extern void oops_end(unsigned long, struct pt_regs *, int signr);
|
extern void oops_end(unsigned long, struct pt_regs *, int signr);
|
||||||
|
#ifdef CONFIG_KEXEC
|
||||||
|
extern int in_crash_kexec;
|
||||||
|
#else
|
||||||
|
/* no crash dump is ever in progress if no crash kernel can be kexec'd */
|
||||||
|
#define in_crash_kexec 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_X86_KDEBUG_H */
|
#endif /* _ASM_X86_KDEBUG_H */
|
||||||
|
|
|
@ -604,6 +604,10 @@ int uv_handle_nmi(struct notifier_block *self, unsigned long reason, void *data)
|
||||||
{
|
{
|
||||||
if (reason != DIE_NMI_IPI)
|
if (reason != DIE_NMI_IPI)
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
|
||||||
|
if (in_crash_kexec)
|
||||||
|
/* do nothing if entering the crash kernel */
|
||||||
|
return NOTIFY_OK;
|
||||||
/*
|
/*
|
||||||
* Use a lock so only one cpu prints at a time
|
* Use a lock so only one cpu prints at a time
|
||||||
* to prevent intermixed output.
|
* to prevent intermixed output.
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/virtext.h>
|
#include <asm/virtext.h>
|
||||||
|
|
||||||
|
int in_crash_kexec;
|
||||||
|
|
||||||
#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
|
#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
|
||||||
|
|
||||||
static void kdump_nmi_callback(int cpu, struct die_args *args)
|
static void kdump_nmi_callback(int cpu, struct die_args *args)
|
||||||
|
@ -61,6 +63,7 @@ static void kdump_nmi_callback(int cpu, struct die_args *args)
|
||||||
|
|
||||||
static void kdump_nmi_shootdown_cpus(void)
|
static void kdump_nmi_shootdown_cpus(void)
|
||||||
{
|
{
|
||||||
|
in_crash_kexec = 1;
|
||||||
nmi_shootdown_cpus(kdump_nmi_callback);
|
nmi_shootdown_cpus(kdump_nmi_callback);
|
||||||
|
|
||||||
disable_local_APIC();
|
disable_local_APIC();
|
||||||
|
|
|
@ -1484,15 +1484,16 @@ calculate_destination_timeout(void)
|
||||||
/*
|
/*
|
||||||
* initialize the bau_control structure for each cpu
|
* initialize the bau_control structure for each cpu
|
||||||
*/
|
*/
|
||||||
static void uv_init_per_cpu(int nuvhubs)
|
static void __init uv_init_per_cpu(int nuvhubs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int cpu;
|
int cpu;
|
||||||
int pnode;
|
int pnode;
|
||||||
int uvhub;
|
int uvhub;
|
||||||
|
int have_hmaster;
|
||||||
short socket = 0;
|
short socket = 0;
|
||||||
unsigned short socket_mask;
|
unsigned short socket_mask;
|
||||||
unsigned int uvhub_mask;
|
unsigned char *uvhub_mask;
|
||||||
struct bau_control *bcp;
|
struct bau_control *bcp;
|
||||||
struct uvhub_desc *bdp;
|
struct uvhub_desc *bdp;
|
||||||
struct socket_desc *sdp;
|
struct socket_desc *sdp;
|
||||||
|
@ -1516,28 +1517,29 @@ static void uv_init_per_cpu(int nuvhubs)
|
||||||
uvhub_descs = (struct uvhub_desc *)
|
uvhub_descs = (struct uvhub_desc *)
|
||||||
kmalloc(nuvhubs * sizeof(struct uvhub_desc), GFP_KERNEL);
|
kmalloc(nuvhubs * sizeof(struct uvhub_desc), GFP_KERNEL);
|
||||||
memset(uvhub_descs, 0, nuvhubs * sizeof(struct uvhub_desc));
|
memset(uvhub_descs, 0, nuvhubs * sizeof(struct uvhub_desc));
|
||||||
|
uvhub_mask = kzalloc((nuvhubs+7)/8, GFP_KERNEL);
|
||||||
for_each_present_cpu(cpu) {
|
for_each_present_cpu(cpu) {
|
||||||
bcp = &per_cpu(bau_control, cpu);
|
bcp = &per_cpu(bau_control, cpu);
|
||||||
memset(bcp, 0, sizeof(struct bau_control));
|
memset(bcp, 0, sizeof(struct bau_control));
|
||||||
pnode = uv_cpu_hub_info(cpu)->pnode;
|
pnode = uv_cpu_hub_info(cpu)->pnode;
|
||||||
uvhub = uv_cpu_hub_info(cpu)->numa_blade_id;
|
uvhub = uv_cpu_hub_info(cpu)->numa_blade_id;
|
||||||
uvhub_mask |= (1 << uvhub);
|
*(uvhub_mask + (uvhub/8)) |= (1 << (uvhub%8));
|
||||||
bdp = &uvhub_descs[uvhub];
|
bdp = &uvhub_descs[uvhub];
|
||||||
bdp->num_cpus++;
|
bdp->num_cpus++;
|
||||||
bdp->uvhub = uvhub;
|
bdp->uvhub = uvhub;
|
||||||
bdp->pnode = pnode;
|
bdp->pnode = pnode;
|
||||||
/* kludge: 'assuming' one node per socket, and assuming that
|
/* kludge: 'assuming' one node per socket, and assuming that
|
||||||
disabling a socket just leaves a gap in node numbers */
|
disabling a socket just leaves a gap in node numbers */
|
||||||
socket = (cpu_to_node(cpu) & 1);;
|
socket = (cpu_to_node(cpu) & 1);
|
||||||
bdp->socket_mask |= (1 << socket);
|
bdp->socket_mask |= (1 << socket);
|
||||||
sdp = &bdp->socket[socket];
|
sdp = &bdp->socket[socket];
|
||||||
sdp->cpu_number[sdp->num_cpus] = cpu;
|
sdp->cpu_number[sdp->num_cpus] = cpu;
|
||||||
sdp->num_cpus++;
|
sdp->num_cpus++;
|
||||||
}
|
}
|
||||||
uvhub = 0;
|
for (uvhub = 0; uvhub < nuvhubs; uvhub++) {
|
||||||
while (uvhub_mask) {
|
if (!(*(uvhub_mask + (uvhub/8)) & (1 << (uvhub%8))))
|
||||||
if (!(uvhub_mask & 1))
|
continue;
|
||||||
goto nexthub;
|
have_hmaster = 0;
|
||||||
bdp = &uvhub_descs[uvhub];
|
bdp = &uvhub_descs[uvhub];
|
||||||
socket_mask = bdp->socket_mask;
|
socket_mask = bdp->socket_mask;
|
||||||
socket = 0;
|
socket = 0;
|
||||||
|
@ -1551,8 +1553,10 @@ static void uv_init_per_cpu(int nuvhubs)
|
||||||
bcp->cpu = cpu;
|
bcp->cpu = cpu;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
smaster = bcp;
|
smaster = bcp;
|
||||||
if (socket == 0)
|
if (!have_hmaster) {
|
||||||
|
have_hmaster++;
|
||||||
hmaster = bcp;
|
hmaster = bcp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bcp->cpus_in_uvhub = bdp->num_cpus;
|
bcp->cpus_in_uvhub = bdp->num_cpus;
|
||||||
bcp->cpus_in_socket = sdp->num_cpus;
|
bcp->cpus_in_socket = sdp->num_cpus;
|
||||||
|
@ -1566,11 +1570,9 @@ nextsocket:
|
||||||
socket++;
|
socket++;
|
||||||
socket_mask = (socket_mask >> 1);
|
socket_mask = (socket_mask >> 1);
|
||||||
}
|
}
|
||||||
nexthub:
|
|
||||||
uvhub++;
|
|
||||||
uvhub_mask = (uvhub_mask >> 1);
|
|
||||||
}
|
}
|
||||||
kfree(uvhub_descs);
|
kfree(uvhub_descs);
|
||||||
|
kfree(uvhub_mask);
|
||||||
for_each_present_cpu(cpu) {
|
for_each_present_cpu(cpu) {
|
||||||
bcp = &per_cpu(bau_control, cpu);
|
bcp = &per_cpu(bau_control, cpu);
|
||||||
bcp->baudisabled = 0;
|
bcp->baudisabled = 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue