|
@@ -493,7 +493,7 @@ struct mm_struct {
|
|
|
* can move process memory needs to flush the TLB when moving a
|
|
|
* PROT_NONE or PROT_NUMA mapped page.
|
|
|
*/
|
|
|
- bool tlb_flush_pending;
|
|
|
+ atomic_t tlb_flush_pending;
|
|
|
#endif
|
|
|
#ifdef CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH
|
|
|
/* See flush_tlb_batched_pending() */
|
|
@@ -532,33 +532,46 @@ static inline cpumask_t *mm_cpumask(struct mm_struct *mm)
|
|
|
static inline bool mm_tlb_flush_pending(struct mm_struct *mm)
|
|
|
{
|
|
|
barrier();
|
|
|
- return mm->tlb_flush_pending;
|
|
|
+ return atomic_read(&mm->tlb_flush_pending) > 0;
|
|
|
}
|
|
|
-static inline void set_tlb_flush_pending(struct mm_struct *mm)
|
|
|
+
|
|
|
+static inline void init_tlb_flush_pending(struct mm_struct *mm)
|
|
|
{
|
|
|
- mm->tlb_flush_pending = true;
|
|
|
+ atomic_set(&mm->tlb_flush_pending, 0);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void inc_tlb_flush_pending(struct mm_struct *mm)
|
|
|
+{
|
|
|
+ atomic_inc(&mm->tlb_flush_pending);
|
|
|
|
|
|
/*
|
|
|
- * Guarantee that the tlb_flush_pending store does not leak into the
|
|
|
+ * Guarantee that the tlb_flush_pending increase does not leak into the
|
|
|
* critical section updating the page tables
|
|
|
*/
|
|
|
smp_mb__before_spinlock();
|
|
|
}
|
|
|
+
|
|
|
/* Clearing is done after a TLB flush, which also provides a barrier. */
|
|
|
-static inline void clear_tlb_flush_pending(struct mm_struct *mm)
|
|
|
+static inline void dec_tlb_flush_pending(struct mm_struct *mm)
|
|
|
{
|
|
|
barrier();
|
|
|
- mm->tlb_flush_pending = false;
|
|
|
+ atomic_dec(&mm->tlb_flush_pending);
|
|
|
}
|
|
|
#else
|
|
|
static inline bool mm_tlb_flush_pending(struct mm_struct *mm)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
-static inline void set_tlb_flush_pending(struct mm_struct *mm)
|
|
|
+
|
|
|
+static inline void init_tlb_flush_pending(struct mm_struct *mm)
|
|
|
{
|
|
|
}
|
|
|
-static inline void clear_tlb_flush_pending(struct mm_struct *mm)
|
|
|
+
|
|
|
+static inline void inc_tlb_flush_pending(struct mm_struct *mm)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+static inline void dec_tlb_flush_pending(struct mm_struct *mm)
|
|
|
{
|
|
|
}
|
|
|
#endif
|