Commit 7d6fd04f authored by Kefeng Wang's avatar Kefeng Wang
Browse files

arm64: tlbflush: add __flush_tlb_range_limit_excess()

mainline inclusion
from mainline-v6.13-rc1
commit 7ffc13e233951f15728c9d09db3cc8d9f6cf81f2
category: performance
bugzilla: https://gitee.com/openeuler/kernel/issues/IB82FR


CVE: NA

-------------------------------------------------

The __flush_tlb_range_limit_excess() helper will be used when
flush tlb kernel range soon.

Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/20240923131351.713304-2-wangkefeng.wang@huawei.com


Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
(cherry picked from commit 7ffc13e233951f15728c9d09db3cc8d9f6cf81f2)
Signed-off-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
parent 1fe29f6d
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -402,6 +402,23 @@ do { \
#define __flush_s2_tlb_range_op(op, start, pages, stride, tlb_level) \
	__flush_tlb_range_op(op, start, pages, stride, 0, tlb_level, false)

static inline bool __flush_tlb_range_limit_excess(unsigned long start,
		unsigned long end, unsigned long pages, unsigned long stride)
{
	/*
	 * When the system does not support TLB range based flush
	 * operation, (MAX_DVM_OPS - 1) pages can be handled. But
	 * with TLB range based operation, MAX_TLBI_RANGE_PAGES
	 * pages can be handled.
	 */
	if ((!system_supports_tlb_range() &&
	     (end - start) >= (MAX_DVM_OPS * stride)) ||
	    pages > MAX_TLBI_RANGE_PAGES)
		return true;

	return false;
}

static inline void __flush_tlb_range_nosync(struct vm_area_struct *vma,
				     unsigned long start, unsigned long end,
				     unsigned long stride, bool last_level,
@@ -413,15 +430,7 @@ static inline void __flush_tlb_range_nosync(struct vm_area_struct *vma,
	end = round_up(end, stride);
	pages = (end - start) >> PAGE_SHIFT;

	/*
	 * When not uses TLB range ops, we can handle up to
	 * (MAX_DVM_OPS - 1) pages;
	 * When uses TLB range ops, we can handle up to
	 * MAX_TLBI_RANGE_PAGES pages.
	 */
	if ((!system_supports_tlb_range() &&
	     (end - start) >= (MAX_DVM_OPS * stride)) ||
	    pages > MAX_TLBI_RANGE_PAGES) {
	if (__flush_tlb_range_limit_excess(start, end, pages, stride)) {
		flush_tlb_mm(vma->vm_mm);
		return;
	}