]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arc/mm/tlbflush.c
Merge remote-tracking branch 'mtd/master'
[karo-tx-linux.git] / arch / arc / mm / tlbflush.c
1 /*
2  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 #include <linux/sched.h>
10 #include <asm/tlbflush.h>
11
12 struct tlb_args {
13        struct vm_area_struct *ta_vma;
14        unsigned long ta_start;
15        unsigned long ta_end;
16 };
17
18 static inline void ipi_flush_tlb_all(void *ignored)
19 {
20        local_flush_tlb_all();
21 }
22
23 static inline void ipi_flush_tlb_mm(void *arg)
24 {
25        struct mm_struct *mm = (struct mm_struct *)arg;
26
27        local_flush_tlb_mm(mm);
28 }
29
30 static inline void ipi_flush_tlb_page(void *arg)
31 {
32        struct tlb_args *ta = (struct tlb_args *)arg;
33
34        local_flush_tlb_page(ta->ta_vma, ta->ta_start);
35 }
36
37 static inline void ipi_flush_tlb_range(void *arg)
38 {
39        struct tlb_args *ta = (struct tlb_args *)arg;
40
41        local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end);
42 }
43
44 static inline void ipi_flush_tlb_kernel_range(void *arg)
45 {
46        struct tlb_args *ta = (struct tlb_args *)arg;
47
48        local_flush_tlb_kernel_range(ta->ta_start, ta->ta_end);
49 }
50
51 void flush_tlb_all(void)
52 {
53        on_each_cpu(ipi_flush_tlb_all, NULL, 1);
54 }
55
56 void flush_tlb_mm(struct mm_struct *mm)
57 {
58        on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
59 }
60
61 void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
62 {
63        struct tlb_args ta;
64        ta.ta_vma = vma;
65        ta.ta_start = uaddr;
66        on_each_cpu_mask(mm_cpumask(vma->vm_mm), ipi_flush_tlb_page, &ta, 1);
67 }
68
69 void flush_tlb_range(struct vm_area_struct *vma,
70                      unsigned long start, unsigned long end)
71 {
72        struct tlb_args ta;
73        ta.ta_vma = vma;
74        ta.ta_start = start;
75        ta.ta_end = end;
76        on_each_cpu_mask(mm_cpumask(vma->vm_mm), ipi_flush_tlb_range, &ta, 1);
77 }
78
79 void flush_tlb_kernel_range(unsigned long start, unsigned long end)
80 {
81        struct tlb_args ta;
82        ta.ta_start = start;
83        ta.ta_end = end;
84        on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1);
85 }