]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/3.16.3/powerpc-thp-don-t-recompute-vsid-and-ssize-in-loop-on-invalidate.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 3.16.3 / powerpc-thp-don-t-recompute-vsid-and-ssize-in-loop-on-invalidate.patch
CommitLineData
38b7da6f
GKH
1From fa1f8ae80f8bb996594167ff4750a0b0a5a5bb5d Mon Sep 17 00:00:00 2001
2From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
3Date: Wed, 13 Aug 2014 12:31:58 +0530
4Subject: powerpc/thp: Don't recompute vsid and ssize in loop on invalidate
5
6From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
7
8commit fa1f8ae80f8bb996594167ff4750a0b0a5a5bb5d upstream.
9
10The segment identifier and segment size will remain the same in
11the loop, So we can compute it outside. We also change the
12hugepage_invalidate interface so that we can use it the later patch
13
14Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
15Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
16Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
17
18---
19 arch/powerpc/include/asm/machdep.h | 6 +++---
20 arch/powerpc/mm/hash_native_64.c | 19 +++++--------------
21 arch/powerpc/mm/pgtable_64.c | 24 ++++++++++++------------
22 arch/powerpc/platforms/pseries/lpar.c | 20 ++++++--------------
23 4 files changed, 26 insertions(+), 43 deletions(-)
24
25--- a/arch/powerpc/include/asm/machdep.h
26+++ b/arch/powerpc/include/asm/machdep.h
27@@ -57,10 +57,10 @@ struct machdep_calls {
28 void (*hpte_removebolted)(unsigned long ea,
29 int psize, int ssize);
30 void (*flush_hash_range)(unsigned long number, int local);
31- void (*hugepage_invalidate)(struct mm_struct *mm,
32+ void (*hugepage_invalidate)(unsigned long vsid,
33+ unsigned long addr,
34 unsigned char *hpte_slot_array,
35- unsigned long addr, int psize);
36-
37+ int psize, int ssize);
38 /* special for kexec, to be called in real mode, linear mapping is
39 * destroyed as well */
40 void (*hpte_clear_all)(void);
41--- a/arch/powerpc/mm/hash_native_64.c
42+++ b/arch/powerpc/mm/hash_native_64.c
43@@ -412,18 +412,18 @@ static void native_hpte_invalidate(unsig
44 local_irq_restore(flags);
45 }
46
47-static void native_hugepage_invalidate(struct mm_struct *mm,
48+static void native_hugepage_invalidate(unsigned long vsid,
49+ unsigned long addr,
50 unsigned char *hpte_slot_array,
51- unsigned long addr, int psize)
52+ int psize, int ssize)
53 {
54- int ssize = 0, i;
55- int lock_tlbie;
56+ int i, lock_tlbie;
57 struct hash_pte *hptep;
58 int actual_psize = MMU_PAGE_16M;
59 unsigned int max_hpte_count, valid;
60 unsigned long flags, s_addr = addr;
61 unsigned long hpte_v, want_v, shift;
62- unsigned long hidx, vpn = 0, vsid, hash, slot;
63+ unsigned long hidx, vpn = 0, hash, slot;
64
65 shift = mmu_psize_defs[psize].shift;
66 max_hpte_count = 1U << (PMD_SHIFT - shift);
67@@ -437,15 +437,6 @@ static void native_hugepage_invalidate(s
68
69 /* get the vpn */
70 addr = s_addr + (i * (1ul << shift));
71- if (!is_kernel_addr(addr)) {
72- ssize = user_segment_size(addr);
73- vsid = get_vsid(mm->context.id, addr, ssize);
74- WARN_ON(vsid == 0);
75- } else {
76- vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
77- ssize = mmu_kernel_ssize;
78- }
79-
80 vpn = hpt_vpn(addr, vsid, ssize);
81 hash = hpt_hash(vpn, shift, ssize);
82 if (hidx & _PTEIDX_SECONDARY)
83--- a/arch/powerpc/mm/pgtable_64.c
84+++ b/arch/powerpc/mm/pgtable_64.c
85@@ -745,12 +745,21 @@ void hpte_do_hugepage_flush(struct mm_st
86 if (!hpte_slot_array)
87 return;
88
89- /* get the base page size */
90+ /* get the base page size,vsid and segment size */
91 psize = get_slice_psize(mm, s_addr);
92+ if (!is_kernel_addr(s_addr)) {
93+ ssize = user_segment_size(s_addr);
94+ vsid = get_vsid(mm->context.id, s_addr, ssize);
95+ WARN_ON(vsid == 0);
96+ } else {
97+ vsid = get_kernel_vsid(s_addr, mmu_kernel_ssize);
98+ ssize = mmu_kernel_ssize;
99+ }
100
101 if (ppc_md.hugepage_invalidate)
102- return ppc_md.hugepage_invalidate(mm, hpte_slot_array,
103- s_addr, psize);
104+ return ppc_md.hugepage_invalidate(vsid, s_addr,
105+ hpte_slot_array,
106+ psize, ssize);
107 /*
108 * No bluk hpte removal support, invalidate each entry
109 */
110@@ -768,15 +777,6 @@ void hpte_do_hugepage_flush(struct mm_st
111
112 /* get the vpn */
113 addr = s_addr + (i * (1ul << shift));
114- if (!is_kernel_addr(addr)) {
115- ssize = user_segment_size(addr);
116- vsid = get_vsid(mm->context.id, addr, ssize);
117- WARN_ON(vsid == 0);
118- } else {
119- vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
120- ssize = mmu_kernel_ssize;
121- }
122-
123 vpn = hpt_vpn(addr, vsid, ssize);
124 hash = hpt_hash(vpn, shift, ssize);
125 if (hidx & _PTEIDX_SECONDARY)
126--- a/arch/powerpc/platforms/pseries/lpar.c
127+++ b/arch/powerpc/platforms/pseries/lpar.c
128@@ -430,16 +430,17 @@ static void __pSeries_lpar_hugepage_inva
129 spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags);
130 }
131
132-static void pSeries_lpar_hugepage_invalidate(struct mm_struct *mm,
133- unsigned char *hpte_slot_array,
134- unsigned long addr, int psize)
135+static void pSeries_lpar_hugepage_invalidate(unsigned long vsid,
136+ unsigned long addr,
137+ unsigned char *hpte_slot_array,
138+ int psize, int ssize)
139 {
140- int ssize = 0, i, index = 0;
141+ int i, index = 0;
142 unsigned long s_addr = addr;
143 unsigned int max_hpte_count, valid;
144 unsigned long vpn_array[PPC64_HUGE_HPTE_BATCH];
145 unsigned long slot_array[PPC64_HUGE_HPTE_BATCH];
146- unsigned long shift, hidx, vpn = 0, vsid, hash, slot;
147+ unsigned long shift, hidx, vpn = 0, hash, slot;
148
149 shift = mmu_psize_defs[psize].shift;
150 max_hpte_count = 1U << (PMD_SHIFT - shift);
151@@ -452,15 +453,6 @@ static void pSeries_lpar_hugepage_invali
152
153 /* get the vpn */
154 addr = s_addr + (i * (1ul << shift));
155- if (!is_kernel_addr(addr)) {
156- ssize = user_segment_size(addr);
157- vsid = get_vsid(mm->context.id, addr, ssize);
158- WARN_ON(vsid == 0);
159- } else {
160- vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
161- ssize = mmu_kernel_ssize;
162- }
163-
164 vpn = hpt_vpn(addr, vsid, ssize);
165 hash = hpt_hash(vpn, shift, ssize);
166 if (hidx & _PTEIDX_SECONDARY)