From: cpw <cpw@sgi.com>
Date: Tue, 3 Dec 2013 17:15:30 -0600
Subject: x86/UV: Fix NULL pointer dereference in uv_flush_tlb_others() if the
 'nobau' boot option is used
Git-commit: 3eae49ca8954f958b2001ab5643ef302cb7b67c7
Patch-mainline: v3.13-rc4
References: bsc#909092

The SGI UV tlb shootdown code panics the system with a NULL
pointer deference if 'nobau' is specified on the boot
commandline.

uv_flush_tlb_other() gets called for every flush, whether the
BAU is disabled or not.  It should not be keeping the s_enters
statistic while the BAU is disabled.

The panic occurs because during initialization
init_per_cpu_tunables() does not set the bcp->statp pointer if
'nobau' was specified.

Signed-off-by: Cliff Wickman <cpw@sgi.com>
Cc: <stable@vger.kernel.org> # 3.12.x
Link: http://lkml.kernel.org/r/E1VnzBi-0005yF-MU@eag09.americas.sgi.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Joerg Roedel <jroedel@suse.de>

--- linux-3.0-SLE11-SP3.orig/arch/x86/platform/uv/tlb_uv.c
+++ linux-3.0-SLE11-SP3/arch/x86/platform/uv/tlb_uv.c
@@ -1069,12 +1069,13 @@
 	unsigned long status;
 
 	bcp = &per_cpu(bau_control, cpu);
-	stat = bcp->statp;
-	stat->s_enters++;
 
 	if (bcp->nobau)
 		return cpumask;
 
+	stat = bcp->statp;
+	stat->s_enters++;
+
 	if (bcp->busy) {
 		descriptor_status =
 			read_lmmr(UVH_LB_BAU_SB_ACTIVATION_STATUS_0);
