mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
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: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ed4d9c66eb
commit
ae583885bf
@ -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);
|
/* Send cross call to all processors except self. */
|
||||||
/* NOTE: Caller runs local copy on master. */
|
static void smp_cross_call(unsigned long *func, u32 ctx, u64 data1, u64 data2)
|
||||||
|
{
|
||||||
put_cpu();
|
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)
|
|||||||
&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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
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();
|
||||||
|
Loading…
Reference in New Issue
Block a user