diff options
Diffstat (limited to 'include/linux/sched/mm.h')
| -rw-r--r-- | include/linux/sched/mm.h | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index 1149533aa2fa..9806184bb3d5 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -36,7 +36,18 @@ static inline void mmgrab(struct mm_struct *mm)  	atomic_inc(&mm->mm_count);  } -extern void mmdrop(struct mm_struct *mm); +extern void __mmdrop(struct mm_struct *mm); + +static inline void mmdrop(struct mm_struct *mm) +{ +	/* +	 * The implicit full barrier implied by atomic_dec_and_test() is +	 * required by the membarrier system call before returning to +	 * user-space, after storing to rq->curr. +	 */ +	if (unlikely(atomic_dec_and_test(&mm->mm_count))) +		__mmdrop(mm); +}  /**   * mmget() - Pin the address space associated with a &struct mm_struct.  |