Commit 603fff54 authored by Russell King's avatar Russell King Committed by Russell King

[PATCH] ARM SMP: TLB implementations only affect local CPU

The existing TLB flush implementations only have an effect on
the local CPU.  Prefix them with local_.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parents 99f95e52 8b22c249
...@@ -235,7 +235,7 @@ extern struct cpu_tlb_fns cpu_tlb; ...@@ -235,7 +235,7 @@ extern struct cpu_tlb_fns cpu_tlb;
#define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f))) #define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f)))
static inline void flush_tlb_all(void) static inline void local_flush_tlb_all(void)
{ {
const int zero = 0; const int zero = 0;
const unsigned int __tlb_flag = __cpu_tlb_flags; const unsigned int __tlb_flag = __cpu_tlb_flags;
...@@ -253,7 +253,7 @@ static inline void flush_tlb_all(void) ...@@ -253,7 +253,7 @@ static inline void flush_tlb_all(void)
asm("mcr%? p15, 0, %0, c8, c5, 0" : : "r" (zero)); asm("mcr%? p15, 0, %0, c8, c5, 0" : : "r" (zero));
} }
static inline void flush_tlb_mm(struct mm_struct *mm) static inline void local_flush_tlb_mm(struct mm_struct *mm)
{ {
const int zero = 0; const int zero = 0;
const int asid = ASID(mm); const int asid = ASID(mm);
...@@ -282,7 +282,7 @@ static inline void flush_tlb_mm(struct mm_struct *mm) ...@@ -282,7 +282,7 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
} }
static inline void static inline void
flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
{ {
const int zero = 0; const int zero = 0;
const unsigned int __tlb_flag = __cpu_tlb_flags; const unsigned int __tlb_flag = __cpu_tlb_flags;
...@@ -313,7 +313,7 @@ flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) ...@@ -313,7 +313,7 @@ flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (uaddr)); asm("mcr%? p15, 0, %0, c8, c5, 1" : : "r" (uaddr));
} }
static inline void flush_tlb_kernel_page(unsigned long kaddr) static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
{ {
const int zero = 0; const int zero = 0;
const unsigned int __tlb_flag = __cpu_tlb_flags; const unsigned int __tlb_flag = __cpu_tlb_flags;
...@@ -384,8 +384,24 @@ static inline void clean_pmd_entry(pmd_t *pmd) ...@@ -384,8 +384,24 @@ static inline void clean_pmd_entry(pmd_t *pmd)
/* /*
* Convert calls to our calling convention. * Convert calls to our calling convention.
*/ */
#define flush_tlb_range(vma,start,end) __cpu_flush_user_tlb_range(start,end,vma) #define local_flush_tlb_range(vma,start,end) __cpu_flush_user_tlb_range(start,end,vma)
#define flush_tlb_kernel_range(s,e) __cpu_flush_kern_tlb_range(s,e) #define local_flush_tlb_kernel_range(s,e) __cpu_flush_kern_tlb_range(s,e)
#ifndef CONFIG_SMP
#define flush_tlb_all local_flush_tlb_all
#define flush_tlb_mm local_flush_tlb_mm
#define flush_tlb_page local_flush_tlb_page
#define flush_tlb_kernel_page local_flush_tlb_kernel_page
#define flush_tlb_range local_flush_tlb_range
#define flush_tlb_kernel_range local_flush_tlb_kernel_range
#else
extern void flush_tlb_all(void);
extern void flush_tlb_mm(struct mm_struct *mm);
extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr);
extern void flush_tlb_kernel_page(unsigned long kaddr);
extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
#endif
/* /*
* if PG_dcache_dirty is set for the page, we need to ensure that any * if PG_dcache_dirty is set for the page, we need to ensure that any
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment