summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gibson <dwg@au1.ibm.com>2005-08-31 14:34:05 +1000
committerLinus Torvalds <torvalds@evo.osdl.org>2005-09-01 10:48:20 -0700
commit319e76a1ae835c34a2838c2bfebe3db4d5a6b387 (patch)
tree7e4ce062242df4690c6711ae1274d76e8ef5fce9
parent7eaa414ee86cda4c153002ed218b9a0ad17f7de1 (diff)
downloadkernel-common-319e76a1ae835c34a2838c2bfebe3db4d5a6b387.tar.gz
kernel-common-319e76a1ae835c34a2838c2bfebe3db4d5a6b387.tar.bz2
kernel-common-319e76a1ae835c34a2838c2bfebe3db4d5a6b387.zip
[PATCH] Fix bug in ppc64 dynamic hugepage support
In adjusting the logic for SLB miss for the dynamic hugepage stuff, I messed up the !CONFIG_HUGETLB_PAGE case, failing to set the SLB flags properly. This fixes it. It also streamlines the logic for the HUGETLB_PAGE case (removing a couple of branches) while we're at it. Booted, and roughly tested on POWER5 (with and without HUGETLB_PAGE), iSeries/RS64 (no hugepage available), and G5 (with and without HUGETLB_PAGE). Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/ppc64/mm/slb_low.S22
1 files changed, 9 insertions, 13 deletions
diff --git a/arch/ppc64/mm/slb_low.S b/arch/ppc64/mm/slb_low.S
index bab255889c58..698d6b9ed6d1 100644
--- a/arch/ppc64/mm/slb_low.S
+++ b/arch/ppc64/mm/slb_low.S
@@ -97,25 +97,21 @@ BEGIN_FTR_SECTION
lhz r9,PACAHIGHHTLBAREAS(r13)
srdi r11,r3,(HTLB_AREA_SHIFT-SID_SHIFT)
srd r9,r9,r11
- andi. r9,r9,1
- bne 5f
+ lhz r11,PACALOWHTLBAREAS(r13)
+ srd r11,r11,r3
+ or r9,r9,r11
+END_FTR_SECTION_IFSET(CPU_FTR_16M_PAGE)
+#endif /* CONFIG_HUGETLB_PAGE */
li r11,SLB_VSID_USER
- cmpldi r3,16
- bge 6f
-
- lhz r9,PACALOWHTLBAREAS(r13)
- srd r9,r9,r3
- andi. r9,r9,1
-
- beq 6f
-
-5: li r11,SLB_VSID_USER|SLB_VSID_L
+#ifdef CONFIG_HUGETLB_PAGE
+BEGIN_FTR_SECTION
+ rldimi r11,r9,8,55 /* shift masked bit into SLB_VSID_L */
END_FTR_SECTION_IFSET(CPU_FTR_16M_PAGE)
#endif /* CONFIG_HUGETLB_PAGE */
-6: ld r9,PACACONTEXTID(r13)
+ ld r9,PACACONTEXTID(r13)
rldimi r3,r9,USER_ESID_BITS,0
9: /* r3 = protovsid, r11 = flags, r10 = esid_data, cr7 = <>KERNELBASE */