aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Wolf <mjw@linux.vnet.ibm.com>2013-04-05 10:41:40 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-04-12 09:18:09 -0700
commit8a7adba6f5b486e00f03d88d185a25ec4c1b6175 (patch)
tree1c3552ba922e96c26f944d91b608a67c15ce055a
parentd510800edaf1e0e48f8778114682a1586fc9aaa9 (diff)
downloadkernel_samsung_smdk4412-8a7adba6f5b486e00f03d88d185a25ec4c1b6175.zip
kernel_samsung_smdk4412-8a7adba6f5b486e00f03d88d185a25ec4c1b6175.tar.gz
kernel_samsung_smdk4412-8a7adba6f5b486e00f03d88d185a25ec4c1b6175.tar.bz2
powerpc: pSeries_lpar_hpte_remove fails from Adjunct partition being performed before the ANDCOND test
commit 9fb2640159f9d4f5a2a9d60e490482d4cbecafdb upstream. Some versions of pHyp will perform the adjunct partition test before the ANDCOND test. The result of this is that H_RESOURCE can be returned and cause the BUG_ON condition to occur. The HPTE is not removed. So add a check for H_RESOURCE, it is ok if this HPTE is not removed as pSeries_lpar_hpte_remove is looking for an HPTE to remove and not a specific HPTE to remove. So it is ok to just move on to the next slot and try again. Signed-off-by: Michael Wolf <mjw@linux.vnet.ibm.com> Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--arch/powerpc/platforms/pseries/lpar.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
index 81e30d9..2e0b2a7 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -377,7 +377,13 @@ static long pSeries_lpar_hpte_remove(unsigned long hpte_group)
(0x1UL << 4), &dummy1, &dummy2);
if (lpar_rc == H_SUCCESS)
return i;
- BUG_ON(lpar_rc != H_NOT_FOUND);
+
+ /*
+ * The test for adjunct partition is performed before the
+ * ANDCOND test. H_RESOURCE may be returned, so we need to
+ * check for that as well.
+ */
+ BUG_ON(lpar_rc != H_NOT_FOUND && lpar_rc != H_RESOURCE);
slot_offset++;
slot_offset &= 0x7;