提交 56aa4129 编写于 作者: R Rusty Russell 提交者: Benjamin Herrenschmidt

cpumask: Use mm_cpumask() wrapper instead of cpu_vm_mask

Makes code futureproof against the impending change to mm->cpu_vm_mask.

It's also a chance to use the new cpumask_ ops which take a pointer
(the older ones are deprecated, but there's no hurry for arch code).
Signed-off-by: NRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
上级 f5ac590e
...@@ -31,7 +31,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, ...@@ -31,7 +31,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
struct task_struct *tsk) struct task_struct *tsk)
{ {
/* Mark this context has been used on the new CPU */ /* Mark this context has been used on the new CPU */
cpu_set(smp_processor_id(), next->cpu_vm_mask); cpumask_set_cpu(smp_processor_id(), mm_cpumask(next));
/* 32-bit keeps track of the current PGDIR in the thread struct */ /* 32-bit keeps track of the current PGDIR in the thread struct */
#ifdef CONFIG_PPC32 #ifdef CONFIG_PPC32
......
...@@ -859,7 +859,7 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap) ...@@ -859,7 +859,7 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
unsigned long vsid; unsigned long vsid;
struct mm_struct *mm; struct mm_struct *mm;
pte_t *ptep; pte_t *ptep;
cpumask_t tmp; const struct cpumask *tmp;
int rc, user_region = 0, local = 0; int rc, user_region = 0, local = 0;
int psize, ssize; int psize, ssize;
...@@ -907,8 +907,8 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap) ...@@ -907,8 +907,8 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
return 1; return 1;
/* Check CPU locality */ /* Check CPU locality */
tmp = cpumask_of_cpu(smp_processor_id()); tmp = cpumask_of(smp_processor_id());
if (user_region && cpus_equal(mm->cpu_vm_mask, tmp)) if (user_region && cpumask_equal(mm_cpumask(mm), tmp))
local = 1; local = 1;
#ifdef CONFIG_HUGETLB_PAGE #ifdef CONFIG_HUGETLB_PAGE
...@@ -1024,7 +1024,6 @@ void hash_preload(struct mm_struct *mm, unsigned long ea, ...@@ -1024,7 +1024,6 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
unsigned long vsid; unsigned long vsid;
void *pgdir; void *pgdir;
pte_t *ptep; pte_t *ptep;
cpumask_t mask;
unsigned long flags; unsigned long flags;
int local = 0; int local = 0;
int ssize; int ssize;
...@@ -1067,8 +1066,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea, ...@@ -1067,8 +1066,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
local_irq_save(flags); local_irq_save(flags);
/* Is that local to this CPU ? */ /* Is that local to this CPU ? */
mask = cpumask_of_cpu(smp_processor_id()); if (cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
if (cpus_equal(mm->cpu_vm_mask, mask))
local = 1; local = 1;
/* Hash it in */ /* Hash it in */
......
...@@ -97,7 +97,7 @@ static unsigned int steal_context_smp(unsigned int id) ...@@ -97,7 +97,7 @@ static unsigned int steal_context_smp(unsigned int id)
mm->context.id = MMU_NO_CONTEXT; mm->context.id = MMU_NO_CONTEXT;
/* Mark it stale on all CPUs that used this mm */ /* Mark it stale on all CPUs that used this mm */
for_each_cpu_mask_nr(cpu, mm->cpu_vm_mask) for_each_cpu(cpu, mm_cpumask(mm))
__set_bit(id, stale_map[cpu]); __set_bit(id, stale_map[cpu]);
return id; return id;
} }
......
...@@ -82,11 +82,10 @@ static void pte_free_submit(struct pte_freelist_batch *batch) ...@@ -82,11 +82,10 @@ static void pte_free_submit(struct pte_freelist_batch *batch)
void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf) void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf)
{ {
/* This is safe since tlb_gather_mmu has disabled preemption */ /* This is safe since tlb_gather_mmu has disabled preemption */
cpumask_t local_cpumask = cpumask_of_cpu(smp_processor_id());
struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur); struct pte_freelist_batch **batchp = &__get_cpu_var(pte_freelist_cur);
if (atomic_read(&tlb->mm->mm_users) < 2 || if (atomic_read(&tlb->mm->mm_users) < 2 ||
cpus_equal(tlb->mm->cpu_vm_mask, local_cpumask)) { cpumask_equal(mm_cpumask(tlb->mm), cpumask_of(smp_processor_id()))){
pgtable_free(pgf); pgtable_free(pgf);
return; return;
} }
......
...@@ -139,12 +139,12 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr, ...@@ -139,12 +139,12 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
*/ */
void __flush_tlb_pending(struct ppc64_tlb_batch *batch) void __flush_tlb_pending(struct ppc64_tlb_batch *batch)
{ {
cpumask_t tmp; const struct cpumask *tmp;
int i, local = 0; int i, local = 0;
i = batch->index; i = batch->index;
tmp = cpumask_of_cpu(smp_processor_id()); tmp = cpumask_of(smp_processor_id());
if (cpus_equal(batch->mm->cpu_vm_mask, tmp)) if (cpumask_equal(mm_cpumask(batch->mm), tmp))
local = 1; local = 1;
if (i == 1) if (i == 1)
flush_hash_page(batch->vaddr[0], batch->pte[0], flush_hash_page(batch->vaddr[0], batch->pte[0],
......
...@@ -132,11 +132,11 @@ void flush_tlb_mm(struct mm_struct *mm) ...@@ -132,11 +132,11 @@ void flush_tlb_mm(struct mm_struct *mm)
pid = mm->context.id; pid = mm->context.id;
if (unlikely(pid == MMU_NO_CONTEXT)) if (unlikely(pid == MMU_NO_CONTEXT))
goto no_context; goto no_context;
cpu_mask = mm->cpu_vm_mask; if (!cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id()))) {
cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) {
struct tlb_flush_param p = { .pid = pid }; struct tlb_flush_param p = { .pid = pid };
smp_call_function_mask(cpu_mask, do_flush_tlb_mm_ipi, &p, 1); /* Ignores smp_processor_id() even if set. */
smp_call_function_many(mm_cpumask(mm),
do_flush_tlb_mm_ipi, &p, 1);
} }
_tlbil_pid(pid); _tlbil_pid(pid);
no_context: no_context:
...@@ -146,16 +146,15 @@ EXPORT_SYMBOL(flush_tlb_mm); ...@@ -146,16 +146,15 @@ EXPORT_SYMBOL(flush_tlb_mm);
void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
{ {
cpumask_t cpu_mask; struct cpumask *cpu_mask;
unsigned int pid; unsigned int pid;
preempt_disable(); preempt_disable();
pid = vma ? vma->vm_mm->context.id : 0; pid = vma ? vma->vm_mm->context.id : 0;
if (unlikely(pid == MMU_NO_CONTEXT)) if (unlikely(pid == MMU_NO_CONTEXT))
goto bail; goto bail;
cpu_mask = vma->vm_mm->cpu_vm_mask; cpu_mask = mm_cpumask(vma->vm_mm);
cpu_clear(smp_processor_id(), cpu_mask); if (!cpumask_equal(cpu_mask, cpumask_of(smp_processor_id()))) {
if (!cpus_empty(cpu_mask)) {
/* If broadcast tlbivax is supported, use it */ /* If broadcast tlbivax is supported, use it */
if (mmu_has_feature(MMU_FTR_USE_TLBIVAX_BCAST)) { if (mmu_has_feature(MMU_FTR_USE_TLBIVAX_BCAST)) {
int lock = mmu_has_feature(MMU_FTR_LOCK_BCAST_INVAL); int lock = mmu_has_feature(MMU_FTR_LOCK_BCAST_INVAL);
...@@ -167,7 +166,8 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) ...@@ -167,7 +166,8 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
goto bail; goto bail;
} else { } else {
struct tlb_flush_param p = { .pid = pid, .addr = vmaddr }; struct tlb_flush_param p = { .pid = pid, .addr = vmaddr };
smp_call_function_mask(cpu_mask, /* Ignores smp_processor_id() even if set in cpu_mask */
smp_call_function_many(cpu_mask,
do_flush_tlb_page_ipi, &p, 1); do_flush_tlb_page_ipi, &p, 1);
} }
} }
......
...@@ -114,7 +114,7 @@ static inline void mm_needs_global_tlbie(struct mm_struct *mm) ...@@ -114,7 +114,7 @@ static inline void mm_needs_global_tlbie(struct mm_struct *mm)
int nr = (NR_CPUS > 1) ? NR_CPUS : NR_CPUS + 1; int nr = (NR_CPUS > 1) ? NR_CPUS : NR_CPUS + 1;
/* Global TLBIE broadcast required with SPEs. */ /* Global TLBIE broadcast required with SPEs. */
__cpus_setall(&mm->cpu_vm_mask, nr); bitmap_fill(cpumask_bits(mm_cpumask(mm)), nr);
} }
void spu_associate_mm(struct spu *spu, struct mm_struct *mm) void spu_associate_mm(struct spu *spu, struct mm_struct *mm)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册