diff options
author | Kevin Hilman <khilman@mvista.com> | 2007-11-07 19:48:16 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2007-11-08 05:07:14 -0500 |
commit | a8fa9ba623122a51efe6c9ef8fe7412c91582d48 (patch) | |
tree | 11dc687e80edfb6c8681bcde178bcb6b962bb163 /include | |
parent | 70dfa3f8756afa106a468e81649bf0c1d7dbf99e (diff) |
[ARM] 4644/2: fix flush_kern_tlb_range() in module space
For kernel addresses between TASK_SIZE and PAGE_OFFSET,
flush_tlb_kern_range() does not work as would be expected.
The TLB invalidate works with a matching ASID, or on entries marked as
global. The set_pte_at() macro marks addresses >= PAGE_OFFSET as
global, but not addresses from TASK_SIZE to PAGE_OFFSET, which are
also kernel addresses.
The result is that the entries in this range are not actually
invalidated by flush_tlb_kern_range().
This patch instead marks addresses >= TASK_SIZE as global.
Signed-off-by: Satoru Fujii <s-fujii@ct.jp.nec.com>
Signed-off-by: Kevin Hilman <khilman@mvista.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-arm/pgtable.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/asm-arm/pgtable.h b/include/asm-arm/pgtable.h index d2e8171d1d4e..5e0182485d8c 100644 --- a/include/asm-arm/pgtable.h +++ b/include/asm-arm/pgtable.h | |||
@@ -249,7 +249,7 @@ extern struct page *empty_zero_page; | |||
249 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) | 249 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) |
250 | 250 | ||
251 | #define set_pte_at(mm,addr,ptep,pteval) do { \ | 251 | #define set_pte_at(mm,addr,ptep,pteval) do { \ |
252 | set_pte_ext(ptep, pteval, (addr) >= PAGE_OFFSET ? 0 : PTE_EXT_NG); \ | 252 | set_pte_ext(ptep, pteval, (addr) >= TASK_SIZE ? 0 : PTE_EXT_NG); \ |
253 | } while (0) | 253 | } while (0) |
254 | 254 | ||
255 | /* | 255 | /* |