From cdbb758564db65e551034e74a6acd8c41215b66d Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 4 Feb 2013 06:19:48 -0800 Subject: [PATCH] 3.7-stable patches added patches: powerpc-mm-fix-hash-computation-function.patch --- ...rpc-mm-fix-hash-computation-function.patch | 143 ++++++++++++++++++ queue-3.7/series | 1 + 2 files changed, 144 insertions(+) create mode 100644 queue-3.7/powerpc-mm-fix-hash-computation-function.patch create mode 100644 queue-3.7/series diff --git a/queue-3.7/powerpc-mm-fix-hash-computation-function.patch b/queue-3.7/powerpc-mm-fix-hash-computation-function.patch new file mode 100644 index 00000000000..1475a1e1326 --- /dev/null +++ b/queue-3.7/powerpc-mm-fix-hash-computation-function.patch @@ -0,0 +1,143 @@ +From eda8eebdd153c48a4e2a3a3ac3cd9e2e31f5c6b3 Mon Sep 17 00:00:00 2001 +From: "Aneesh Kumar K.V" +Date: Tue, 29 Jan 2013 19:40:42 +0000 +Subject: powerpc/mm: Fix hash computation function + +From: "Aneesh Kumar K.V" + +commit eda8eebdd153c48a4e2a3a3ac3cd9e2e31f5c6b3 upstream. + +The ASM version of hash computation function was truncating the upper bit. +Make the ASM version similar to hpt_hash function. Remove masking vsid bits. +Without this patch, we observed hang during bootup due to not satisfying page +fault request correctly. The fault handler used wrong hash values to update +the HPTE. Hence we kept looping with page fault. + +hash_page(ea=000001003e260008, access=203, trap=300 ip=3fff91787134 dsisr 42000000 +The computed value of hash 000000000f22f390 +update: avpnv=4003e46054003e00, hash=000000000722f390, f=80000006, psize: 2 ... + +BenH: The over-masking has been there for ever but only hurts with the +new 64T support introduced in 3.7 + +Reported-by: Mike Qiu +Signed-off-by: Aneesh Kumar K.V +Tested-by: Mike Qiu +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/mm/hash_low_64.S | 62 +++++++++++++++++++++++------------------- + 1 file changed, 35 insertions(+), 27 deletions(-) + +--- a/arch/powerpc/mm/hash_low_64.S ++++ b/arch/powerpc/mm/hash_low_64.S +@@ -115,11 +115,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEG + sldi r29,r5,SID_SHIFT - VPN_SHIFT + rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) + or r29,r28,r29 +- +- /* Calculate hash value for primary slot and store it in r28 */ +- rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ +- rldicl r0,r3,64-12,48 /* (ea >> 12) & 0xffff */ +- xor r28,r5,r0 ++ /* ++ * Calculate hash value for primary slot and store it in r28 ++ * r3 = va, r5 = vsid ++ * r0 = (va >> 12) & ((1ul << (28 - 12)) -1) ++ */ ++ rldicl r0,r3,64-12,48 ++ xor r28,r5,r0 /* hash */ + b 4f + + 3: /* Calc vpn and put it in r29 */ +@@ -130,11 +132,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEG + /* + * calculate hash value for primary slot and + * store it in r28 for 1T segment ++ * r3 = va, r5 = vsid + */ +- rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ +- clrldi r5,r5,40 /* vsid & 0xffffff */ +- rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ +- xor r28,r28,r5 ++ sldi r28,r5,25 /* vsid << 25 */ ++ /* r0 = (va >> 12) & ((1ul << (40 - 12)) -1) */ ++ rldicl r0,r3,64-12,36 ++ xor r28,r28,r5 /* vsid ^ ( vsid << 25) */ + xor r28,r28,r0 /* hash */ + + /* Convert linux PTE bits into HW equivalents */ +@@ -407,11 +410,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEG + */ + rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) + or r29,r28,r29 +- +- /* Calculate hash value for primary slot and store it in r28 */ +- rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ +- rldicl r0,r3,64-12,48 /* (ea >> 12) & 0xffff */ +- xor r28,r5,r0 ++ /* ++ * Calculate hash value for primary slot and store it in r28 ++ * r3 = va, r5 = vsid ++ * r0 = (va >> 12) & ((1ul << (28 - 12)) -1) ++ */ ++ rldicl r0,r3,64-12,48 ++ xor r28,r5,r0 /* hash */ + b 4f + + 3: /* Calc vpn and put it in r29 */ +@@ -426,11 +431,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEG + /* + * Calculate hash value for primary slot and + * store it in r28 for 1T segment ++ * r3 = va, r5 = vsid + */ +- rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ +- clrldi r5,r5,40 /* vsid & 0xffffff */ +- rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ +- xor r28,r28,r5 ++ sldi r28,r5,25 /* vsid << 25 */ ++ /* r0 = (va >> 12) & ((1ul << (40 - 12)) -1) */ ++ rldicl r0,r3,64-12,36 ++ xor r28,r28,r5 /* vsid ^ ( vsid << 25) */ + xor r28,r28,r0 /* hash */ + + /* Convert linux PTE bits into HW equivalents */ +@@ -752,25 +758,27 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEG + rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) + or r29,r28,r29 + +- /* Calculate hash value for primary slot and store it in r28 */ +- rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ +- rldicl r0,r3,64-16,52 /* (ea >> 16) & 0xfff */ +- xor r28,r5,r0 ++ /* Calculate hash value for primary slot and store it in r28 ++ * r3 = va, r5 = vsid ++ * r0 = (va >> 16) & ((1ul << (28 - 16)) -1) ++ */ ++ rldicl r0,r3,64-16,52 ++ xor r28,r5,r0 /* hash */ + b 4f + + 3: /* Calc vpn and put it in r29 */ + sldi r29,r5,SID_SHIFT_1T - VPN_SHIFT + rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT_1T - VPN_SHIFT) + or r29,r28,r29 +- + /* + * calculate hash value for primary slot and + * store it in r28 for 1T segment ++ * r3 = va, r5 = vsid + */ +- rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ +- clrldi r5,r5,40 /* vsid & 0xffffff */ +- rldicl r0,r3,64-16,40 /* (ea >> 16) & 0xffffff */ +- xor r28,r28,r5 ++ sldi r28,r5,25 /* vsid << 25 */ ++ /* r0 = (va >> 16) & ((1ul << (40 - 16)) -1) */ ++ rldicl r0,r3,64-16,40 ++ xor r28,r28,r5 /* vsid ^ ( vsid << 25) */ + xor r28,r28,r0 /* hash */ + + /* Convert linux PTE bits into HW equivalents */ diff --git a/queue-3.7/series b/queue-3.7/series new file mode 100644 index 00000000000..ea1bd21936e --- /dev/null +++ b/queue-3.7/series @@ -0,0 +1 @@ +powerpc-mm-fix-hash-computation-function.patch -- 2.47.3