]>
Commit | Line | Data |
---|---|---|
38b7da6f GKH |
1 | From fa1f8ae80f8bb996594167ff4750a0b0a5a5bb5d Mon Sep 17 00:00:00 2001 |
2 | From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> | |
3 | Date: Wed, 13 Aug 2014 12:31:58 +0530 | |
4 | Subject: powerpc/thp: Don't recompute vsid and ssize in loop on invalidate | |
5 | ||
6 | From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> | |
7 | ||
8 | commit fa1f8ae80f8bb996594167ff4750a0b0a5a5bb5d upstream. | |
9 | ||
10 | The segment identifier and segment size will remain the same in | |
11 | the loop, So we can compute it outside. We also change the | |
12 | hugepage_invalidate interface so that we can use it the later patch | |
13 | ||
14 | Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | |
15 | Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> | |
16 | Signed-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) |