Skip to content

Commit cf8771c

Browse files
tobias-huschleVasily Gorbik
authored andcommitted
mm/page_table_check: Pass mm_struct to pxx_user_accessible_page()
Unlike other architectures, s390 does not have means to distinguish kernel vs user page table entries - neither an entry itself, nor the address could be used for that. It is only the mm_struct that indicates whether an entry in question is mapped to a user space. So pass mm_struct to pxx_user_accessible_page() callbacks. [agordeev@linux.ibm.com: rephrased commit message, removed braces] Acked-by: Madhavan Srinivasan <maddy@linux.ibm.com> Reviewed-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com> Reviewed-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com> #powerpc Signed-off-by: Tobias Huschle <huschle@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> Link: https://lore.kernel.org/r/ca77f3489453c2fe01b25e50e53b778929e0dfc5.1772812343.git.agordeev@linux.ibm.com Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
1 parent 11439c4 commit cf8771c

8 files changed

Lines changed: 24 additions & 27 deletions

File tree

arch/arm64/include/asm/pgtable.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,17 +1263,17 @@ static inline int pmdp_set_access_flags(struct vm_area_struct *vma,
12631263
#endif
12641264

12651265
#ifdef CONFIG_PAGE_TABLE_CHECK
1266-
static inline bool pte_user_accessible_page(pte_t pte, unsigned long addr)
1266+
static inline bool pte_user_accessible_page(struct mm_struct *mm, unsigned long addr, pte_t pte)
12671267
{
12681268
return pte_valid(pte) && (pte_user(pte) || pte_user_exec(pte));
12691269
}
12701270

1271-
static inline bool pmd_user_accessible_page(pmd_t pmd, unsigned long addr)
1271+
static inline bool pmd_user_accessible_page(struct mm_struct *mm, unsigned long addr, pmd_t pmd)
12721272
{
12731273
return pmd_valid(pmd) && !pmd_table(pmd) && (pmd_user(pmd) || pmd_user_exec(pmd));
12741274
}
12751275

1276-
static inline bool pud_user_accessible_page(pud_t pud, unsigned long addr)
1276+
static inline bool pud_user_accessible_page(struct mm_struct *mm, unsigned long addr, pud_t pud)
12771277
{
12781278
return pud_valid(pud) && !pud_table(pud) && (pud_user(pud) || pud_user_exec(pud));
12791279
}

arch/powerpc/include/asm/book3s/32/pgtable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ static inline bool pte_access_permitted(pte_t pte, bool write)
438438
return true;
439439
}
440440

441-
static inline bool pte_user_accessible_page(pte_t pte, unsigned long addr)
441+
static inline bool pte_user_accessible_page(struct mm_struct *mm, unsigned long addr, pte_t pte)
442442
{
443443
return pte_present(pte) && !is_kernel_addr(addr);
444444
}

arch/powerpc/include/asm/book3s/64/pgtable.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ static inline bool pte_access_permitted(pte_t pte, bool write)
549549
return arch_pte_access_permitted(pte_val(pte), write, 0);
550550
}
551551

552-
static inline bool pte_user_accessible_page(pte_t pte, unsigned long addr)
552+
static inline bool pte_user_accessible_page(struct mm_struct *mm, unsigned long addr, pte_t pte)
553553
{
554554
return pte_present(pte) && pte_user(pte);
555555
}
@@ -925,9 +925,9 @@ static inline bool pud_access_permitted(pud_t pud, bool write)
925925
}
926926

927927
#define pud_user_accessible_page pud_user_accessible_page
928-
static inline bool pud_user_accessible_page(pud_t pud, unsigned long addr)
928+
static inline bool pud_user_accessible_page(struct mm_struct *mm, unsigned long addr, pud_t pud)
929929
{
930-
return pud_leaf(pud) && pte_user_accessible_page(pud_pte(pud), addr);
930+
return pud_leaf(pud) && pte_user_accessible_page(mm, addr, pud_pte(pud));
931931
}
932932

