1#include <linux/init.h>
2
3#include <linux/mm.h>
4#include <linux/spinlock.h>
5#include <linux/smp.h>
6#include <linux/interrupt.h>
7#include <linux/export.h>
8#include <linux/cpu.h>
9
10#include <asm/tlbflush.h>
11#include <asm/mmu_context.h>
12#include <asm/cache.h>
13#include <asm/apic.h>
14#include <asm/uv/uv.h>
15#include <linux/debugfs.h>
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31atomic64_t last_mm_ctx_id = ATOMIC64_INIT(1);
32
33
34static void choose_new_asid(struct mm_struct *next, u64 next_tlb_gen,
35 u16 *new_asid, bool *need_flush)
36{
37 u16 asid;
38
39 if (!static_cpu_has(X86_FEATURE_PCID)) {
40 *new_asid = 0;
41 *need_flush = true;
42 return;
43 }
44
45 for (asid = 0; asid < TLB_NR_DYN_ASIDS; asid++) {
46 if (this_cpu_read(cpu_tlbstate.ctxs[asid].ctx_id) !=
47 next->context.ctx_id)
48 continue;
49
50 *new_asid = asid;
51 *need_flush = (this_cpu_read(cpu_tlbstate.ctxs[asid].tlb_gen) <
52 next_tlb_gen);
53 return;
54 }
55
56
57
58
59
60 *new_asid = this_cpu_add_return(cpu_tlbstate.next_asid, 1) - 1;
61 if (*new_asid >= TLB_NR_DYN_ASIDS) {
62 *new_asid = 0;
63 this_cpu_write(cpu_tlbstate.next_asid, 1);
64 }
65 *need_flush = true;
66}
67
68void leave_mm(int cpu)
69{
70 struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm);
71
72
73
74
75
76
77
78
79
80 if (loaded_mm == &init_mm)
81 return;
82
83
84 WARN_ON(!this_cpu_read(cpu_tlbstate.is_lazy));
85
86 switch_mm(NULL, &init_mm, NULL);
87}
88EXPORT_SYMBOL_GPL(leave_mm);
89
90void switch_mm(struct mm_struct *prev, struct mm_struct *next,
91 struct task_struct *tsk)
92{
93 unsigned long flags;
94
95 local_irq_save(flags);
96 switch_mm_irqs_off(prev, next, tsk);
97 local_irq_restore(flags);
98}
99
100void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
101 struct task_struct *tsk)
102{
103 struct mm_struct *real_prev = this_cpu_read(cpu_tlbstate.loaded_mm);
104 u16 prev_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid);
105 unsigned cpu = smp_processor_id();
106 u64 next_tlb_gen;
107
108
109
110
111
112
113
114
115
116
117
118 if (IS_ENABLED(CONFIG_PROVE_LOCKING))
119 WARN_ON_ONCE(!irqs_disabled());
120
121
122
123
124
125
126
127
128
129
130#ifdef CONFIG_DEBUG_VM
131 if (WARN_ON_ONCE(__read_cr3() != build_cr3(real_prev, prev_asid))) {
132
133
134
135
136
137
138
139
140
141
142
143
144 __flush_tlb_all();
145 }
146#endif
147 this_cpu_write(cpu_tlbstate.is_lazy, false);
148
149 if (real_prev == next) {
150 VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[prev_asid].ctx_id) !=
151 next->context.ctx_id);
152
153
154
155
156
157
158
159
160 if (WARN_ON_ONCE(real_prev != &init_mm &&
161 !cpumask_test_cpu(cpu, mm_cpumask(next))))
162 cpumask_set_cpu(cpu, mm_cpumask(next));
163
164 return;
165 } else {
166 u16 new_asid;
167 bool need_flush;
168
169 if (IS_ENABLED(CONFIG_VMAP_STACK)) {
170
171
172
173
174
175 unsigned int index = pgd_index(current_stack_pointer);
176 pgd_t *pgd = next->pgd + index;
177
178 if (unlikely(pgd_none(*pgd)))
179 set_pgd(pgd, init_mm.pgd[index]);
180 }
181
182
183 VM_WARN_ON_ONCE(!cpumask_test_cpu(cpu, mm_cpumask(real_prev)) &&
184 real_prev != &init_mm);
185 cpumask_clear_cpu(cpu, mm_cpumask(real_prev));
186
187
188
189
190 cpumask_set_cpu(cpu, mm_cpumask(next));
191 next_tlb_gen = atomic64_read(&next->context.tlb_gen);
192
193 choose_new_asid(next, next_tlb_gen, &new_asid, &need_flush);
194
195 if (need_flush) {
196 this_cpu_write(cpu_tlbstate.ctxs[new_asid].ctx_id, next->context.ctx_id);
197 this_cpu_write(cpu_tlbstate.ctxs[new_asid].tlb_gen, next_tlb_gen);
198 write_cr3(build_cr3(next, new_asid));
199
200
201
202
203
204
205
206
207
208 trace_tlb_flush_rcuidle(TLB_FLUSH_ON_TASK_SWITCH, TLB_FLUSH_ALL);
209 } else {
210
211 write_cr3(build_cr3_noflush(next, new_asid));
212
213
214 trace_tlb_flush_rcuidle(TLB_FLUSH_ON_TASK_SWITCH, 0);
215 }
216
217 this_cpu_write(cpu_tlbstate.loaded_mm, next);
218 this_cpu_write(cpu_tlbstate.loaded_mm_asid, new_asid);
219 }
220
221 load_mm_cr4(next);
222 switch_ldt(real_prev, next);
223}
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
239{
240 if (this_cpu_read(cpu_tlbstate.loaded_mm) == &init_mm)
241 return;
242
243 if (tlb_defer_switch_to_init_mm()) {
244
245
246
247
248
249
250
251
252
253 this_cpu_write(cpu_tlbstate.is_lazy, true);
254 } else {
255 switch_mm(NULL, &init_mm, NULL);
256 }
257}
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272void initialize_tlbstate_and_flush(void)
273{
274 int i;
275 struct mm_struct *mm = this_cpu_read(cpu_tlbstate.loaded_mm);
276 u64 tlb_gen = atomic64_read(&init_mm.context.tlb_gen);
277 unsigned long cr3 = __read_cr3();
278
279
280 WARN_ON((cr3 & CR3_ADDR_MASK) != __pa(mm->pgd));
281
282
283
284
285
286
287 WARN_ON(boot_cpu_has(X86_FEATURE_PCID) &&
288 !(cr4_read_shadow() & X86_CR4_PCIDE));
289
290
291 write_cr3(build_cr3(mm, 0));
292
293
294 this_cpu_write(cpu_tlbstate.loaded_mm_asid, 0);
295 this_cpu_write(cpu_tlbstate.next_asid, 1);
296 this_cpu_write(cpu_tlbstate.ctxs[0].ctx_id, mm->context.ctx_id);
297 this_cpu_write(cpu_tlbstate.ctxs[0].tlb_gen, tlb_gen);
298
299 for (i = 1; i < TLB_NR_DYN_ASIDS; i++)
300 this_cpu_write(cpu_tlbstate.ctxs[i].ctx_id, 0);
301}
302
303
304
305
306
307
308
309
310static void flush_tlb_func_common(const struct flush_tlb_info *f,
311 bool local, enum tlb_flush_reason reason)
312{
313
314
315
316
317
318
319
320
321
322 struct mm_struct *loaded_mm = this_cpu_read(cpu_tlbstate.loaded_mm);
323 u32 loaded_mm_asid = this_cpu_read(cpu_tlbstate.loaded_mm_asid);
324 u64 mm_tlb_gen = atomic64_read(&loaded_mm->context.tlb_gen);
325 u64 local_tlb_gen = this_cpu_read(cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen);
326
327
328 VM_WARN_ON(!irqs_disabled());
329
330 if (unlikely(loaded_mm == &init_mm))
331 return;
332
333 VM_WARN_ON(this_cpu_read(cpu_tlbstate.ctxs[loaded_mm_asid].ctx_id) !=
334 loaded_mm->context.ctx_id);
335
336 if (this_cpu_read(cpu_tlbstate.is_lazy)) {
337
338
339
340
341
342
343 switch_mm_irqs_off(NULL, &init_mm, NULL);
344 return;
345 }
346
347 if (unlikely(local_tlb_gen == mm_tlb_gen)) {
348
349
350
351
352
353
354 trace_tlb_flush(reason, 0);
355 return;
356 }
357
358 WARN_ON_ONCE(local_tlb_gen > mm_tlb_gen);
359 WARN_ON_ONCE(f->new_tlb_gen > mm_tlb_gen);
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398 if (f->end != TLB_FLUSH_ALL &&
399 f->new_tlb_gen == local_tlb_gen + 1 &&
400 f->new_tlb_gen == mm_tlb_gen) {
401
402 unsigned long addr;
403 unsigned long nr_pages = (f->end - f->start) >> PAGE_SHIFT;
404
405 addr = f->start;
406 while (addr < f->end) {
407 __flush_tlb_single(addr);
408 addr += PAGE_SIZE;
409 }
410 if (local)
411 count_vm_tlb_events(NR_TLB_LOCAL_FLUSH_ONE, nr_pages);
412 trace_tlb_flush(reason, nr_pages);
413 } else {
414
415 local_flush_tlb();
416 if (local)
417 count_vm_tlb_event(NR_TLB_LOCAL_FLUSH_ALL);
418 trace_tlb_flush(reason, TLB_FLUSH_ALL);
419 }
420
421
422 this_cpu_write(cpu_tlbstate.ctxs[loaded_mm_asid].tlb_gen, mm_tlb_gen);
423}
424
425static void flush_tlb_func_local(void *info, enum tlb_flush_reason reason)
426{
427 const struct flush_tlb_info *f = info;
428
429 flush_tlb_func_common(f, true, reason);
430}
431
432static void flush_tlb_func_remote(void *info)
433{
434 const struct flush_tlb_info *f = info;
435
436 inc_irq_stat(irq_tlb_count);
437
438 if (f->mm && f->mm != this_cpu_read(cpu_tlbstate.loaded_mm))
439 return;
440
441 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
442 flush_tlb_func_common(f, false, TLB_REMOTE_SHOOTDOWN);
443}
444
445void native_flush_tlb_others(const struct cpumask *cpumask,
446 const struct flush_tlb_info *info)
447{
448 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH);
449 if (info->end == TLB_FLUSH_ALL)
450 trace_tlb_flush(TLB_REMOTE_SEND_IPI, TLB_FLUSH_ALL);
451 else
452 trace_tlb_flush(TLB_REMOTE_SEND_IPI,
453 (info->end - info->start) >> PAGE_SHIFT);
454
455 if (is_uv_system()) {
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471 unsigned int cpu;
472
473 cpu = smp_processor_id();
474 cpumask = uv_flush_tlb_others(cpumask, info);
475 if (cpumask)
476 smp_call_function_many(cpumask, flush_tlb_func_remote,
477 (void *)info, 1);
478 return;
479 }
480 smp_call_function_many(cpumask, flush_tlb_func_remote,
481 (void *)info, 1);
482}
483
484
485
486
487
488
489
490
491
492
493
494static unsigned long tlb_single_page_flush_ceiling __read_mostly = 33;
495
496void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
497 unsigned long end, unsigned long vmflag)
498{
499 int cpu;
500
501 struct flush_tlb_info info = {
502 .mm = mm,
503 };
504
505 cpu = get_cpu();
506
507
508 info.new_tlb_gen = inc_mm_tlb_gen(mm);
509
510
511 if ((end != TLB_FLUSH_ALL) &&
512 !(vmflag & VM_HUGETLB) &&
513 ((end - start) >> PAGE_SHIFT) <= tlb_single_page_flush_ceiling) {
514 info.start = start;
515 info.end = end;
516 } else {
517 info.start = 0UL;
518 info.end = TLB_FLUSH_ALL;
519 }
520
521 if (mm == this_cpu_read(cpu_tlbstate.loaded_mm)) {
522 VM_WARN_ON(irqs_disabled());
523 local_irq_disable();
524 flush_tlb_func_local(&info, TLB_LOCAL_MM_SHOOTDOWN);
525 local_irq_enable();
526 }
527
528 if (cpumask_any_but(mm_cpumask(mm), cpu) < nr_cpu_ids)
529 flush_tlb_others(mm_cpumask(mm), &info);
530
531 put_cpu();
532}
533
534
535static void do_flush_tlb_all(void *info)
536{
537 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
538 __flush_tlb_all();
539}
540
541void flush_tlb_all(void)
542{
543 count_vm_tlb_event(NR_TLB_REMOTE_FLUSH);
544 on_each_cpu(do_flush_tlb_all, NULL, 1);
545}
546
547static void do_kernel_range_flush(void *info)
548{
549 struct flush_tlb_info *f = info;
550 unsigned long addr;
551
552
553 for (addr = f->start; addr < f->end; addr += PAGE_SIZE)
554 __flush_tlb_single(addr);
555}
556
557void flush_tlb_kernel_range(unsigned long start, unsigned long end)
558{
559
560
561 if (end == TLB_FLUSH_ALL ||
562 (end - start) > tlb_single_page_flush_ceiling << PAGE_SHIFT) {
563 on_each_cpu(do_flush_tlb_all, NULL, 1);
564 } else {
565 struct flush_tlb_info info;
566 info.start = start;
567 info.end = end;
568 on_each_cpu(do_kernel_range_flush, &info, 1);
569 }
570}
571
572void arch_tlbbatch_flush(struct arch_tlbflush_unmap_batch *batch)
573{
574 struct flush_tlb_info info = {
575 .mm = NULL,
576 .start = 0UL,
577 .end = TLB_FLUSH_ALL,
578 };
579
580 int cpu = get_cpu();
581
582 if (cpumask_test_cpu(cpu, &batch->cpumask)) {
583 VM_WARN_ON(irqs_disabled());
584 local_irq_disable();
585 flush_tlb_func_local(&info, TLB_LOCAL_SHOOTDOWN);
586 local_irq_enable();
587 }
588
589 if (cpumask_any_but(&batch->cpumask, cpu) < nr_cpu_ids)
590 flush_tlb_others(&batch->cpumask, &info);
591
592 cpumask_clear(&batch->cpumask);
593
594 put_cpu();
595}
596
597static ssize_t tlbflush_read_file(struct file *file, char __user *user_buf,
598 size_t count, loff_t *ppos)
599{
600 char buf[32];
601 unsigned int len;
602
603 len = sprintf(buf, "%ld\n", tlb_single_page_flush_ceiling);
604 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
605}
606
607static ssize_t tlbflush_write_file(struct file *file,
608 const char __user *user_buf, size_t count, loff_t *ppos)
609{
610 char buf[32];
611 ssize_t len;
612 int ceiling;
613
614 len = min(count, sizeof(buf) - 1);
615 if (copy_from_user(buf, user_buf, len))
616 return -EFAULT;
617
618 buf[len] = '\0';
619 if (kstrtoint(buf, 0, &ceiling))
620 return -EINVAL;
621
622 if (ceiling < 0)
623 return -EINVAL;
624
625 tlb_single_page_flush_ceiling = ceiling;
626 return count;
627}
628
629static const struct file_operations fops_tlbflush = {
630 .read = tlbflush_read_file,
631 .write = tlbflush_write_file,
632 .llseek = default_llseek,
633};
634
635static int __init create_tlb_single_page_flush_ceiling(void)
636{
637 debugfs_create_file("tlb_single_page_flush_ceiling", S_IRUSR | S_IWUSR,
638 arch_debugfs_dir, NULL, &fops_tlbflush);
639 return 0;
640}
641late_initcall(create_tlb_single_page_flush_ceiling);
642