Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

LoongArch: Add ARCH_HAS_PTE_DEVMAP support

In order for things like get_user_pages() to work on ZONE_DEVICE memory,
we need a software PTE bit to identify device-backed PFNs. Hook this up
along with the relevant helpers to join in with ARCH_HAS_PTE_DEVMAP.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>

+24 -2
+1
arch/loongarch/Kconfig
··· 22 22 select ARCH_HAS_KERNEL_FPU_SUPPORT if CPU_HAS_FPU 23 23 select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS 24 24 select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE 25 + select ARCH_HAS_PTE_DEVMAP 25 26 select ARCH_HAS_PTE_SPECIAL 26 27 select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST 27 28 select ARCH_INLINE_READ_LOCK if !PREEMPTION
+4 -2
arch/loongarch/include/asm/pgtable-bits.h
··· 22 22 #define _PAGE_PFN_SHIFT 12 23 23 #define _PAGE_SWP_EXCLUSIVE_SHIFT 23 24 24 #define _PAGE_PFN_END_SHIFT 48 25 + #define _PAGE_DEVMAP_SHIFT 59 25 26 #define _PAGE_PRESENT_INVALID_SHIFT 60 26 27 #define _PAGE_NO_READ_SHIFT 61 27 28 #define _PAGE_NO_EXEC_SHIFT 62 ··· 36 35 #define _PAGE_MODIFIED (_ULCAST_(1) << _PAGE_MODIFIED_SHIFT) 37 36 #define _PAGE_PROTNONE (_ULCAST_(1) << _PAGE_PROTNONE_SHIFT) 38 37 #define _PAGE_SPECIAL (_ULCAST_(1) << _PAGE_SPECIAL_SHIFT) 38 + #define _PAGE_DEVMAP (_ULCAST_(1) << _PAGE_DEVMAP_SHIFT) 39 39 40 40 /* We borrow bit 23 to store the exclusive marker in swap PTEs. */ 41 41 #define _PAGE_SWP_EXCLUSIVE (_ULCAST_(1) << _PAGE_SWP_EXCLUSIVE_SHIFT) ··· 76 74 #define __READABLE (_PAGE_VALID) 77 75 #define __WRITEABLE (_PAGE_DIRTY | _PAGE_WRITE) 78 76 79 - #define _PAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV) 80 - #define _HPAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PFN_MASK | _CACHE_MASK | _PAGE_PLV | _PAGE_HUGE) 77 + #define _PAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PAGE_DEVMAP | _PFN_MASK | _CACHE_MASK | _PAGE_PLV) 78 + #define _HPAGE_CHG_MASK (_PAGE_MODIFIED | _PAGE_SPECIAL | _PAGE_DEVMAP | _PFN_MASK | _CACHE_MASK | _PAGE_PLV | _PAGE_HUGE) 81 79 82 80 #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_NO_READ | \ 83 81 _PAGE_USER | _CACHE_CC)
+19
arch/loongarch/include/asm/pgtable.h
··· 424 424 static inline pte_t pte_mkspecial(pte_t pte) { pte_val(pte) |= _PAGE_SPECIAL; return pte; } 425 425 #endif /* CONFIG_ARCH_HAS_PTE_SPECIAL */ 426 426 427 + static inline int pte_devmap(pte_t pte) { return !!(pte_val(pte) & _PAGE_DEVMAP); } 428 + static inline pte_t pte_mkdevmap(pte_t pte) { pte_val(pte) |= _PAGE_DEVMAP; return pte; } 429 + 427 430 #define pte_accessible pte_accessible 428 431 static inline unsigned long pte_accessible(struct mm_struct *mm, pte_t a) 429 432 { ··· 561 558 return pmd; 562 559 } 563 560 561 + static inline int pmd_devmap(pmd_t pmd) 562 + { 563 + return !!(pmd_val(pmd) & _PAGE_DEVMAP); 564 + } 565 + 566 + static inline pmd_t pmd_mkdevmap(pmd_t pmd) 567 + { 568 + pmd_val(pmd) |= _PAGE_DEVMAP; 569 + return pmd; 570 + } 571 + 564 572 static inline struct page *pmd_page(pmd_t pmd) 565 573 { 566 574 if (pmd_trans_huge(pmd)) ··· 626 612 627 613 #define pmd_leaf(pmd) ((pmd_val(pmd) & _PAGE_HUGE) != 0) 628 614 #define pud_leaf(pud) ((pud_val(pud) & _PAGE_HUGE) != 0) 615 + 616 + #ifdef CONFIG_TRANSPARENT_HUGEPAGE 617 + #define pud_devmap(pud) (0) 618 + #define pgd_devmap(pgd) (0) 619 + #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ 629 620 630 621 /* 631 622 * We provide our own get_unmapped area to cope with the virtual aliasing