Loading arch/riscv/mm/tlbflush.c +23 −2 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #include <linux/mm.h> #include <linux/smp.h> #include <linux/sched.h> #include <asm/sbi.h> void flush_tlb_all(void) Loading @@ -9,13 +10,33 @@ void flush_tlb_all(void) sbi_remote_sfence_vma(NULL, 0, -1); } /* * This function must not be called with cmask being null. * Kernel may panic if cmask is NULL. */ static void __sbi_tlb_flush_range(struct cpumask *cmask, unsigned long start, unsigned long size) { struct cpumask hmask; unsigned int cpuid; if (cpumask_empty(cmask)) return; cpuid = get_cpu(); if (cpumask_any_but(cmask, cpuid) >= nr_cpu_ids) { /* local cpu is the only cpu present in cpumask */ if (size <= PAGE_SIZE) local_flush_tlb_page(start); else local_flush_tlb_all(); } else { riscv_cpuid_to_hartid_mask(cmask, &hmask); sbi_remote_sfence_vma(hmask.bits, start, size); sbi_remote_sfence_vma(cpumask_bits(&hmask), start, size); } put_cpu(); } void flush_tlb_mm(struct mm_struct *mm) Loading Loading
arch/riscv/mm/tlbflush.c +23 −2 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #include <linux/mm.h> #include <linux/smp.h> #include <linux/sched.h> #include <asm/sbi.h> void flush_tlb_all(void) Loading @@ -9,13 +10,33 @@ void flush_tlb_all(void) sbi_remote_sfence_vma(NULL, 0, -1); } /* * This function must not be called with cmask being null. * Kernel may panic if cmask is NULL. */ static void __sbi_tlb_flush_range(struct cpumask *cmask, unsigned long start, unsigned long size) { struct cpumask hmask; unsigned int cpuid; if (cpumask_empty(cmask)) return; cpuid = get_cpu(); if (cpumask_any_but(cmask, cpuid) >= nr_cpu_ids) { /* local cpu is the only cpu present in cpumask */ if (size <= PAGE_SIZE) local_flush_tlb_page(start); else local_flush_tlb_all(); } else { riscv_cpuid_to_hartid_mask(cmask, &hmask); sbi_remote_sfence_vma(hmask.bits, start, size); sbi_remote_sfence_vma(cpumask_bits(&hmask), start, size); } put_cpu(); } void flush_tlb_mm(struct mm_struct *mm) Loading