* [PATCH v3 1/3] mm: Add update_mmu_tlb_range()
2024-05-18 7:49 [PATCH v3 0/3] Add update_mmu_tlb_range() to simplify code Bang Li
@ 2024-05-18 7:49 ` Bang Li
[not found] ` <b356b558-d327-4bbc-9290-4e296877d145@redhat.com>
2024-05-18 7:49 ` [PATCH v3 2/3] mm: Refactor update_mmu_tlb() Bang Li
2024-05-18 7:49 ` [PATCH v3 3/3] mm: Use update_mmu_tlb_range() to simplify code Bang Li
2 siblings, 1 reply; 9+ messages in thread
From: Bang Li @ 2024-05-18 7:49 UTC (permalink / raw)
To: akpm, chenhuacai, tsbogend, paul.walmsley, palmer, chris, jcmvbkbc
Cc: linux-kernel, linux-mm, loongarch, linux-riscv, david,
ryan.roberts, ioworker0, libang.linux, Bang Li
Added update_mmu_tlb_range(), we can batch update tlb of an
address range.
Signed-off-by: Bang Li <libang.li@antgroup.com>
---
arch/loongarch/include/asm/pgtable.h | 2 ++
arch/mips/include/asm/pgtable.h | 2 ++
arch/riscv/include/asm/pgtable.h | 2 ++
arch/xtensa/include/asm/pgtable.h | 3 +++
arch/xtensa/mm/tlb.c | 6 ++++++
5 files changed, 15 insertions(+)
diff --git a/arch/loongarch/include/asm/pgtable.h b/arch/loongarch/include/asm/pgtable.h
index af3acdf3481a..5ccc2a3a6f7a 100644
--- a/arch/loongarch/include/asm/pgtable.h
+++ b/arch/loongarch/include/asm/pgtable.h
@@ -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)
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h
index e27a4c83c548..0891ad7d43b6 100644
--- a/arch/mips/include/asm/pgtable.h
+++ b/arch/mips/include/asm/pgtable.h
@@ -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)
diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h
index 661b2b4fe758..fc07b829ac4a 100644
--- a/arch/riscv/include/asm/pgtable.h
+++ b/arch/riscv/include/asm/pgtable.h
@@ -488,6 +488,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)
diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h
index 9a7e5e57ee9a..436158bd9030 100644
--- a/arch/xtensa/include/asm/pgtable.h
+++ b/arch/xtensa/include/asm/pgtable.h
@@ -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__) */
diff --git a/arch/xtensa/mm/tlb.c b/arch/xtensa/mm/tlb.c
index d8b60d6e50a8..05efba86b870 100644
--- a/arch/xtensa/mm/tlb.c
+++ b/arch/xtensa/mm/tlb.c
@@ -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)
--
2.19.1.6.gb485710b
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH v3 2/3] mm: Refactor update_mmu_tlb()
2024-05-18 7:49 [PATCH v3 0/3] Add update_mmu_tlb_range() to simplify code Bang Li
2024-05-18 7:49 ` [PATCH v3 1/3] mm: Add update_mmu_tlb_range() Bang Li
@ 2024-05-18 7:49 ` Bang Li
2024-05-21 9:36 ` David Hildenbrand
2024-05-18 7:49 ` [PATCH v3 3/3] mm: Use update_mmu_tlb_range() to simplify code Bang Li
2 siblings, 1 reply; 9+ messages in thread
From: Bang Li @ 2024-05-18 7:49 UTC (permalink / raw)
To: akpm, chenhuacai, tsbogend, paul.walmsley, palmer, chris, jcmvbkbc
Cc: linux-kernel, linux-mm, loongarch, linux-riscv, david,
ryan.roberts, ioworker0, libang.linux, Bang Li
Remove update_mmu_tlb() from those architectures and define
generically via update_mmu_tlb_range(), removing the ability
for arches to override it.
Signed-off-by: Bang Li <libang.li@antgroup.com>
---
arch/loongarch/include/asm/pgtable.h | 2 --
arch/mips/include/asm/pgtable.h | 2 --
arch/riscv/include/asm/pgtable.h | 2 --
arch/xtensa/include/asm/pgtable.h | 3 ---
arch/xtensa/mm/tlb.c | 6 ------
include/linux/pgtable.h | 11 ++++++++---
6 files changed, 8 insertions(+), 18 deletions(-)
diff --git a/arch/loongarch/include/asm/pgtable.h b/arch/loongarch/include/asm/pgtable.h
index 5ccc2a3a6f7a..161dd6e10479 100644
--- a/arch/loongarch/include/asm/pgtable.h
+++ b/arch/loongarch/include/asm/pgtable.h
@@ -467,8 +467,6 @@ static inline void update_mmu_cache_range(struct vm_fault *vmf,
#define update_mmu_cache(vma, addr, ptep) \
update_mmu_cache_range(NULL, vma, addr, ptep, 1)
-#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)
diff --git a/arch/mips/include/asm/pgtable.h b/arch/mips/include/asm/pgtable.h
index 0891ad7d43b6..c29a551eb0ca 100644
--- a/arch/mips/include/asm/pgtable.h
+++ b/arch/mips/include/asm/pgtable.h
@@ -594,8 +594,6 @@ static inline void update_mmu_cache_range(struct vm_fault *vmf,
#define update_mmu_cache(vma, address, ptep) \
update_mmu_cache_range(NULL, vma, address, ptep, 1)
-#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)
diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h
index fc07b829ac4a..158170442d2f 100644
--- a/arch/riscv/include/asm/pgtable.h
+++ b/arch/riscv/include/asm/pgtable.h
@@ -486,8 +486,6 @@ static inline void update_mmu_cache_range(struct vm_fault *vmf,
#define update_mmu_cache(vma, addr, ptep) \
update_mmu_cache_range(NULL, vma, addr, ptep, 1)
-#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)
diff --git a/arch/xtensa/include/asm/pgtable.h b/arch/xtensa/include/asm/pgtable.h
index 436158bd9030..1647a7cc3fbf 100644
--- a/arch/xtensa/include/asm/pgtable.h
+++ b/arch/xtensa/include/asm/pgtable.h
@@ -410,9 +410,6 @@ void update_mmu_cache_range(struct vm_fault *vmf, struct vm_area_struct *vma,
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
diff --git a/arch/xtensa/mm/tlb.c b/arch/xtensa/mm/tlb.c
index 05efba86b870..0a1a815dc796 100644
--- a/arch/xtensa/mm/tlb.c
+++ b/arch/xtensa/mm/tlb.c
@@ -163,12 +163,6 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
}
}
-void update_mmu_tlb(struct vm_area_struct *vma,
- unsigned long address, pte_t *ptep)
-{
- 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)
{
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
index 18019f037bae..117b807e3f89 100644
--- a/include/linux/pgtable.h
+++ b/include/linux/pgtable.h
@@ -729,13 +729,18 @@ 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 __HAVE_ARCH_UPDATE_MMU_TLB
+#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
+
static inline void update_mmu_tlb(struct vm_area_struct *vma,
unsigned long address, pte_t *ptep)
{
+ update_mmu_tlb_range(vma, address, ptep, 1);
}
-#define __HAVE_ARCH_UPDATE_MMU_TLB
-#endif
/*
* Some architectures may be able to avoid expensive synchronization
--
2.19.1.6.gb485710b
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v3 2/3] mm: Refactor update_mmu_tlb()
2024-05-18 7:49 ` [PATCH v3 2/3] mm: Refactor update_mmu_tlb() Bang Li
@ 2024-05-21 9:36 ` David Hildenbrand
2024-05-21 15:36 ` Bang Li
0 siblings, 1 reply; 9+ messages in thread
From: David Hildenbrand @ 2024-05-21 9:36 UTC (permalink / raw)
To: Bang Li, akpm, chenhuacai, tsbogend, paul.walmsley, palmer,
chris, jcmvbkbc
Cc: linux-kernel, linux-mm, loongarch, linux-riscv, ryan.roberts,
ioworker0, libang.linux
On 18.05.24 09:49, Bang Li wrote:
> Remove update_mmu_tlb() from those architectures and define
> generically via update_mmu_tlb_range(), removing the ability
> for arches to override it.
I'd suggest something like
"mm: implement update_mmu_tlb() using update_mmu_tlb_range()
Let's make update_mmu_tlb() simply a generic wrapper around
update_mmu_tlb_range(). Only the latter can now be overridden by the
architecture. We can now remove __HAVE_ARCH_UPDATE_MMU_TLB as well.
"
[...]
> +#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
With that in patch #1
Acked-by: David Hildenbrand <david@redhat.com>
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v3 2/3] mm: Refactor update_mmu_tlb()
2024-05-21 9:36 ` David Hildenbrand
@ 2024-05-21 15:36 ` Bang Li
0 siblings, 0 replies; 9+ messages in thread
From: Bang Li @ 2024-05-21 15:36 UTC (permalink / raw)
To: David Hildenbrand, akpm, chenhuacai, tsbogend, paul.walmsley,
palmer, chris, jcmvbkbc
Cc: linux-kernel, linux-mm, loongarch, linux-riscv, ryan.roberts,
ioworker0, libang.linux
Hi David,
Thanks for you review!
On 2024/5/21 17:36, David Hildenbrand wrote:
> On 18.05.24 09:49, Bang Li wrote:
>> Remove update_mmu_tlb() from those architectures and define
>> generically via update_mmu_tlb_range(), removing the ability
>> for arches to override it.
>
> I'd suggest something like
>
> "mm: implement update_mmu_tlb() using update_mmu_tlb_range()
>
> Let's make update_mmu_tlb() simply a generic wrapper around
> update_mmu_tlb_range(). Only the latter can now be overridden by the
> architecture. We can now remove __HAVE_ARCH_UPDATE_MMU_TLB as well.
> "
Agree! Thank you for your suggestion, I will modify it in the next version
>
> [...]
>
>> +#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
>
> With that in patch #1
Thanks again.
Bang
>
> Acked-by: David Hildenbrand <david@redhat.com>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 3/3] mm: Use update_mmu_tlb_range() to simplify code
2024-05-18 7:49 [PATCH v3 0/3] Add update_mmu_tlb_range() to simplify code Bang Li
2024-05-18 7:49 ` [PATCH v3 1/3] mm: Add update_mmu_tlb_range() Bang Li
2024-05-18 7:49 ` [PATCH v3 2/3] mm: Refactor update_mmu_tlb() Bang Li
@ 2024-05-18 7:49 ` Bang Li
2024-05-20 14:45 ` Lance Yang
2024-05-21 9:37 ` David Hildenbrand
2 siblings, 2 replies; 9+ messages in thread
From: Bang Li @ 2024-05-18 7:49 UTC (permalink / raw)
To: akpm, chenhuacai, tsbogend, paul.walmsley, palmer, chris, jcmvbkbc
Cc: linux-kernel, linux-mm, loongarch, linux-riscv, david,
ryan.roberts, ioworker0, libang.linux, Bang Li
Let us simplify the code by update_mmu_tlb_range().
Signed-off-by: Bang Li <libang.li@antgroup.com>
---
mm/memory.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/mm/memory.c b/mm/memory.c
index eea6e4984eae..2d53e29cf76e 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -4421,7 +4421,6 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
vm_fault_t ret = 0;
int nr_pages = 1;
pte_t entry;
- int i;
/* File mapping without ->vm_ops ? */
if (vma->vm_flags & VM_SHARED)
@@ -4491,8 +4490,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
update_mmu_tlb(vma, addr, vmf->pte);
goto release;
} else if (nr_pages > 1 && !pte_range_none(vmf->pte, nr_pages)) {
- for (i = 0; i < nr_pages; i++)
- update_mmu_tlb(vma, addr + PAGE_SIZE * i, vmf->pte + i);
+ update_mmu_tlb_range(vma, addr, vmf->pte, nr_pages);
goto release;
}
--
2.19.1.6.gb485710b
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v3 3/3] mm: Use update_mmu_tlb_range() to simplify code
2024-05-18 7:49 ` [PATCH v3 3/3] mm: Use update_mmu_tlb_range() to simplify code Bang Li
@ 2024-05-20 14:45 ` Lance Yang
2024-05-21 9:37 ` David Hildenbrand
1 sibling, 0 replies; 9+ messages in thread
From: Lance Yang @ 2024-05-20 14:45 UTC (permalink / raw)
To: Bang Li
Cc: akpm, chenhuacai, tsbogend, paul.walmsley, palmer, chris,
jcmvbkbc, linux-kernel, linux-mm, loongarch, linux-riscv, david,
ryan.roberts, libang.linux
On Sat, May 18, 2024 at 3:51 PM Bang Li <libang.li@antgroup.com> wrote:
>
> Let us simplify the code by update_mmu_tlb_range().
>
LGTM.
Reviewed-by: Lance Yang <ioworker0@gmail.com>
> Signed-off-by: Bang Li <libang.li@antgroup.com>
> ---
> mm/memory.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/mm/memory.c b/mm/memory.c
> index eea6e4984eae..2d53e29cf76e 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -4421,7 +4421,6 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
> vm_fault_t ret = 0;
> int nr_pages = 1;
> pte_t entry;
> - int i;
>
> /* File mapping without ->vm_ops ? */
> if (vma->vm_flags & VM_SHARED)
> @@ -4491,8 +4490,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
> update_mmu_tlb(vma, addr, vmf->pte);
> goto release;
> } else if (nr_pages > 1 && !pte_range_none(vmf->pte, nr_pages)) {
> - for (i = 0; i < nr_pages; i++)
> - update_mmu_tlb(vma, addr + PAGE_SIZE * i, vmf->pte + i);
> + update_mmu_tlb_range(vma, addr, vmf->pte, nr_pages);
> goto release;
> }
>
> --
> 2.19.1.6.gb485710b
>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH v3 3/3] mm: Use update_mmu_tlb_range() to simplify code
2024-05-18 7:49 ` [PATCH v3 3/3] mm: Use update_mmu_tlb_range() to simplify code Bang Li
2024-05-20 14:45 ` Lance Yang
@ 2024-05-21 9:37 ` David Hildenbrand
1 sibling, 0 replies; 9+ messages in thread
From: David Hildenbrand @ 2024-05-21 9:37 UTC (permalink / raw)
To: Bang Li, akpm, chenhuacai, tsbogend, paul.walmsley, palmer,
chris, jcmvbkbc
Cc: linux-kernel, linux-mm, loongarch, linux-riscv, ryan.roberts,
ioworker0, libang.linux
On 18.05.24 09:49, Bang Li wrote:
> Let us simplify the code by update_mmu_tlb_range().
>
> Signed-off-by: Bang Li <libang.li@antgroup.com>
> ---
> mm/memory.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/mm/memory.c b/mm/memory.c
> index eea6e4984eae..2d53e29cf76e 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -4421,7 +4421,6 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
> vm_fault_t ret = 0;
> int nr_pages = 1;
> pte_t entry;
> - int i;
>
> /* File mapping without ->vm_ops ? */
> if (vma->vm_flags & VM_SHARED)
> @@ -4491,8 +4490,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf)
> update_mmu_tlb(vma, addr, vmf->pte);
> goto release;
> } else if (nr_pages > 1 && !pte_range_none(vmf->pte, nr_pages)) {
> - for (i = 0; i < nr_pages; i++)
> - update_mmu_tlb(vma, addr + PAGE_SIZE * i, vmf->pte + i);
> + update_mmu_tlb_range(vma, addr, vmf->pte, nr_pages);
> goto release;
> }
>
Acked-by: David Hildenbrand <david@redhat.com>
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 9+ messages in thread