Skip to content

Commit ddc1729

Browse files
Hongchen Zhangchenhuacai
authored andcommitted
LoongArch: Let pmd_present() return true when splitting pmd
When we split a pmd into ptes, pmd_present() and pmd_trans_huge() should return true, otherwise it would be treated as a swap pmd. This is the same as arm64 does in commit b65399f ("arm64/mm: Change THP helpers to comply with generic MM semantics"), we also add a new bit named _PAGE_PRESENT_INVALID for LoongArch. Signed-off-by: Hongchen Zhang <[email protected]> Signed-off-by: Huacai Chen <[email protected]>
1 parent 858fd16 commit ddc1729

File tree

2 files changed

+4
-1
lines changed

2 files changed

+4
-1
lines changed

arch/loongarch/include/asm/pgtable-bits.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
#define _PAGE_PFN_SHIFT 12
2323
#define _PAGE_SWP_EXCLUSIVE_SHIFT 23
2424
#define _PAGE_PFN_END_SHIFT 48
25+
#define _PAGE_PRESENT_INVALID_SHIFT 60
2526
#define _PAGE_NO_READ_SHIFT 61
2627
#define _PAGE_NO_EXEC_SHIFT 62
2728
#define _PAGE_RPLV_SHIFT 63
2829

2930
/* Used by software */
3031
#define _PAGE_PRESENT (_ULCAST_(1) << _PAGE_PRESENT_SHIFT)
32+
#define _PAGE_PRESENT_INVALID (_ULCAST_(1) << _PAGE_PRESENT_INVALID_SHIFT)
3133
#define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT)
3234
#define _PAGE_ACCESSED (_ULCAST_(1) << _PAGE_ACCESSED_SHIFT)
3335
#define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT)

arch/loongarch/include/asm/pgtable.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ static inline int pmd_bad(pmd_t pmd)
213213
static inline int pmd_present(pmd_t pmd)
214214
{
215215
if (unlikely(pmd_val(pmd) & _PAGE_HUGE))
216-
return !!(pmd_val(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE));
216+
return !!(pmd_val(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PRESENT_INVALID));
217217

218218
return pmd_val(pmd) != (unsigned long)invalid_pte_table;
219219
}
@@ -558,6 +558,7 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
558558

559559
static inline pmd_t pmd_mkinvalid(pmd_t pmd)
560560
{
561+
pmd_val(pmd) |= _PAGE_PRESENT_INVALID;
561562
pmd_val(pmd) &= ~(_PAGE_PRESENT | _PAGE_VALID | _PAGE_DIRTY | _PAGE_PROTNONE);
562563

563564
return pmd;

0 commit comments

Comments
 (0)