Commit ae583885 authored by David S. Miller's avatar David S. Miller

sparc64: Remove all cpumask_t local variables in xcall dispatch.

All of the xcall delivery implementation is cpumask agnostic, so
we can pass around pointers to const cpumask_t objects everywhere.

The sad remaining case is the argument to arch_send_call_function_ipi().
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ed4d9c66
...@@ -787,21 +787,17 @@ static void xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask ...@@ -787,21 +787,17 @@ static void xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask
* except self. Really, there are only two cases currently, * except self. Really, there are only two cases currently,
* "&cpu_online_map" and "&mm->cpu_vm_mask". * "&cpu_online_map" and "&mm->cpu_vm_mask".
*/ */
static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, const cpumask_t *mask_p) static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, const cpumask_t *mask)
{ {
u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff)); u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff));
int this_cpu = get_cpu();
cpumask_t mask;
mask = *mask_p; xcall_deliver(data0, data1, data2, mask);
if (mask_p != &cpu_online_map) }
cpus_and(mask, mask, cpu_online_map);
cpu_clear(this_cpu, mask);
xcall_deliver(data0, data1, data2, &mask);
/* NOTE: Caller runs local copy on master. */
put_cpu(); /* Send cross call to all processors except self. */
static void smp_cross_call(unsigned long *func, u32 ctx, u64 data1, u64 data2)
{
smp_cross_call_masked(func, ctx, data1, data2, &cpu_online_map);
} }
extern unsigned long xcall_sync_tick; extern unsigned long xcall_sync_tick;
...@@ -827,10 +823,6 @@ void arch_send_call_function_single_ipi(int cpu) ...@@ -827,10 +823,6 @@ void arch_send_call_function_single_ipi(int cpu)
&cpumask_of_cpu(cpu)); &cpumask_of_cpu(cpu));
} }
/* Send cross call to all processors except self. */
#define smp_cross_call(func, ctx, data1, data2) \
smp_cross_call_masked(func, ctx, data1, data2, &cpu_online_map)
void smp_call_function_client(int irq, struct pt_regs *regs) void smp_call_function_client(int irq, struct pt_regs *regs)
{ {
clear_softint(1 << irq); clear_softint(1 << irq);
...@@ -900,7 +892,6 @@ static inline void __local_flush_dcache_page(struct page *page) ...@@ -900,7 +892,6 @@ static inline void __local_flush_dcache_page(struct page *page)
void smp_flush_dcache_page_impl(struct page *page, int cpu) void smp_flush_dcache_page_impl(struct page *page, int cpu)
{ {
cpumask_t mask = cpumask_of_cpu(cpu);
int this_cpu; int this_cpu;
if (tlb_type == hypervisor) if (tlb_type == hypervisor)
...@@ -929,7 +920,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) ...@@ -929,7 +920,7 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
} }
if (data0) { if (data0) {
xcall_deliver(data0, __pa(pg_addr), xcall_deliver(data0, __pa(pg_addr),
(u64) pg_addr, &mask); (u64) pg_addr, &cpumask_of_cpu(cpu));
#ifdef CONFIG_DEBUG_DCFLUSH #ifdef CONFIG_DEBUG_DCFLUSH
atomic_inc(&dcpage_flushes_xcall); atomic_inc(&dcpage_flushes_xcall);
#endif #endif
...@@ -941,7 +932,6 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) ...@@ -941,7 +932,6 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
void flush_dcache_page_all(struct mm_struct *mm, struct page *page) void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
{ {
cpumask_t mask = cpu_online_map;
void *pg_addr; void *pg_addr;
int this_cpu; int this_cpu;
u64 data0; u64 data0;
...@@ -951,13 +941,9 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page) ...@@ -951,13 +941,9 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
this_cpu = get_cpu(); this_cpu = get_cpu();
cpu_clear(this_cpu, mask);
#ifdef CONFIG_DEBUG_DCFLUSH #ifdef CONFIG_DEBUG_DCFLUSH
atomic_inc(&dcpage_flushes); atomic_inc(&dcpage_flushes);
#endif #endif
if (cpus_empty(mask))
goto flush_self;
data0 = 0; data0 = 0;
pg_addr = page_address(page); pg_addr = page_address(page);
if (tlb_type == spitfire) { if (tlb_type == spitfire) {
...@@ -971,12 +957,11 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page) ...@@ -971,12 +957,11 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
} }
if (data0) { if (data0) {
xcall_deliver(data0, __pa(pg_addr), xcall_deliver(data0, __pa(pg_addr),
(u64) pg_addr, &mask); (u64) pg_addr, &cpu_online_map);
#ifdef CONFIG_DEBUG_DCFLUSH #ifdef CONFIG_DEBUG_DCFLUSH
atomic_inc(&dcpage_flushes_xcall); atomic_inc(&dcpage_flushes_xcall);
#endif #endif
} }
flush_self:
__local_flush_dcache_page(page); __local_flush_dcache_page(page);
put_cpu(); put_cpu();
......
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