933933
#define __p4d_raw(x) ((p4d_t) { __pgd_raw(x) })
@@ -1096,9 +1096,9 @@ static inline bool pmd_access_permitted(pmd_t pmd, bool write)
10961096
}
10971097

10981098
#define pmd_user_accessible_page pmd_user_accessible_page
1099-
static inline bool pmd_user_accessible_page(pmd_t pmd, unsigned long addr)
1099+
static inline bool pmd_user_accessible_page(struct mm_struct *mm, unsigned long addr, pmd_t pmd)
11001100
{
1101-
return pmd_leaf(pmd) && pte_user_accessible_page(pmd_pte(pmd), addr);
1101+
return pmd_leaf(pmd) && pte_user_accessible_page(mm, addr, pmd_pte(pmd));
11021102
}
11031103

11041104
#ifdef CONFIG_TRANSPARENT_HUGEPAGE

arch/powerpc/include/asm/nohash/pgtable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ static inline bool pte_access_permitted(pte_t pte, bool write)
249249
return true;
250250
}
251251

252-
static inline bool pte_user_accessible_page(pte_t pte, unsigned long addr)
252+
static inline bool pte_user_accessible_page(struct mm_struct *mm, unsigned long addr, pte_t pte)
253253
{
254254
return pte_present(pte) && !is_kernel_addr(addr);
255255
}

arch/powerpc/include/asm/pgtable.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,11 @@ static inline bool arch_supports_memmap_on_memory(unsigned long vmemmap_size)
205205
#endif /* CONFIG_PPC64 */
206206

207207
#ifndef pmd_user_accessible_page
208-
#define pmd_user_accessible_page(pmd, addr) false
208+
#define pmd_user_accessible_page(mm, addr, pmd) false
209209
#endif
210210

211211
#ifndef pud_user_accessible_page
212-
#define pud_user_accessible_page(pud, addr) false
212+
#define pud_user_accessible_page(mm, addr, pud) false
213213
#endif
214214

215215
#endif /* __ASSEMBLER__ */

arch/riscv/include/asm/pgtable.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -984,17 +984,17 @@ static inline void set_pud_at(struct mm_struct *mm, unsigned long addr,
984984
}
985985

986986
#ifdef CONFIG_PAGE_TABLE_CHECK
987-
static inline bool pte_user_accessible_page(pte_t pte, unsigned long addr)
987+
static inline bool pte_user_accessible_page(struct mm_struct *mm, unsigned long addr, pte_t pte)
988988
{
989989
return pte_present(pte) && pte_user(pte);
990990
}
991991

992-
static inline bool pmd_user_accessible_page(pmd_t pmd, unsigned long addr)
992+
static inline bool pmd_user_accessible_page(struct mm_struct *mm, unsigned long addr, pmd_t pmd)
993993
{
994994
return pmd_leaf(pmd) && pmd_user(pmd);
995995
}
996996

997-
static inline bool pud_user_accessible_page(pud_t pud, unsigned long addr)
997+
static inline bool pud_user_accessible_page(struct mm_struct *mm, unsigned long addr, pud_t pud)
998998
{
999999
return pud_leaf(pud) && pud_user(pud);
10001000
}

arch/x86/include/asm/pgtable.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1680,17 +1680,17 @@ static inline bool arch_has_hw_nonleaf_pmd_young(void)
16801680
#endif
16811681

16821682
#ifdef CONFIG_PAGE_TABLE_CHECK
1683-
static inline bool pte_user_accessible_page(pte_t pte, unsigned long addr)
1683+
static inline bool pte_user_accessible_page(struct mm_struct *mm, unsigned long addr, pte_t pte)
16841684
{
16851685
return (pte_val(pte) & _PAGE_PRESENT) && (pte_val(pte) & _PAGE_USER);
16861686
}
16871687

1688-
static inline bool pmd_user_accessible_page(pmd_t pmd, unsigned long addr)
1688+
static inline bool pmd_user_accessible_page(struct mm_struct *mm, unsigned long addr, pmd_t pmd)
16891689
{
16901690
return pmd_leaf(pmd) && (pmd_val(pmd) & _PAGE_PRESENT) && (pmd_val(pmd) & _PAGE_USER);
16911691
}
16921692

