xref: /openbmc/linux/arch/alpha/kernel/smp.c (revision 4c8c3c7f)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *	linux/arch/alpha/kernel/smp.c
4  *
5  *      2001-07-09 Phil Ezolt (Phillip.Ezolt@compaq.com)
6  *            Renamed modified smp_call_function to smp_call_function_on_cpu()
7  *            Created an function that conforms to the old calling convention
8  *            of smp_call_function().
9  *
10  *            This is helpful for DCPI.
11  *
12  */
13 
14 #include <linux/errno.h>
15 #include <linux/kernel.h>
16 #include <linux/kernel_stat.h>
17 #include <linux/module.h>
18 #include <linux/sched/mm.h>
19 #include <linux/mm.h>
20 #include <linux/err.h>
21 #include <linux/threads.h>
22 #include <linux/smp.h>
23 #include <linux/interrupt.h>
24 #include <linux/init.h>
25 #include <linux/delay.h>
26 #include <linux/spinlock.h>
27 #include <linux/irq.h>
28 #include <linux/cache.h>
29 #include <linux/profile.h>
30 #include <linux/bitops.h>
31 #include <linux/cpu.h>
32 
33 #include <asm/hwrpb.h>
34 #include <asm/ptrace.h>
35 #include <linux/atomic.h>
36 
37 #include <asm/io.h>
38 #include <asm/irq.h>
39 #include <asm/mmu_context.h>
40 #include <asm/tlbflush.h>
41 
42 #include "proto.h"
43 #include "irq_impl.h"
44 
45 
46 #define DEBUG_SMP 0
47 #if DEBUG_SMP
48 #define DBGS(args)	printk args
49 #else
50 #define DBGS(args)
51 #endif
52 
53 /* A collection of per-processor data.  */
54 struct cpuinfo_alpha cpu_data[NR_CPUS];
55 EXPORT_SYMBOL(cpu_data);
56 
57 /* A collection of single bit ipi messages.  */
58 static struct {
59 	unsigned long bits ____cacheline_aligned;
60 } ipi_data[NR_CPUS] __cacheline_aligned;
61 
62 enum ipi_message_type {
63 	IPI_RESCHEDULE,
64 	IPI_CALL_FUNC,
65 	IPI_CPU_STOP,
66 };
67 
68 /* Set to a secondary's cpuid when it comes online.  */
69 static int smp_secondary_alive = 0;
70 
71 int smp_num_probed;		/* Internal processor count */
72 int smp_num_cpus = 1;		/* Number that came online.  */
73 EXPORT_SYMBOL(smp_num_cpus);
74 
75 /*
76  * Called by both boot and secondaries to move global data into
77  *  per-processor storage.
78  */
79 static inline void __init
smp_store_cpu_info(int cpuid)80 smp_store_cpu_info(int cpuid)
81 {
82 	cpu_data[cpuid].loops_per_jiffy = loops_per_jiffy;
83 	cpu_data[cpuid].last_asn = ASN_FIRST_VERSION;
84 	cpu_data[cpuid].need_new_asn = 0;
85 	cpu_data[cpuid].asn_lock = 0;
86 }
87 
88 /*
89  * Ideally sets up per-cpu profiling hooks.  Doesn't do much now...
90  */
91 static inline void __init
smp_setup_percpu_timer(int cpuid)92 smp_setup_percpu_timer(int cpuid)
93 {
94 	cpu_data[cpuid].prof_counter = 1;
95 	cpu_data[cpuid].prof_multiplier = 1;
96 }
97 
98 static void __init
wait_boot_cpu_to_stop(int cpuid)99 wait_boot_cpu_to_stop(int cpuid)
100 {
101 	unsigned long stop = jiffies + 10*HZ;
102 
103 	while (time_before(jiffies, stop)) {
104 	        if (!smp_secondary_alive)
105 			return;
106 		barrier();
107 	}
108 
109 	printk("wait_boot_cpu_to_stop: FAILED on CPU %d, hanging now\n", cpuid);
110 	for (;;)
111 		barrier();
112 }
113 
114 /*
115  * Where secondaries begin a life of C.
116  */
117 void __init
smp_callin(void)118 smp_callin(void)
119 {
120 	int cpuid = hard_smp_processor_id();
121 
122 	if (cpu_online(cpuid)) {
123 		printk("??, cpu 0x%x already present??\n", cpuid);
124 		BUG();
125 	}
126 	set_cpu_online(cpuid, true);
127 
128 	/* Turn on machine checks.  */
129 	wrmces(7);
130 
131 	/* Set trap vectors.  */
132 	trap_init();
133 
134 	/* Set interrupt vector.  */
135 	wrent(entInt, 0);
136 
137 	/* Get our local ticker going. */
138 	smp_setup_percpu_timer(cpuid);
139 	init_clockevent();
140 
141 	/* Call platform-specific callin, if specified */
142 	if (alpha_mv.smp_callin)
143 		alpha_mv.smp_callin();
144 
145 	/* All kernel threads share the same mm context.  */
146 	mmgrab(&init_mm);
147 	current->active_mm = &init_mm;
148 
149 	/* inform the notifiers about the new cpu */
150 	notify_cpu_starting(cpuid);
151 
152 	/* Must have completely accurate bogos.  */
153 	local_irq_enable();
154 
155 	/* Wait boot CPU to stop with irq enabled before running
156 	   calibrate_delay. */
157 	wait_boot_cpu_to_stop(cpuid);
158 	mb();
159 	calibrate_delay();
160 
161 	smp_store_cpu_info(cpuid);
162 	/* Allow master to continue only after we written loops_per_jiffy.  */
163 	wmb();
164 	smp_secondary_alive = 1;
165 
166 	DBGS(("smp_callin: commencing CPU %d current %p active_mm %p\n",
167 	      cpuid, current, current->active_mm));
168 
169 	cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
170 }
171 
172 /* Wait until hwrpb->txrdy is clear for cpu.  Return -1 on timeout.  */
173 static int
wait_for_txrdy(unsigned long cpumask)174 wait_for_txrdy (unsigned long cpumask)
175 {
176 	unsigned long timeout;
177 
178 	if (!(hwrpb->txrdy & cpumask))
179 		return 0;
180 
181 	timeout = jiffies + 10*HZ;
182 	while (time_before(jiffies, timeout)) {
183 		if (!(hwrpb->txrdy & cpumask))
184 			return 0;
185 		udelay(10);
186 		barrier();
187 	}
188 
189 	return -1;
190 }
191 
192 /*
193  * Send a message to a secondary's console.  "START" is one such
194  * interesting message.  ;-)
195  */
196 static void
send_secondary_console_msg(char * str,int cpuid)197 send_secondary_console_msg(char *str, int cpuid)
198 {
199 	struct percpu_struct *cpu;
200 	register char *cp1, *cp2;
201 	unsigned long cpumask;
202 	size_t len;
203 
204 	cpu = (struct percpu_struct *)
205 		((char*)hwrpb
206 		 + hwrpb->processor_offset
207 		 + cpuid * hwrpb->processor_size);
208 
209 	cpumask = (1UL << cpuid);
210 	if (wait_for_txrdy(cpumask))
211 		goto timeout;
212 
213 	cp2 = str;
214 	len = strlen(cp2);
215 	*(unsigned int *)&cpu->ipc_buffer[0] = len;
216 	cp1 = (char *) &cpu->ipc_buffer[1];
217 	memcpy(cp1, cp2, len);
218 
219 	/* atomic test and set */
220 	wmb();
221 	set_bit(cpuid, &hwrpb->rxrdy);
222 
223 	if (wait_for_txrdy(cpumask))
224 		goto timeout;
225 	return;
226 
227  timeout:
228 	printk("Processor %x not ready\n", cpuid);
229 }
230 
231 /*
232  * A secondary console wants to send a message.  Receive it.
233  */
234 static void
recv_secondary_console_msg(void)235 recv_secondary_console_msg(void)
236 {
237 	int mycpu, i, cnt;
238 	unsigned long txrdy = hwrpb->txrdy;
239 	char *cp1, *cp2, buf[80];
240 	struct percpu_struct *cpu;
241 
242 	DBGS(("recv_secondary_console_msg: TXRDY 0x%lx.\n", txrdy));
243 
244 	mycpu = hard_smp_processor_id();
245 
246 	for (i = 0; i < NR_CPUS; i++) {
247 		if (!(txrdy & (1UL << i)))
248 			continue;
249 
250 		DBGS(("recv_secondary_console_msg: "
251 		      "TXRDY contains CPU %d.\n", i));
252 
253 		cpu = (struct percpu_struct *)
254 		  ((char*)hwrpb
255 		   + hwrpb->processor_offset
256 		   + i * hwrpb->processor_size);
257 
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));
261 
262 		cnt = cpu->ipc_buffer[0] >> 32;
263 		if (cnt <= 0 || cnt >= 80)
264 			strcpy(buf, "<<< BOGUS MSG >>>");
265 		else {
266 			cp1 = (char *) &cpu->ipc_buffer[1];
267 			cp2 = buf;
268 			memcpy(cp2, cp1, cnt);
269 			cp2[cnt] = '\0';
270 
271 			while ((cp2 = strchr(cp2, '\r')) != 0) {
272 				*cp2 = ' ';
273 				if (cp2[1] == '\n')
274 					cp2[1] = ' ';
275 			}
276 		}
277 
278 		DBGS((KERN_INFO "recv_secondary_console_msg: on %d "
279 		      "message is '%s'\n", mycpu, buf));
280 	}
281 
282 	hwrpb->txrdy = 0;
283 }
284 
285 /*
286  * Convince the console to have a secondary cpu begin execution.
287  */
288 static int
secondary_cpu_start(int cpuid,struct task_struct * idle)289 secondary_cpu_start(int cpuid, struct task_struct *idle)
290 {
291 	struct percpu_struct *cpu;
292 	struct pcb_struct *hwpcb, *ipcb;
293 	unsigned long timeout;
294 
295 	cpu = (struct percpu_struct *)
296 		((char*)hwrpb
297 		 + hwrpb->processor_offset
298 		 + cpuid * hwrpb->processor_size);
299 	hwpcb = (struct pcb_struct *) cpu->hwpcb;
300 	ipcb = &task_thread_info(idle)->pcb;
301 
302 	/* Initialize the CPU's HWPCB to something just good enough for
303 	   us to get started.  Immediately after starting, we'll swpctx
304 	   to the target idle task's pcb.  Reuse the stack in the mean
305 	   time.  Precalculate the target PCBB.  */
306 	hwpcb->ksp = (unsigned long)ipcb + sizeof(union thread_union) - 16;
307 	hwpcb->usp = 0;
308 	hwpcb->ptbr = ipcb->ptbr;
309 	hwpcb->pcc = 0;
310 	hwpcb->asn = 0;
311 	hwpcb->unique = virt_to_phys(ipcb);
312 	hwpcb->flags = ipcb->flags;
313 	hwpcb->res1 = hwpcb->res2 = 0;
314 
315 #if 0
316 	DBGS(("KSP 0x%lx PTBR 0x%lx VPTBR 0x%lx UNIQUE 0x%lx\n",
317 	      hwpcb->ksp, hwpcb->ptbr, hwrpb->vptb, hwpcb->unique));
318 #endif
319 	DBGS(("Starting secondary cpu %d: state 0x%lx pal_flags 0x%lx\n",
320 	      cpuid, idle->state, ipcb->flags));
321 
322 	/* Setup HWRPB fields that SRM uses to activate secondary CPU */
323 	hwrpb->CPU_restart = __smp_callin;
324 	hwrpb->CPU_restart_data = (unsigned long) __smp_callin;
325 
326 	/* Recalculate and update the HWRPB checksum */
327 	hwrpb_update_checksum(hwrpb);
328 
329 	/*
330 	 * Send a "start" command to the specified processor.
331 	 */
332 
333 	/* SRM III 3.4.1.3 */
334 	cpu->flags |= 0x22;	/* turn on Context Valid and Restart Capable */
335 	cpu->flags &= ~1;	/* turn off Bootstrap In Progress */
336 	wmb();
337 
338 	send_secondary_console_msg("START\r\n", cpuid);
339 
340 	/* Wait 10 seconds for an ACK from the console.  */
341 	timeout = jiffies + 10*HZ;
342 	while (time_before(jiffies, timeout)) {
343 		if (cpu->flags & 1)
344 			goto started;
345 		udelay(10);
346 		barrier();
347 	}
348 	printk(KERN_ERR "SMP: Processor %d failed to start.\n", cpuid);
349 	return -1;
350 
351  started:
352 	DBGS(("secondary_cpu_start: SUCCESS for CPU %d!!!\n", cpuid));
353 	return 0;
354 }
355 
356 /*
357  * Bring one cpu online.
358  */
359 static int
smp_boot_one_cpu(int cpuid,struct task_struct * idle)360 smp_boot_one_cpu(int cpuid, struct task_struct *idle)
361 {
362 	unsigned long timeout;
363 
364 	/* Signal the secondary to wait a moment.  */
365 	smp_secondary_alive = -1;
366 
367 	/* Whirrr, whirrr, whirrrrrrrrr... */
368 	if (secondary_cpu_start(cpuid, idle))
369 		return -1;
370 
371 	/* Notify the secondary CPU it can run calibrate_delay.  */
372 	mb();
373 	smp_secondary_alive = 0;
374 
375 	/* We've been acked by the console; wait one second for
376 	   the task to start up for real.  */
377 	timeout = jiffies + 1*HZ;
378 	while (time_before(jiffies, timeout)) {
379 		if (smp_secondary_alive == 1)
380 			goto alive;
381 		udelay(10);
382 		barrier();
383 	}
384 
385 	/* We failed to boot the CPU.  */
386 
387 	printk(KERN_ERR "SMP: Processor %d is stuck.\n", cpuid);
388 	return -1;
389 
390  alive:
391 	/* Another "Red Snapper". */
392 	return 0;
393 }
394 
395 /*
396  * Called from setup_arch.  Detect an SMP system and which processors
397  * are present.
398  */
399 void __init
setup_smp(void)400 setup_smp(void)
401 {
402 	struct percpu_struct *cpubase, *cpu;
403 	unsigned long i;
404 
405 	if (boot_cpuid != 0) {
406 		printk(KERN_WARNING "SMP: Booting off cpu %d instead of 0?\n",
407 		       boot_cpuid);
408 	}
409 
410 	if (hwrpb->nr_processors > 1) {
411 		int boot_cpu_palrev;
412 
413 		DBGS(("setup_smp: nr_processors %ld\n",
414 		      hwrpb->nr_processors));
415 
416 		cpubase = (struct percpu_struct *)
417 			((char*)hwrpb + hwrpb->processor_offset);
418 		boot_cpu_palrev = cpubase->pal_revision;
419 
420 		for (i = 0; i < hwrpb->nr_processors; i++) {
421 			cpu = (struct percpu_struct *)
422 				((char *)cpubase + i*hwrpb->processor_size);
423 			if ((cpu->flags & 0x1cc) == 0x1cc) {
424 				smp_num_probed++;
425 				set_cpu_possible(i, true);
426 				set_cpu_present(i, true);
427 				cpu->pal_revision = boot_cpu_palrev;
428 			}
429 
430 			DBGS(("setup_smp: CPU %d: flags 0x%lx type 0x%lx\n",
431 			      i, cpu->flags, cpu->type));
432 			DBGS(("setup_smp: CPU %d: PAL rev 0x%lx\n",
433 			      i, cpu->pal_revision));
434 		}
435 	} else {
436 		smp_num_probed = 1;
437 	}
438 
439 	printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
440 	       smp_num_probed, cpumask_bits(cpu_present_mask)[0]);
441 }
442 
443 /*
444  * Called by smp_init prepare the secondaries
445  */
446 void __init
smp_prepare_cpus(unsigned int max_cpus)447 smp_prepare_cpus(unsigned int max_cpus)
448 {
449 	/* Take care of some initial bookkeeping.  */
450 	memset(ipi_data, 0, sizeof(ipi_data));
451 
452 	current_thread_info()->cpu = boot_cpuid;
453 
454 	smp_store_cpu_info(boot_cpuid);
455 	smp_setup_percpu_timer(boot_cpuid);
456 
457 	/* Nothing to do on a UP box, or when told not to.  */
458 	if (smp_num_probed == 1 || max_cpus == 0) {
459 		init_cpu_possible(cpumask_of(boot_cpuid));
460 		init_cpu_present(cpumask_of(boot_cpuid));
461 		printk(KERN_INFO "SMP mode deactivated.\n");
462 		return;
463 	}
464 
465 	printk(KERN_INFO "SMP starting up secondaries.\n");
466 
467 	smp_num_cpus = smp_num_probed;
468 }
469 
470 void
smp_prepare_boot_cpu(void)471 smp_prepare_boot_cpu(void)
472 {
473 }
474 
475 int
__cpu_up(unsigned int cpu,struct task_struct * tidle)476 __cpu_up(unsigned int cpu, struct task_struct *tidle)
477 {
478 	smp_boot_one_cpu(cpu, tidle);
479 
480 	return cpu_online(cpu) ? 0 : -ENOSYS;
481 }
482 
483 void __init
smp_cpus_done(unsigned int max_cpus)484 smp_cpus_done(unsigned int max_cpus)
485 {
486 	int cpu;
487 	unsigned long bogosum = 0;
488 
489 	for(cpu = 0; cpu < NR_CPUS; cpu++)
490 		if (cpu_online(cpu))
491 			bogosum += cpu_data[cpu].loops_per_jiffy;
492 
493 	printk(KERN_INFO "SMP: Total of %d processors activated "
494 	       "(%lu.%02lu BogoMIPS).\n",
495 	       num_online_cpus(),
496 	       (bogosum + 2500) / (500000/HZ),
497 	       ((bogosum + 2500) / (5000/HZ)) % 100);
498 }
499 
500 static void
send_ipi_message(const struct cpumask * to_whom,enum ipi_message_type operation)501 send_ipi_message(const struct cpumask *to_whom, enum ipi_message_type operation)
502 {
503 	int i;
504 
505 	mb();
506 	for_each_cpu(i, to_whom)
507 		set_bit(operation, &ipi_data[i].bits);
508 
509 	mb();
510 	for_each_cpu(i, to_whom)
511 		wripir(i);
512 }
513 
514 void
handle_ipi(struct pt_regs * regs)515 handle_ipi(struct pt_regs *regs)
516 {
517 	int this_cpu = smp_processor_id();
518 	unsigned long *pending_ipis = &ipi_data[this_cpu].bits;
519 	unsigned long ops;
520 
521 #if 0
522 	DBGS(("handle_ipi: on CPU %d ops 0x%lx PC 0x%lx\n",
523 	      this_cpu, *pending_ipis, regs->pc));
524 #endif
525 
526 	mb();	/* Order interrupt and bit testing. */
527 	while ((ops = xchg(pending_ipis, 0)) != 0) {
528 	  mb();	/* Order bit clearing and data access. */
529 	  do {
530 		unsigned long which;
531 
532 		which = ops & -ops;
533 		ops &= ~which;
534 		which = __ffs(which);
535 
536 		switch (which) {
537 		case IPI_RESCHEDULE:
538 			scheduler_ipi();
539 			break;
540 
541 		case IPI_CALL_FUNC:
542 			generic_smp_call_function_interrupt();
543 			break;
544 
545 		case IPI_CPU_STOP:
546 			halt();
547 
548 		default:
549 			printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n",
550 			       this_cpu, which);
551 			break;
552 		}
553 	  } while (ops);
554 
555 	  mb();	/* Order data access and bit testing. */
556 	}
557 
558 	cpu_data[this_cpu].ipi_count++;
559 
560 	if (hwrpb->txrdy)
561 		recv_secondary_console_msg();
562 }
563 
564 void
arch_smp_send_reschedule(int cpu)565 arch_smp_send_reschedule(int cpu)
566 {
567 #ifdef DEBUG_IPI_MSG
568 	if (cpu == hard_smp_processor_id())
569 		printk(KERN_WARNING
570 		       "smp_send_reschedule: Sending IPI to self.\n");
571 #endif
572 	send_ipi_message(cpumask_of(cpu), IPI_RESCHEDULE);
573 }
574 
575 void
smp_send_stop(void)576 smp_send_stop(void)
577 {
578 	cpumask_t to_whom;
579 	cpumask_copy(&to_whom, cpu_online_mask);
580 	cpumask_clear_cpu(smp_processor_id(), &to_whom);
581 #ifdef DEBUG_IPI_MSG
582 	if (hard_smp_processor_id() != boot_cpu_id)
583 		printk(KERN_WARNING "smp_send_stop: Not on boot cpu.\n");
584 #endif
585 	send_ipi_message(&to_whom, IPI_CPU_STOP);
586 }
587 
arch_send_call_function_ipi_mask(const struct cpumask * mask)588 void arch_send_call_function_ipi_mask(const struct cpumask *mask)
589 {
590 	send_ipi_message(mask, IPI_CALL_FUNC);
591 }
592 
arch_send_call_function_single_ipi(int cpu)593 void arch_send_call_function_single_ipi(int cpu)
594 {
595 	send_ipi_message(cpumask_of(cpu), IPI_CALL_FUNC);
596 }
597 
598 static void
ipi_imb(void * ignored)599 ipi_imb(void *ignored)
600 {
601 	imb();
602 }
603 
604 void
smp_imb(void)605 smp_imb(void)
606 {
607 	/* Must wait other processors to flush their icache before continue. */
608 	on_each_cpu(ipi_imb, NULL, 1);
609 }
610 EXPORT_SYMBOL(smp_imb);
611 
612 static void
ipi_flush_tlb_all(void * ignored)613 ipi_flush_tlb_all(void *ignored)
614 {
615 	tbia();
616 }
617 
618 void
flush_tlb_all(void)619 flush_tlb_all(void)
620 {
621 	/* Although we don't have any data to pass, we do want to
622 	   synchronize with the other processors.  */
623 	on_each_cpu(ipi_flush_tlb_all, NULL, 1);
624 }
625 
626 #define asn_locked() (cpu_data[smp_processor_id()].asn_lock)
627 
628 static void
ipi_flush_tlb_mm(void * x)629 ipi_flush_tlb_mm(void *x)
630 {
631 	struct mm_struct *mm = x;
632 	if (mm == current->active_mm && !asn_locked())
633 		flush_tlb_current(mm);
634 	else
635 		flush_tlb_other(mm);
636 }
637 
638 void
flush_tlb_mm(struct mm_struct * mm)639 flush_tlb_mm(struct mm_struct *mm)
640 {
641 	preempt_disable();
642 
643 	if (mm == current->active_mm) {
644 		flush_tlb_current(mm);
645 		if (atomic_read(&mm->mm_users) <= 1) {
646 			int cpu, this_cpu = smp_processor_id();
647 			for (cpu = 0; cpu < NR_CPUS; cpu++) {
648 				if (!cpu_online(cpu) || cpu == this_cpu)
649 					continue;
650 				if (mm->context[cpu])
651 					mm->context[cpu] = 0;
652 			}
653 			preempt_enable();
654 			return;
655 		}
656 	}
657 
658 	smp_call_function(ipi_flush_tlb_mm, mm, 1);
659 
660 	preempt_enable();
661 }
662 EXPORT_SYMBOL(flush_tlb_mm);
663 
664 struct flush_tlb_page_struct {
665 	struct vm_area_struct *vma;
666 	struct mm_struct *mm;
667 	unsigned long addr;
668 };
669 
670 static void
ipi_flush_tlb_page(void * x)671 ipi_flush_tlb_page(void *x)
672 {
673 	struct flush_tlb_page_struct *data = x;
674 	struct mm_struct * mm = data->mm;
675 
676 	if (mm == current->active_mm && !asn_locked())
677 		flush_tlb_current_page(mm, data->vma, data->addr);
678 	else
679 		flush_tlb_other(mm);
680 }
681 
682 void
flush_tlb_page(struct vm_area_struct * vma,unsigned long addr)683 flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
684 {
685 	struct flush_tlb_page_struct data;
686 	struct mm_struct *mm = vma->vm_mm;
687 
688 	preempt_disable();
689 
690 	if (mm == current->active_mm) {
691 		flush_tlb_current_page(mm, vma, addr);
692 		if (atomic_read(&mm->mm_users) <= 1) {
693 			int cpu, this_cpu = smp_processor_id();
694 			for (cpu = 0; cpu < NR_CPUS; cpu++) {
695 				if (!cpu_online(cpu) || cpu == this_cpu)
696 					continue;
697 				if (mm->context[cpu])
698 					mm->context[cpu] = 0;
699 			}
700 			preempt_enable();
701 			return;
702 		}
703 	}
704 
705 	data.vma = vma;
706 	data.mm = mm;
707 	data.addr = addr;
708 
709 	smp_call_function(ipi_flush_tlb_page, &data, 1);
710 
711 	preempt_enable();
712 }
713 EXPORT_SYMBOL(flush_tlb_page);
714 
715 void
flush_tlb_range(struct vm_area_struct * vma,unsigned long start,unsigned long end)716 flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
717 {
718 	/* On the Alpha we always flush the whole user tlb.  */
719 	flush_tlb_mm(vma->vm_mm);
720 }
721 EXPORT_SYMBOL(flush_tlb_range);
722 
723 static void
ipi_flush_icache_page(void * x)724 ipi_flush_icache_page(void *x)
725 {
726 	struct mm_struct *mm = (struct mm_struct *) x;
727 	if (mm == current->active_mm && !asn_locked())
728 		__load_new_mm_context(mm);
729 	else
730 		flush_tlb_other(mm);
731 }
732 
733 void
flush_icache_user_page(struct vm_area_struct * vma,struct page * page,unsigned long addr,int len)734 flush_icache_user_page(struct vm_area_struct *vma, struct page *page,
735 			unsigned long addr, int len)
736 {
737 	struct mm_struct *mm = vma->vm_mm;
738 
739 	if ((vma->vm_flags & VM_EXEC) == 0)
740 		return;
741 
742 	preempt_disable();
743 
744 	if (mm == current->active_mm) {
745 		__load_new_mm_context(mm);
746 		if (atomic_read(&mm->mm_users) <= 1) {
747 			int cpu, this_cpu = smp_processor_id();
748 			for (cpu = 0; cpu < NR_CPUS; cpu++) {
749 				if (!cpu_online(cpu) || cpu == this_cpu)
750 					continue;
751 				if (mm->context[cpu])
752 					mm->context[cpu] = 0;
753 			}
754 			preempt_enable();
755 			return;
756 		}
757 	}
758 
759 	smp_call_function(ipi_flush_icache_page, mm, 1);
760 
761 	preempt_enable();
762 }
763