aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2013-03-11 21:43:53 +0100
committerSteven Rostedt <rostedt@rostedt.homelinux.com>2013-09-08 11:03:14 -0400
commitfd83a8e64bb3d659befa8eafb8a0cb8c41c58cce (patch)
tree8b106ee830a976307e2f17411facaa0ee2dc9f68
parent65a4d483da7b743b4b55b3242a22eca2dba10b4d (diff)
arm/highmem: close race between clear/set pte
This patch aims to close the same race in kmap_atomic() / kunmap_atomic() vs switch_kmaps() as on x86. In contrast to x86 the warning has not been seen and the fix has only been compile tested. The pattern is same so the bug should present here as well. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-rw-r--r--arch/arm/mm/highmem.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c
index c8d6d9a50b3c..bd41dd8cc561 100644
--- a/arch/arm/mm/highmem.c
+++ b/arch/arm/mm/highmem.c
@@ -97,6 +97,9 @@ void __kunmap_atomic(void *kvaddr)
if (cache_is_vivt())
__cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE);
+#ifdef CONFIG_PREEMPT_RT_FULL
+ current->kmap_pte[type] = __pte(0);
+#endif
#ifdef CONFIG_DEBUG_HIGHMEM
BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
#else
@@ -163,8 +166,9 @@ void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p)
for (i = 0; i < next_p->kmap_idx; i++) {
int idx = i + KM_TYPE_NR * smp_processor_id();
- set_top_pte(__fix_to_virt(FIX_KMAP_BEGIN + idx),
- next_p->kmap_pte[i]);
+ if (!pte_none(next_p->kmap_pte[i]))
+ set_top_pte(__fix_to_virt(FIX_KMAP_BEGIN + idx),
+ next_p->kmap_pte[i]);
}
}
#endif