1693-
static inline bool pud_user_accessible_page(pud_t pud, unsigned long addr)
1693+
static inline bool pud_user_accessible_page(struct mm_struct *mm, unsigned long addr, pud_t pud)
16941694
{
16951695
return pud_leaf(pud) && (pud_val(pud) & _PAGE_PRESENT) && (pud_val(pud) & _PAGE_USER);
16961696
}

mm/page_table_check.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,8 @@ void __page_table_check_pte_clear(struct mm_struct *mm, unsigned long addr,
151151
if (&init_mm == mm)
152152
return;
153153

154-
if (pte_user_accessible_page(pte, addr)) {
154+
if (pte_user_accessible_page(mm, addr, pte))
155155
page_table_check_clear(pte_pfn(pte), PAGE_SIZE >> PAGE_SHIFT);
156-
}
157156
}
158157
EXPORT_SYMBOL(__page_table_check_pte_clear);
159158

@@ -163,9 +162,8 @@ void __page_table_check_pmd_clear(struct mm_struct *mm, unsigned long addr,
163162
if (&init_mm == mm)
164163
return;
165164

166-
if (pmd_user_accessible_page(pmd, addr)) {
165+
if (pmd_user_accessible_page(mm, addr, pmd))
167166
page_table_check_clear(pmd_pfn(pmd), PMD_SIZE >> PAGE_SHIFT);
168-
}
169167
}
170168
EXPORT_SYMBOL(__page_table_check_pmd_clear);
171169

@@ -175,9 +173,8 @@ void __page_table_check_pud_clear(struct mm_struct *mm, unsigned long addr,
175173
if (&init_mm == mm)
176174
return;
177175

178-
if (pud_user_accessible_page(pud, addr)) {
176+
if (pud_user_accessible_page(mm, addr, pud))
179177
page_table_check_clear(pud_pfn(pud), PUD_SIZE >> PAGE_SHIFT);
180-
}
181178
}
182179
EXPORT_SYMBOL(__page_table_check_pud_clear);
183180

@@ -211,7 +208,7 @@ void __page_table_check_ptes_set(struct mm_struct *mm, unsigned long addr,
211208

212209
for (i = 0; i < nr; i++)
213210
__page_table_check_pte_clear(mm, addr + PAGE_SIZE * i, ptep_get(ptep + i));
214-
if (pte_user_accessible_page(pte, addr))
211+
if (pte_user_accessible_page(mm, addr, pte))
215212
page_table_check_set(pte_pfn(pte), nr, pte_write(pte));
216213
}
217214
EXPORT_SYMBOL(__page_table_check_ptes_set);
@@ -241,7 +238,7 @@ void __page_table_check_pmds_set(struct mm_struct *mm, unsigned long addr,
241238

242239
for (i = 0; i < nr; i++)
243240
__page_table_check_pmd_clear(mm, addr + PMD_SIZE * i, *(pmdp + i));
244-
if (pmd_user_accessible_page(pmd, addr))
241+
if (pmd_user_accessible_page(mm, addr, pmd))
245242
page_table_check_set(pmd_pfn(pmd), stride * nr, pmd_write(pmd));
246243
}
247244
EXPORT_SYMBOL(__page_table_check_pmds_set);
@@ -257,7 +254,7 @@ void __page_table_check_puds_set(struct mm_struct *mm, unsigned long addr,
257254

258255
for (i = 0; i < nr; i++)
259256
__page_table_check_pud_clear(mm, addr + PUD_SIZE * i, *(pudp + i));
260-
if (pud_user_accessible_page(pud, addr))
257+
if (pud_user_accessible_page(mm, addr, pud))
261258
page_table_check_set(pud_pfn(pud), stride * nr, pud_write(pud));
262259
}
263260
EXPORT_SYMBOL(__page_table_check_puds_set);

0 commit comments

Comments
 (0)