2 * linux/arch/alpha/kernel/smp.c
4 * 2001-07-09 Phil Ezolt (Phillip.Ezolt@compaq.com)
5 * Renamed modified smp_call_function to smp_call_function_on_cpu()
6 * Created an function that conforms to the old calling convention
7 * of smp_call_function().
9 * This is helpful for DCPI.
13 #include <linux/errno.h>
14 #include <linux/kernel.h>
15 #include <linux/kernel_stat.h>
16 #include <linux/module.h>
17 #include <linux/sched.h>
19 #include <linux/err.h>
20 #include <linux/threads.h>
21 #include <linux/smp.h>
22 #include <linux/interrupt.h>
23 #include <linux/init.h>
24 #include <linux/delay.h>
25 #include <linux/spinlock.h>
26 #include <linux/irq.h>
27 #include <linux/cache.h>
28 #include <linux/profile.h>
29 #include <linux/bitops.h>
31 #include <asm/hwrpb.h>
32 #include <asm/ptrace.h>
33 #include <asm/atomic.h>
37 #include <asm/pgtable.h>
38 #include <asm/pgalloc.h>
39 #include <asm/mmu_context.h>
40 #include <asm/tlbflush.h>
48 #define DBGS(args) printk args
53 /* A collection of per-processor data. */
54 struct cpuinfo_alpha cpu_data
[NR_CPUS
];
55 EXPORT_SYMBOL(cpu_data
);
57 /* A collection of single bit ipi messages. */
59 unsigned long bits ____cacheline_aligned
;
60 } ipi_data
[NR_CPUS
] __cacheline_aligned
;
62 enum ipi_message_type
{
68 /* Set to a secondary's cpuid when it comes online. */
69 static int smp_secondary_alive __devinitdata
= 0;
71 /* Which cpus ids came online. */
72 cpumask_t cpu_online_map
;
74 EXPORT_SYMBOL(cpu_online_map
);
76 int smp_num_probed
; /* Internal processor count */
77 int smp_num_cpus
= 1; /* Number that came online. */
78 EXPORT_SYMBOL(smp_num_cpus
);
81 * Called by both boot and secondaries to move global data into
82 * per-processor storage.
84 static inline void __init
85 smp_store_cpu_info(int cpuid
)
87 cpu_data
[cpuid
].loops_per_jiffy
= loops_per_jiffy
;
88 cpu_data
[cpuid
].last_asn
= ASN_FIRST_VERSION
;
89 cpu_data
[cpuid
].need_new_asn
= 0;
90 cpu_data
[cpuid
].asn_lock
= 0;
94 * Ideally sets up per-cpu profiling hooks. Doesn't do much now...
96 static inline void __init
97 smp_setup_percpu_timer(int cpuid
)
99 cpu_data
[cpuid
].prof_counter
= 1;
100 cpu_data
[cpuid
].prof_multiplier
= 1;
104 wait_boot_cpu_to_stop(int cpuid
)
106 unsigned long stop
= jiffies
+ 10*HZ
;
108 while (time_before(jiffies
, stop
)) {
109 if (!smp_secondary_alive
)
114 printk("wait_boot_cpu_to_stop: FAILED on CPU %d, hanging now\n", cpuid
);
120 * Where secondaries begin a life of C.
125 int cpuid
= hard_smp_processor_id();
127 if (cpu_test_and_set(cpuid
, cpu_online_map
)) {
128 printk("??, cpu 0x%x already present??\n", cpuid
);
132 /* Turn on machine checks. */
135 /* Set trap vectors. */
138 /* Set interrupt vector. */
141 /* Get our local ticker going. */
142 smp_setup_percpu_timer(cpuid
);
144 /* Call platform-specific callin, if specified */
145 if (alpha_mv
.smp_callin
) alpha_mv
.smp_callin();
147 /* All kernel threads share the same mm context. */
148 atomic_inc(&init_mm
.mm_count
);
149 current
->active_mm
= &init_mm
;
151 /* Must have completely accurate bogos. */
154 /* Wait boot CPU to stop with irq enabled before running
156 wait_boot_cpu_to_stop(cpuid
);
160 smp_store_cpu_info(cpuid
);
161 /* Allow master to continue only after we written loops_per_jiffy. */
163 smp_secondary_alive
= 1;
165 DBGS(("smp_callin: commencing CPU %d current %p active_mm %p\n",
166 cpuid
, current
, current
->active_mm
));
172 /* Wait until hwrpb->txrdy is clear for cpu. Return -1 on timeout. */
174 wait_for_txrdy (unsigned long cpumask
)
176 unsigned long timeout
;
178 if (!(hwrpb
->txrdy
& cpumask
))
181 timeout
= jiffies
+ 10*HZ
;
182 while (time_before(jiffies
, timeout
)) {
183 if (!(hwrpb
->txrdy
& cpumask
))
193 * Send a message to a secondary's console. "START" is one such
194 * interesting message. ;-)
197 send_secondary_console_msg(char *str
, int cpuid
)
199 struct percpu_struct
*cpu
;
200 register char *cp1
, *cp2
;
201 unsigned long cpumask
;
204 cpu
= (struct percpu_struct
*)
206 + hwrpb
->processor_offset
207 + cpuid
* hwrpb
->processor_size
);
209 cpumask
= (1UL << cpuid
);
210 if (wait_for_txrdy(cpumask
))
215 *(unsigned int *)&cpu
->ipc_buffer
[0] = len
;
216 cp1
= (char *) &cpu
->ipc_buffer
[1];
217 memcpy(cp1
, cp2
, len
);
219 /* atomic test and set */
221 set_bit(cpuid
, &hwrpb
->rxrdy
);
223 if (wait_for_txrdy(cpumask
))
228 printk("Processor %x not ready\n", cpuid
);
232 * A secondary console wants to send a message. Receive it.
235 recv_secondary_console_msg(void)
238 unsigned long txrdy
= hwrpb
->txrdy
;
239 char *cp1
, *cp2
, buf
[80];
240 struct percpu_struct
*cpu
;
242 DBGS(("recv_secondary_console_msg: TXRDY 0x%lx.\n", txrdy
));
244 mycpu
= hard_smp_processor_id();
246 for (i
= 0; i
< NR_CPUS
; i
++) {
247 if (!(txrdy
& (1UL << i
)))
250 DBGS(("recv_secondary_console_msg: "
251 "TXRDY contains CPU %d.\n", i
));
253 cpu
= (struct percpu_struct
*)
255 + hwrpb
->processor_offset
256 + i
* hwrpb
->processor_size
);
258 DBGS(("recv_secondary_console_msg: on %d from %d"
259 " HALT_REASON 0x%lx FLAGS 0x%lx\n",
260 mycpu
, i
, cpu
->halt_reason
, cpu
->flags
));
262 cnt
= cpu
->ipc_buffer
[0] >> 32;
263 if (cnt
<= 0 || cnt
>= 80)
264 strcpy(buf
, "<<< BOGUS MSG >>>");
266 cp1
= (char *) &cpu
->ipc_buffer
[11];
270 while ((cp2
= strchr(cp2
, '\r')) != 0) {
277 DBGS((KERN_INFO
"recv_secondary_console_msg: on %d "
278 "message is '%s'\n", mycpu
, buf
));
285 * Convince the console to have a secondary cpu begin execution.
288 secondary_cpu_start(int cpuid
, struct task_struct
*idle
)
290 struct percpu_struct
*cpu
;
291 struct pcb_struct
*hwpcb
, *ipcb
;
292 unsigned long timeout
;
294 cpu
= (struct percpu_struct
*)
296 + hwrpb
->processor_offset
297 + cpuid
* hwrpb
->processor_size
);
298 hwpcb
= (struct pcb_struct
*) cpu
->hwpcb
;
299 ipcb
= &task_thread_info(idle
)->pcb
;
301 /* Initialize the CPU's HWPCB to something just good enough for
302 us to get started. Immediately after starting, we'll swpctx
303 to the target idle task's pcb. Reuse the stack in the mean
304 time. Precalculate the target PCBB. */
305 hwpcb
->ksp
= (unsigned long)ipcb
+ sizeof(union thread_union
) - 16;
307 hwpcb
->ptbr
= ipcb
->ptbr
;
310 hwpcb
->unique
= virt_to_phys(ipcb
);
311 hwpcb
->flags
= ipcb
->flags
;
312 hwpcb
->res1
= hwpcb
->res2
= 0;
315 DBGS(("KSP 0x%lx PTBR 0x%lx VPTBR 0x%lx UNIQUE 0x%lx\n",
316 hwpcb
->ksp
, hwpcb
->ptbr
, hwrpb
->vptb
, hwpcb
->unique
));
318 DBGS(("Starting secondary cpu %d: state 0x%lx pal_flags 0x%lx\n",
319 cpuid
, idle
->state
, ipcb
->flags
));
321 /* Setup HWRPB fields that SRM uses to activate secondary CPU */
322 hwrpb
->CPU_restart
= __smp_callin
;
323 hwrpb
->CPU_restart_data
= (unsigned long) __smp_callin
;
325 /* Recalculate and update the HWRPB checksum */
326 hwrpb_update_checksum(hwrpb
);
329 * Send a "start" command to the specified processor.
332 /* SRM III 3.4.1.3 */
333 cpu
->flags
|= 0x22; /* turn on Context Valid and Restart Capable */
334 cpu
->flags
&= ~1; /* turn off Bootstrap In Progress */
337 send_secondary_console_msg("START\r\n", cpuid
);
339 /* Wait 10 seconds for an ACK from the console. */
340 timeout
= jiffies
+ 10*HZ
;
341 while (time_before(jiffies
, timeout
)) {
347 printk(KERN_ERR
"SMP: Processor %d failed to start.\n", cpuid
);
351 DBGS(("secondary_cpu_start: SUCCESS for CPU %d!!!\n", cpuid
));
356 * Bring one cpu online.
359 smp_boot_one_cpu(int cpuid
)
361 struct task_struct
*idle
;
362 unsigned long timeout
;
364 /* Cook up an idler for this guy. Note that the address we
365 give to kernel_thread is irrelevant -- it's going to start
366 where HWRPB.CPU_restart says to start. But this gets all
367 the other task-y sort of data structures set up like we
368 wish. We can't use kernel_thread since we must avoid
369 rescheduling the child. */
370 idle
= fork_idle(cpuid
);
372 panic("failed fork for CPU %d", cpuid
);
374 DBGS(("smp_boot_one_cpu: CPU %d state 0x%lx flags 0x%lx\n",
375 cpuid
, idle
->state
, idle
->flags
));
377 /* Signal the secondary to wait a moment. */
378 smp_secondary_alive
= -1;
380 /* Whirrr, whirrr, whirrrrrrrrr... */
381 if (secondary_cpu_start(cpuid
, idle
))
384 /* Notify the secondary CPU it can run calibrate_delay. */
386 smp_secondary_alive
= 0;
388 /* We've been acked by the console; wait one second for
389 the task to start up for real. */
390 timeout
= jiffies
+ 1*HZ
;
391 while (time_before(jiffies
, timeout
)) {
392 if (smp_secondary_alive
== 1)
398 /* We failed to boot the CPU. */
400 printk(KERN_ERR
"SMP: Processor %d is stuck.\n", cpuid
);
404 /* Another "Red Snapper". */
409 * Called from setup_arch. Detect an SMP system and which processors
415 struct percpu_struct
*cpubase
, *cpu
;
418 if (boot_cpuid
!= 0) {
419 printk(KERN_WARNING
"SMP: Booting off cpu %d instead of 0?\n",
423 if (hwrpb
->nr_processors
> 1) {
426 DBGS(("setup_smp: nr_processors %ld\n",
427 hwrpb
->nr_processors
));
429 cpubase
= (struct percpu_struct
*)
430 ((char*)hwrpb
+ hwrpb
->processor_offset
);
431 boot_cpu_palrev
= cpubase
->pal_revision
;
433 for (i
= 0; i
< hwrpb
->nr_processors
; i
++) {
434 cpu
= (struct percpu_struct
*)
435 ((char *)cpubase
+ i
*hwrpb
->processor_size
);
436 if ((cpu
->flags
& 0x1cc) == 0x1cc) {
438 cpu_set(i
, cpu_present_map
);
439 cpu
->pal_revision
= boot_cpu_palrev
;
442 DBGS(("setup_smp: CPU %d: flags 0x%lx type 0x%lx\n",
443 i
, cpu
->flags
, cpu
->type
));
444 DBGS(("setup_smp: CPU %d: PAL rev 0x%lx\n",
445 i
, cpu
->pal_revision
));
451 printk(KERN_INFO
"SMP: %d CPUs probed -- cpu_present_map = %lx\n",
452 smp_num_probed
, cpu_present_map
.bits
[0]);
456 * Called by smp_init prepare the secondaries
459 smp_prepare_cpus(unsigned int max_cpus
)
461 /* Take care of some initial bookkeeping. */
462 memset(ipi_data
, 0, sizeof(ipi_data
));
464 current_thread_info()->cpu
= boot_cpuid
;
466 smp_store_cpu_info(boot_cpuid
);
467 smp_setup_percpu_timer(boot_cpuid
);
469 /* Nothing to do on a UP box, or when told not to. */
470 if (smp_num_probed
== 1 || max_cpus
== 0) {
471 cpu_present_map
= cpumask_of_cpu(boot_cpuid
);
472 printk(KERN_INFO
"SMP mode deactivated.\n");
476 printk(KERN_INFO
"SMP starting up secondaries.\n");
478 smp_num_cpus
= smp_num_probed
;
482 smp_prepare_boot_cpu(void)
487 __cpu_up(unsigned int cpu
)
489 smp_boot_one_cpu(cpu
);
491 return cpu_online(cpu
) ? 0 : -ENOSYS
;
495 smp_cpus_done(unsigned int max_cpus
)
498 unsigned long bogosum
= 0;
500 for(cpu
= 0; cpu
< NR_CPUS
; cpu
++)
502 bogosum
+= cpu_data
[cpu
].loops_per_jiffy
;
504 printk(KERN_INFO
"SMP: Total of %d processors activated "
505 "(%lu.%02lu BogoMIPS).\n",
507 (bogosum
+ 2500) / (500000/HZ
),
508 ((bogosum
+ 2500) / (5000/HZ
)) % 100);
513 smp_percpu_timer_interrupt(struct pt_regs
*regs
)
515 struct pt_regs
*old_regs
;
516 int cpu
= smp_processor_id();
517 unsigned long user
= user_mode(regs
);
518 struct cpuinfo_alpha
*data
= &cpu_data
[cpu
];
520 old_regs
= set_irq_regs(regs
);
522 /* Record kernel PC. */
523 profile_tick(CPU_PROFILING
);
525 if (!--data
->prof_counter
) {
526 /* We need to make like a normal interrupt -- otherwise
527 timer interrupts ignore the global interrupt lock,
528 which would be a Bad Thing. */
531 update_process_times(user
);
533 data
->prof_counter
= data
->prof_multiplier
;
537 set_irq_regs(old_regs
);
541 setup_profiling_timer(unsigned int multiplier
)
548 send_ipi_message(cpumask_t to_whom
, enum ipi_message_type operation
)
553 for_each_cpu_mask(i
, to_whom
)
554 set_bit(operation
, &ipi_data
[i
].bits
);
557 for_each_cpu_mask(i
, to_whom
)
561 /* Structure and data for smp_call_function. This is designed to
562 minimize static memory requirements. Plus it looks cleaner. */
564 struct smp_call_struct
{
565 void (*func
) (void *info
);
568 atomic_t unstarted_count
;
569 atomic_t unfinished_count
;
572 static struct smp_call_struct
*smp_call_function_data
;
574 /* Atomicly drop data into a shared pointer. The pointer is free if
575 it is initially locked. If retry, spin until free. */
578 pointer_lock (void *lock
, void *data
, int retry
)
584 /* Compare and swap with zero. */
592 : "=&r"(old
), "=m"(*(void **)lock
), "=&r"(tmp
)
601 while (*(void **)lock
)
607 handle_ipi(struct pt_regs
*regs
)
609 int this_cpu
= smp_processor_id();
610 unsigned long *pending_ipis
= &ipi_data
[this_cpu
].bits
;
614 DBGS(("handle_ipi: on CPU %d ops 0x%lx PC 0x%lx\n",
615 this_cpu
, *pending_ipis
, regs
->pc
));
618 mb(); /* Order interrupt and bit testing. */
619 while ((ops
= xchg(pending_ipis
, 0)) != 0) {
620 mb(); /* Order bit clearing and data access. */
626 which
= __ffs(which
);
630 /* Reschedule callback. Everything to be done
631 is done by the interrupt return path. */
636 struct smp_call_struct
*data
;
637 void (*func
)(void *info
);
641 data
= smp_call_function_data
;
646 /* Notify the sending CPU that the data has been
647 received, and execution is about to begin. */
649 atomic_dec (&data
->unstarted_count
);
651 /* At this point the structure may be gone unless
655 /* Notify the sending CPU that the task is done. */
657 if (wait
) atomic_dec (&data
->unfinished_count
);
665 printk(KERN_CRIT
"Unknown IPI on CPU %d: %lu\n",
671 mb(); /* Order data access and bit testing. */
674 cpu_data
[this_cpu
].ipi_count
++;
677 recv_secondary_console_msg();
681 smp_send_reschedule(int cpu
)
684 if (cpu
== hard_smp_processor_id())
686 "smp_send_reschedule: Sending IPI to self.\n");
688 send_ipi_message(cpumask_of_cpu(cpu
), IPI_RESCHEDULE
);
694 cpumask_t to_whom
= cpu_possible_map
;
695 cpu_clear(smp_processor_id(), to_whom
);
697 if (hard_smp_processor_id() != boot_cpu_id
)
698 printk(KERN_WARNING
"smp_send_stop: Not on boot cpu.\n");
700 send_ipi_message(to_whom
, IPI_CPU_STOP
);
704 * Run a function on all other CPUs.
705 * <func> The function to run. This must be fast and non-blocking.
706 * <info> An arbitrary pointer to pass to the function.
707 * <retry> If true, keep retrying until ready.
708 * <wait> If true, wait until function has completed on other CPUs.
709 * [RETURNS] 0 on success, else a negative status code.
711 * Does not return until remote CPUs are nearly ready to execute <func>
712 * or are or have executed.
713 * You must not call this function with disabled interrupts or from a
714 * hardware interrupt handler or from a bottom half handler.
718 smp_call_function_on_cpu (void (*func
) (void *info
), void *info
, int retry
,
719 int wait
, cpumask_t to_whom
)
721 struct smp_call_struct data
;
722 unsigned long timeout
;
723 int num_cpus_to_call
;
725 /* Can deadlock when called with interrupts disabled */
726 WARN_ON(irqs_disabled());
732 cpu_clear(smp_processor_id(), to_whom
);
733 num_cpus_to_call
= cpus_weight(to_whom
);
735 atomic_set(&data
.unstarted_count
, num_cpus_to_call
);
736 atomic_set(&data
.unfinished_count
, num_cpus_to_call
);
738 /* Acquire the smp_call_function_data mutex. */
739 if (pointer_lock(&smp_call_function_data
, &data
, retry
))
742 /* Send a message to the requested CPUs. */
743 send_ipi_message(to_whom
, IPI_CALL_FUNC
);
745 /* Wait for a minimal response. */
746 timeout
= jiffies
+ HZ
;
747 while (atomic_read (&data
.unstarted_count
) > 0
748 && time_before (jiffies
, timeout
))
751 /* If there's no response yet, log a message but allow a longer
752 * timeout period -- if we get a response this time, log
753 * a message saying when we got it..
755 if (atomic_read(&data
.unstarted_count
) > 0) {
756 long start_time
= jiffies
;
757 printk(KERN_ERR
"%s: initial timeout -- trying long wait\n",
759 timeout
= jiffies
+ 30 * HZ
;
760 while (atomic_read(&data
.unstarted_count
) > 0
761 && time_before(jiffies
, timeout
))
763 if (atomic_read(&data
.unstarted_count
) <= 0) {
764 long delta
= jiffies
- start_time
;
766 "%s: response %ld.%ld seconds into long wait\n",
767 __FUNCTION__
, delta
/ HZ
,
768 (100 * (delta
- ((delta
/ HZ
) * HZ
))) / HZ
);
772 /* We either got one or timed out -- clear the lock. */
774 smp_call_function_data
= NULL
;
777 * If after both the initial and long timeout periods we still don't
778 * have a response, something is very wrong...
780 BUG_ON(atomic_read (&data
.unstarted_count
) > 0);
782 /* Wait for a complete response, if needed. */
784 while (atomic_read (&data
.unfinished_count
) > 0)
790 EXPORT_SYMBOL(smp_call_function_on_cpu
);
793 smp_call_function (void (*func
) (void *info
), void *info
, int retry
, int wait
)
795 return smp_call_function_on_cpu (func
, info
, retry
, wait
,
798 EXPORT_SYMBOL(smp_call_function
);
801 ipi_imb(void *ignored
)
809 /* Must wait other processors to flush their icache before continue. */
810 if (on_each_cpu(ipi_imb
, NULL
, 1, 1))
811 printk(KERN_CRIT
"smp_imb: timed out\n");
813 EXPORT_SYMBOL(smp_imb
);
816 ipi_flush_tlb_all(void *ignored
)
824 /* Although we don't have any data to pass, we do want to
825 synchronize with the other processors. */
826 if (on_each_cpu(ipi_flush_tlb_all
, NULL
, 1, 1)) {
827 printk(KERN_CRIT
"flush_tlb_all: timed out\n");
831 #define asn_locked() (cpu_data[smp_processor_id()].asn_lock)
834 ipi_flush_tlb_mm(void *x
)
836 struct mm_struct
*mm
= (struct mm_struct
*) x
;
837 if (mm
== current
->active_mm
&& !asn_locked())
838 flush_tlb_current(mm
);
844 flush_tlb_mm(struct mm_struct
*mm
)
848 if (mm
== current
->active_mm
) {
849 flush_tlb_current(mm
);
850 if (atomic_read(&mm
->mm_users
) <= 1) {
851 int cpu
, this_cpu
= smp_processor_id();
852 for (cpu
= 0; cpu
< NR_CPUS
; cpu
++) {
853 if (!cpu_online(cpu
) || cpu
== this_cpu
)
855 if (mm
->context
[cpu
])
856 mm
->context
[cpu
] = 0;
863 if (smp_call_function(ipi_flush_tlb_mm
, mm
, 1, 1)) {
864 printk(KERN_CRIT
"flush_tlb_mm: timed out\n");
869 EXPORT_SYMBOL(flush_tlb_mm
);
871 struct flush_tlb_page_struct
{
872 struct vm_area_struct
*vma
;
873 struct mm_struct
*mm
;
878 ipi_flush_tlb_page(void *x
)
880 struct flush_tlb_page_struct
*data
= (struct flush_tlb_page_struct
*)x
;
881 struct mm_struct
* mm
= data
->mm
;
883 if (mm
== current
->active_mm
&& !asn_locked())
884 flush_tlb_current_page(mm
, data
->vma
, data
->addr
);
890 flush_tlb_page(struct vm_area_struct
*vma
, unsigned long addr
)
892 struct flush_tlb_page_struct data
;
893 struct mm_struct
*mm
= vma
->vm_mm
;
897 if (mm
== current
->active_mm
) {
898 flush_tlb_current_page(mm
, vma
, addr
);
899 if (atomic_read(&mm
->mm_users
) <= 1) {
900 int cpu
, this_cpu
= smp_processor_id();
901 for (cpu
= 0; cpu
< NR_CPUS
; cpu
++) {
902 if (!cpu_online(cpu
) || cpu
== this_cpu
)
904 if (mm
->context
[cpu
])
905 mm
->context
[cpu
] = 0;
916 if (smp_call_function(ipi_flush_tlb_page
, &data
, 1, 1)) {
917 printk(KERN_CRIT
"flush_tlb_page: timed out\n");
922 EXPORT_SYMBOL(flush_tlb_page
);
925 flush_tlb_range(struct vm_area_struct
*vma
, unsigned long start
, unsigned long end
)
927 /* On the Alpha we always flush the whole user tlb. */
928 flush_tlb_mm(vma
->vm_mm
);
930 EXPORT_SYMBOL(flush_tlb_range
);
933 ipi_flush_icache_page(void *x
)
935 struct mm_struct
*mm
= (struct mm_struct
*) x
;
936 if (mm
== current
->active_mm
&& !asn_locked())
937 __load_new_mm_context(mm
);
943 flush_icache_user_range(struct vm_area_struct
*vma
, struct page
*page
,
944 unsigned long addr
, int len
)
946 struct mm_struct
*mm
= vma
->vm_mm
;
948 if ((vma
->vm_flags
& VM_EXEC
) == 0)
953 if (mm
== current
->active_mm
) {
954 __load_new_mm_context(mm
);
955 if (atomic_read(&mm
->mm_users
) <= 1) {
956 int cpu
, this_cpu
= smp_processor_id();
957 for (cpu
= 0; cpu
< NR_CPUS
; cpu
++) {
958 if (!cpu_online(cpu
) || cpu
== this_cpu
)
960 if (mm
->context
[cpu
])
961 mm
->context
[cpu
] = 0;
968 if (smp_call_function(ipi_flush_icache_page
, mm
, 1, 1)) {
969 printk(KERN_CRIT
"flush_icache_page: timed out\n");