Commit 81f1adf0 authored by Rusty Russell's avatar Rusty Russell

cpumask: use mm_cpumask() wrapper: sparc

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: default avatarRusty Russell <rusty@rustcorp.com.au>
parent e9b37512
...@@ -121,8 +121,8 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str ...@@ -121,8 +121,8 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str
* local TLB. * local TLB.
*/ */
cpu = smp_processor_id(); cpu = smp_processor_id();
if (!ctx_valid || !cpu_isset(cpu, mm->cpu_vm_mask)) { if (!ctx_valid || !cpumask_test_cpu(cpu, mm_cpumask(mm))) {
cpu_set(cpu, mm->cpu_vm_mask); cpumask_set_cpu(cpu, mm_cpumask(mm));
__flush_tlb_mm(CTX_HWBITS(mm->context), __flush_tlb_mm(CTX_HWBITS(mm->context),
SECONDARY_CONTEXT); SECONDARY_CONTEXT);
} }
...@@ -141,8 +141,8 @@ static inline void activate_mm(struct mm_struct *active_mm, struct mm_struct *mm ...@@ -141,8 +141,8 @@ static inline void activate_mm(struct mm_struct *active_mm, struct mm_struct *mm
if (!CTX_VALID(mm->context)) if (!CTX_VALID(mm->context))
get_new_mmu_context(mm); get_new_mmu_context(mm);
cpu = smp_processor_id(); cpu = smp_processor_id();
if (!cpu_isset(cpu, mm->cpu_vm_mask)) if (!cpumask_test_cpu(cpu, mm_cpumask(mm)))
cpu_set(cpu, mm->cpu_vm_mask); cpumask_set_cpu(cpu, mm_cpumask(mm));
load_secondary_context(mm); load_secondary_context(mm);
__flush_tlb_mm(CTX_HWBITS(mm->context), SECONDARY_CONTEXT); __flush_tlb_mm(CTX_HWBITS(mm->context), SECONDARY_CONTEXT);
......
...@@ -126,7 +126,7 @@ extern void flushw_all(void); ...@@ -126,7 +126,7 @@ extern void flushw_all(void);
#define switch_to(prev, next, last) do { \ #define switch_to(prev, next, last) do { \
SWITCH_ENTER(prev); \ SWITCH_ENTER(prev); \
SWITCH_DO_LAZY_FPU(next); \ SWITCH_DO_LAZY_FPU(next); \
cpu_set(smp_processor_id(), next->active_mm->cpu_vm_mask); \ cpumask_set_cpu(smp_processor_id(), mm_cpumask(next->active_mm)); \
__asm__ __volatile__( \ __asm__ __volatile__( \
"sethi %%hi(here - 0x8), %%o7\n\t" \ "sethi %%hi(here - 0x8), %%o7\n\t" \
"mov %%g6, %%g3\n\t" \ "mov %%g6, %%g3\n\t" \
......
...@@ -143,7 +143,7 @@ void smp_flush_tlb_all(void) ...@@ -143,7 +143,7 @@ void smp_flush_tlb_all(void)
void smp_flush_cache_mm(struct mm_struct *mm) void smp_flush_cache_mm(struct mm_struct *mm)
{ {
if(mm->context != NO_CONTEXT) { if(mm->context != NO_CONTEXT) {
cpumask_t cpu_mask = mm->cpu_vm_mask; cpumask_t cpu_mask = *mm_cpumask(mm);
cpu_clear(smp_processor_id(), cpu_mask); cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) if (!cpus_empty(cpu_mask))
xc1((smpfunc_t) BTFIXUP_CALL(local_flush_cache_mm), (unsigned long) mm); xc1((smpfunc_t) BTFIXUP_CALL(local_flush_cache_mm), (unsigned long) mm);
...@@ -154,12 +154,13 @@ void smp_flush_cache_mm(struct mm_struct *mm) ...@@ -154,12 +154,13 @@ void smp_flush_cache_mm(struct mm_struct *mm)
void smp_flush_tlb_mm(struct mm_struct *mm) void smp_flush_tlb_mm(struct mm_struct *mm)
{ {
if(mm->context != NO_CONTEXT) { if(mm->context != NO_CONTEXT) {
cpumask_t cpu_mask = mm->cpu_vm_mask; cpumask_t cpu_mask = *mm_cpumask(mm);
cpu_clear(smp_processor_id(), cpu_mask); cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) { if (!cpus_empty(cpu_mask)) {
xc1((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_mm), (unsigned long) mm); xc1((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_mm), (unsigned long) mm);
if(atomic_read(&mm->mm_users) == 1 && current->active_mm == mm) if(atomic_read(&mm->mm_users) == 1 && current->active_mm == mm)
mm->cpu_vm_mask = cpumask_of_cpu(smp_processor_id()); cpumask_copy(mm_cpumask(mm),
cpumask_of(smp_processor_id()));
} }
local_flush_tlb_mm(mm); local_flush_tlb_mm(mm);
} }
...@@ -171,7 +172,7 @@ void smp_flush_cache_range(struct vm_area_struct *vma, unsigned long start, ...@@ -171,7 +172,7 @@ void smp_flush_cache_range(struct vm_area_struct *vma, unsigned long start,
struct mm_struct *mm = vma->vm_mm; struct mm_struct *mm = vma->vm_mm;
if (mm->context != NO_CONTEXT) { if (mm->context != NO_CONTEXT) {
cpumask_t cpu_mask = mm->cpu_vm_mask; cpumask_t cpu_mask = *mm_cpumask(mm);
cpu_clear(smp_processor_id(), cpu_mask); cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) if (!cpus_empty(cpu_mask))
xc3((smpfunc_t) BTFIXUP_CALL(local_flush_cache_range), (unsigned long) vma, start, end); xc3((smpfunc_t) BTFIXUP_CALL(local_flush_cache_range), (unsigned long) vma, start, end);
...@@ -185,7 +186,7 @@ void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, ...@@ -185,7 +186,7 @@ void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
struct mm_struct *mm = vma->vm_mm; struct mm_struct *mm = vma->vm_mm;
if (mm->context != NO_CONTEXT) { if (mm->context != NO_CONTEXT) {
cpumask_t cpu_mask = mm->cpu_vm_mask; cpumask_t cpu_mask = *mm_cpumask(mm);
cpu_clear(smp_processor_id(), cpu_mask); cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) if (!cpus_empty(cpu_mask))
xc3((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_range), (unsigned long) vma, start, end); xc3((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_range), (unsigned long) vma, start, end);
...@@ -198,7 +199,7 @@ void smp_flush_cache_page(struct vm_area_struct *vma, unsigned long page) ...@@ -198,7 +199,7 @@ void smp_flush_cache_page(struct vm_area_struct *vma, unsigned long page)
struct mm_struct *mm = vma->vm_mm; struct mm_struct *mm = vma->vm_mm;
if(mm->context != NO_CONTEXT) { if(mm->context != NO_CONTEXT) {
cpumask_t cpu_mask = mm->cpu_vm_mask; cpumask_t cpu_mask = *mm_cpumask(mm);
cpu_clear(smp_processor_id(), cpu_mask); cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) if (!cpus_empty(cpu_mask))
xc2((smpfunc_t) BTFIXUP_CALL(local_flush_cache_page), (unsigned long) vma, page); xc2((smpfunc_t) BTFIXUP_CALL(local_flush_cache_page), (unsigned long) vma, page);
...@@ -211,7 +212,7 @@ void smp_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) ...@@ -211,7 +212,7 @@ void smp_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
struct mm_struct *mm = vma->vm_mm; struct mm_struct *mm = vma->vm_mm;
if(mm->context != NO_CONTEXT) { if(mm->context != NO_CONTEXT) {
cpumask_t cpu_mask = mm->cpu_vm_mask; cpumask_t cpu_mask = *mm_cpumask(mm);
cpu_clear(smp_processor_id(), cpu_mask); cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) if (!cpus_empty(cpu_mask))
xc2((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_page), (unsigned long) vma, page); xc2((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_page), (unsigned long) vma, page);
...@@ -240,7 +241,7 @@ void smp_flush_page_to_ram(unsigned long page) ...@@ -240,7 +241,7 @@ void smp_flush_page_to_ram(unsigned long page)
void smp_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr) void smp_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr)
{ {
cpumask_t cpu_mask = mm->cpu_vm_mask; cpumask_t cpu_mask = *mm_cpumask(mm);
cpu_clear(smp_processor_id(), cpu_mask); cpu_clear(smp_processor_id(), cpu_mask);
if (!cpus_empty(cpu_mask)) if (!cpus_empty(cpu_mask))
xc2((smpfunc_t) BTFIXUP_CALL(local_flush_sig_insns), (unsigned long) mm, insn_addr); xc2((smpfunc_t) BTFIXUP_CALL(local_flush_sig_insns), (unsigned long) mm, insn_addr);
......
...@@ -850,7 +850,7 @@ static void tsb_sync(void *info) ...@@ -850,7 +850,7 @@ static void tsb_sync(void *info)
void smp_tsb_sync(struct mm_struct *mm) void smp_tsb_sync(struct mm_struct *mm)
{ {
smp_call_function_many(&mm->cpu_vm_mask, tsb_sync, mm, 1); smp_call_function_many(mm_cpumask(mm), tsb_sync, mm, 1);
} }
extern unsigned long xcall_flush_tlb_mm; extern unsigned long xcall_flush_tlb_mm;
...@@ -1055,13 +1055,13 @@ void smp_flush_tlb_mm(struct mm_struct *mm) ...@@ -1055,13 +1055,13 @@ void smp_flush_tlb_mm(struct mm_struct *mm)
int cpu = get_cpu(); int cpu = get_cpu();
if (atomic_read(&mm->mm_users) == 1) { if (atomic_read(&mm->mm_users) == 1) {
mm->cpu_vm_mask = cpumask_of_cpu(cpu); cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
goto local_flush_and_out; goto local_flush_and_out;
} }
smp_cross_call_masked(&xcall_flush_tlb_mm, smp_cross_call_masked(&xcall_flush_tlb_mm,
ctx, 0, 0, ctx, 0, 0,
&mm->cpu_vm_mask); mm_cpumask(mm));
local_flush_and_out: local_flush_and_out:
__flush_tlb_mm(ctx, SECONDARY_CONTEXT); __flush_tlb_mm(ctx, SECONDARY_CONTEXT);
...@@ -1075,11 +1075,11 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long ...@@ -1075,11 +1075,11 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long
int cpu = get_cpu(); int cpu = get_cpu();
if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1) if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1)
mm->cpu_vm_mask = cpumask_of_cpu(cpu); cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
else else
smp_cross_call_masked(&xcall_flush_tlb_pending, smp_cross_call_masked(&xcall_flush_tlb_pending,
ctx, nr, (unsigned long) vaddrs, ctx, nr, (unsigned long) vaddrs,
&mm->cpu_vm_mask); mm_cpumask(mm));
__flush_tlb_pending(ctx, nr, vaddrs); __flush_tlb_pending(ctx, nr, vaddrs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment