Commit c206d44f authored by Linus Torvalds's avatar Linus Torvalds

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
parents 83ae1700 1d6225e8
...@@ -33,5 +33,11 @@ extern void __show_regs(struct pt_regs *regs, int all); ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ static void uv_init_per_cpu(int nuvhubs) ...@@ -1566,11 +1570,9 @@ static void uv_init_per_cpu(int nuvhubs)
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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment