mm: add update_mmu_tlb_range()
Patch series "Add update_mmu_tlb_range() to simplify code", v4.
This series of commits mainly adds the update_mmu_tlb_range() to batch
update tlb in an address range and implement update_mmu_tlb() using
update_mmu_tlb_range().
After commit 19eaf44954
("mm: thp: support allocation of anonymous
multi-size THP"), We may need to batch update tlb of a certain address
range by calling update_mmu_tlb() in a loop. Using the
update_mmu_tlb_range(), we can simplify the code and possibly reduce the
execution of some unnecessary code in some architectures.
This patch (of 3):
Add update_mmu_tlb_range(), we can batch update tlb of an address range.
Link: https://lkml.kernel.org/r/20240522061204.117421-1-libang.li@antgroup.com
Link: https://lkml.kernel.org/r/20240522061204.117421-2-libang.li@antgroup.com
Signed-off-by: Bang Li <libang.li@antgroup.com>
Acked-by: David Hildenbrand <david@redhat.com>
Cc: Chris Zankel <chris@zankel.net>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Lance Yang <ioworker0@gmail.com>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
e4a4ba4154
commit
23b1b44e6c
@ -469,6 +469,8 @@ static inline void update_mmu_cache_range(struct vm_fault *vmf,
|
||||
|
||||
#define __HAVE_ARCH_UPDATE_MMU_TLB
|
||||
#define update_mmu_tlb update_mmu_cache
|
||||
#define update_mmu_tlb_range(vma, addr, ptep, nr) \
|
||||
update_mmu_cache_range(NULL, vma, addr, ptep, nr)
|
||||
|
||||
static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|
||||
unsigned long address, pmd_t *pmdp)
|
||||
|
@ -596,6 +596,8 @@ static inline void update_mmu_cache_range(struct vm_fault *vmf,
|
||||
|
||||
#define __HAVE_ARCH_UPDATE_MMU_TLB
|
||||
#define update_mmu_tlb update_mmu_cache
|
||||
#define update_mmu_tlb_range(vma, address, ptep, nr) \
|
||||
update_mmu_cache_range(NULL, vma, address, ptep, nr)
|
||||
|
||||
static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|
||||
unsigned long address, pmd_t *pmdp)
|
||||
|
@ -491,6 +491,8 @@ static inline void update_mmu_cache_range(struct vm_fault *vmf,
|
||||
|
||||
#define __HAVE_ARCH_UPDATE_MMU_TLB
|
||||
#define update_mmu_tlb update_mmu_cache
|
||||
#define update_mmu_tlb_range(vma, addr, ptep, nr) \
|
||||
update_mmu_cache_range(NULL, vma, addr, ptep, nr)
|
||||
|
||||
static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|
||||
unsigned long address, pmd_t *pmdp)
|
||||
|
@ -413,6 +413,9 @@ typedef pte_t *pte_addr_t;
|
||||
void update_mmu_tlb(struct vm_area_struct *vma,
|
||||
unsigned long address, pte_t *ptep);
|
||||
#define __HAVE_ARCH_UPDATE_MMU_TLB
|
||||
void update_mmu_tlb_range(struct vm_area_struct *vma,
|
||||
unsigned long address, pte_t *ptep, unsigned int nr);
|
||||
#define update_mmu_tlb_range update_mmu_tlb_range
|
||||
|
||||
#endif /* !defined (__ASSEMBLY__) */
|
||||
|
||||
|
@ -169,6 +169,12 @@ void update_mmu_tlb(struct vm_area_struct *vma,
|
||||
local_flush_tlb_page(vma, address);
|
||||
}
|
||||
|
||||
void update_mmu_tlb_range(struct vm_area_struct *vma,
|
||||
unsigned long address, pte_t *ptep, unsigned int nr)
|
||||
{
|
||||
local_flush_tlb_range(vma, address, address + PAGE_SIZE * nr);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_TLB_SANITY
|
||||
|
||||
static unsigned get_pte_for_vaddr(unsigned vaddr)
|
||||
|
@ -729,6 +729,13 @@ static inline void clear_full_ptes(struct mm_struct *mm, unsigned long addr,
|
||||
* fault. This function updates TLB only, do nothing with cache or others.
|
||||
* It is the difference with function update_mmu_cache.
|
||||
*/
|
||||
#ifndef update_mmu_tlb_range
|
||||
static inline void update_mmu_tlb_range(struct vm_area_struct *vma,
|
||||
unsigned long address, pte_t *ptep, unsigned int nr)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_UPDATE_MMU_TLB
|
||||
static inline void update_mmu_tlb(struct vm_area_struct *vma,
|
||||
unsigned long address, pte_t *ptep)
|
||||
|
Loading…
Reference in New Issue
Block a user