/** * Flush caches as necessary for all cores affected by a * vma. If no vma is supplied, all cores are flushed. * * @vma: VMA to flush or NULL to flush all icaches. */ static void octeon_flush_icache_all_cores(struct vm_area_struct *vma) { extern void octeon_send_ipi_single(int cpu, unsigned int action); #ifdef CONFIG_SMP int cpu; cpumask_t mask; #endif mb(); octeon_local_flush_icache(); #ifdef CONFIG_SMP preempt_disable(); cpu = smp_processor_id(); /* * If we have a vma structure, we only need to worry about * cores it has been used on */ if (vma) mask = *mm_cpumask(vma->vm_mm); else mask = cpu_online_map; cpu_clear(cpu, mask); for_each_cpu_mask(cpu, mask) octeon_send_ipi_single(cpu, SMP_ICACHE_FLUSH); preempt_enable(); #endif }
static inline void octeon_send_ipi_mask(const struct cpumask *mask, unsigned int action) { unsigned int i; for_each_cpu(i, mask) octeon_send_ipi_single(i, action); }