Commit 2fe9a5c6 authored by Andrew Banman's avatar Andrew Banman Committed by Ingo Molnar
Browse files

x86/platform/uv/BAU: Disable BAU on single hub configurations



The BAU confers no benefit to a UV system running with only one hub/socket.
Permanently disable the BAU driver if there are less than two hubs online
to avoid BAU overhead. We have observed failed boots on single-socket UV4
systems caused by BAU that are avoided with this patch.

Also, while at it, consolidate initialization error blocks and fix a
memory leak.

Signed-off-by: default avatarAndrew Banman <abanman@hpe.com>
Acked-by: default avatarRuss Anderson <rja@hpe.com>
Acked-by: default avatarMike Travis <mike.travis@hpe.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: tony.ernst@hpe.com
Link: http://lkml.kernel.org/r/1500588351-78016-1-git-send-email-abanman@hpe.com


[ Minor cleanups. ]
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 0bc73048
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -2221,13 +2221,17 @@ static int __init uv_bau_init(void)
	else if (is_uv1_hub())
		ops = uv1_bau_ops;

	nuvhubs = uv_num_possible_blades();
	if (nuvhubs < 2) {
		pr_crit("UV: BAU disabled - insufficient hub count\n");
		goto err_bau_disable;
	}

	for_each_possible_cpu(cur_cpu) {
		mask = &per_cpu(uv_flush_tlb_mask, cur_cpu);
		zalloc_cpumask_var_node(mask, GFP_KERNEL, cpu_to_node(cur_cpu));
	}

	nuvhubs = uv_num_possible_blades();

	uv_base_pnode = 0x7fffffff;
	for (uvhub = 0; uvhub < nuvhubs; uvhub++) {
		cpus = uv_blade_nr_possible_cpus(uvhub);
@@ -2240,9 +2244,8 @@ static int __init uv_bau_init(void)
		enable_timeouts();

	if (init_per_cpu(nuvhubs, uv_base_pnode)) {
		set_bau_off();
		nobau_perm = 1;
		return 0;
		pr_crit("UV: BAU disabled - per CPU init failed\n");
		goto err_bau_disable;
	}

	vector = UV_BAU_MESSAGE;
@@ -2268,6 +2271,16 @@ static int __init uv_bau_init(void)
	}

	return 0;

err_bau_disable:

	for_each_possible_cpu(cur_cpu)
		free_cpumask_var(per_cpu(uv_flush_tlb_mask, cur_cpu));

	set_bau_off();
	nobau_perm = 1;

	return -EINVAL;
}
core_initcall(uv_bau_init);
fs_initcall(uv_ptc_init);