mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
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 b65399f611
("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 <zhanghongchen@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
committed by
Huacai Chen
parent
858fd168a9
commit
ddc1729b07
@@ -22,12 +22,14 @@
|
|||||||
#define _PAGE_PFN_SHIFT 12
|
#define _PAGE_PFN_SHIFT 12
|
||||||
#define _PAGE_SWP_EXCLUSIVE_SHIFT 23
|
#define _PAGE_SWP_EXCLUSIVE_SHIFT 23
|
||||||
#define _PAGE_PFN_END_SHIFT 48
|
#define _PAGE_PFN_END_SHIFT 48
|
||||||
|
#define _PAGE_PRESENT_INVALID_SHIFT 60
|
||||||
#define _PAGE_NO_READ_SHIFT 61
|
#define _PAGE_NO_READ_SHIFT 61
|
||||||
#define _PAGE_NO_EXEC_SHIFT 62
|
#define _PAGE_NO_EXEC_SHIFT 62
|
||||||
#define _PAGE_RPLV_SHIFT 63
|
#define _PAGE_RPLV_SHIFT 63
|
||||||
|
|
||||||
/* Used by software */
|
/* Used by software */
|
||||||
#define _PAGE_PRESENT (_ULCAST_(1) << _PAGE_PRESENT_SHIFT)
|
#define _PAGE_PRESENT (_ULCAST_(1) << _PAGE_PRESENT_SHIFT)
|
||||||
|
#define _PAGE_PRESENT_INVALID (_ULCAST_(1) << _PAGE_PRESENT_INVALID_SHIFT)
|
||||||
#define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT)
|
#define _PAGE_WRITE (_ULCAST_(1) << _PAGE_WRITE_SHIFT)
|
||||||
#define _PAGE_ACCESSED (_ULCAST_(1) << _PAGE_ACCESSED_SHIFT)
|
#define _PAGE_ACCESSED (_ULCAST_(1) << _PAGE_ACCESSED_SHIFT)
|
||||||
#define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT)
|
#define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT)
|
||||||
|
@@ -213,7 +213,7 @@ static inline int pmd_bad(pmd_t pmd)
|
|||||||
static inline int pmd_present(pmd_t pmd)
|
static inline int pmd_present(pmd_t pmd)
|
||||||
{
|
{
|
||||||
if (unlikely(pmd_val(pmd) & _PAGE_HUGE))
|
if (unlikely(pmd_val(pmd) & _PAGE_HUGE))
|
||||||
return !!(pmd_val(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE));
|
return !!(pmd_val(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PRESENT_INVALID));
|
||||||
|
|
||||||
return pmd_val(pmd) != (unsigned long)invalid_pte_table;
|
return pmd_val(pmd) != (unsigned long)invalid_pte_table;
|
||||||
}
|
}
|
||||||
@@ -558,6 +558,7 @@ static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
|
|||||||
|
|
||||||
static inline pmd_t pmd_mkinvalid(pmd_t pmd)
|
static inline pmd_t pmd_mkinvalid(pmd_t pmd)
|
||||||
{
|
{
|
||||||
|
pmd_val(pmd) |= _PAGE_PRESENT_INVALID;
|
||||||
pmd_val(pmd) &= ~(_PAGE_PRESENT | _PAGE_VALID | _PAGE_DIRTY | _PAGE_PROTNONE);
|
pmd_val(pmd) &= ~(_PAGE_PRESENT | _PAGE_VALID | _PAGE_DIRTY | _PAGE_PROTNONE);
|
||||||
|
|
||||||
return pmd;
|
return pmd;
|
||||||
|
Reference in New Issue
Block a user