Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c206d44f authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -33,5 +33,11 @@ extern void __show_regs(struct pt_regs *regs, int all);
extern void show_regs(struct pt_regs *regs);
extern unsigned long oops_begin(void);
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 */
+4 −0
Original line number Diff line number Diff line
@@ -604,6 +604,10 @@ int uv_handle_nmi(struct notifier_block *self, unsigned long reason, void *data)
{
	if (reason != DIE_NMI_IPI)
		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
	 * to prevent intermixed output.
+3 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@
#include <asm/reboot.h>
#include <asm/virtext.h>

int in_crash_kexec;

#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)

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)
{
	in_crash_kexec = 1;
	nmi_shootdown_cpus(kdump_nmi_callback);

	disable_local_APIC();
+14 −12
Original line number Diff line number Diff line
@@ -1484,15 +1484,16 @@ calculate_destination_timeout(void)
/*
 * 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 cpu;
	int pnode;
	int uvhub;
	int have_hmaster;
	short socket = 0;
	unsigned short socket_mask;
	unsigned int uvhub_mask;
	unsigned char *uvhub_mask;
	struct bau_control *bcp;
	struct uvhub_desc *bdp;
	struct socket_desc *sdp;
@@ -1516,28 +1517,29 @@ static void uv_init_per_cpu(int nuvhubs)
	uvhub_descs = (struct uvhub_desc *)
		kmalloc(nuvhubs * sizeof(struct uvhub_desc), GFP_KERNEL);
	memset(uvhub_descs, 0, nuvhubs * sizeof(struct uvhub_desc));
	uvhub_mask = kzalloc((nuvhubs+7)/8, GFP_KERNEL);
	for_each_present_cpu(cpu) {
		bcp = &per_cpu(bau_control, cpu);
		memset(bcp, 0, sizeof(struct bau_control));
		pnode = uv_cpu_hub_info(cpu)->pnode;
		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->num_cpus++;
		bdp->uvhub = uvhub;
		bdp->pnode = pnode;
		/* kludge: 'assuming' one node per socket, and assuming that
		   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);
		sdp = &bdp->socket[socket];
		sdp->cpu_number[sdp->num_cpus] = cpu;
		sdp->num_cpus++;
	}
	uvhub = 0;
	while (uvhub_mask) {
		if (!(uvhub_mask & 1))
			goto nexthub;
	for (uvhub = 0; uvhub < nuvhubs; uvhub++) {
		if (!(*(uvhub_mask + (uvhub/8)) & (1 << (uvhub%8))))
			continue;
		have_hmaster = 0;
		bdp = &uvhub_descs[uvhub];
		socket_mask = bdp->socket_mask;
		socket = 0;
@@ -1551,9 +1553,11 @@ static void uv_init_per_cpu(int nuvhubs)
				bcp->cpu = cpu;
				if (i == 0) {
					smaster = bcp;
					if (socket == 0)
					if (!have_hmaster) {
						have_hmaster++;
						hmaster = bcp;
					}
				}
				bcp->cpus_in_uvhub = bdp->num_cpus;
				bcp->cpus_in_socket = sdp->num_cpus;
				bcp->socket_master = smaster;
@@ -1566,11 +1570,9 @@ nextsocket:
			socket++;
			socket_mask = (socket_mask >> 1);
		}
nexthub:
		uvhub++;
		uvhub_mask = (uvhub_mask >> 1);
	}
	kfree(uvhub_descs);
	kfree(uvhub_mask);
	for_each_present_cpu(cpu) {
		bcp = &per_cpu(bau_control, cpu);
		bcp->baudisabled = 0;