diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index a3fda9f..ddc05e7 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -33,7 +33,8 @@ */ static inline void mmgrab(struct mm_struct *mm) { - atomic_inc(&mm->mm_count); + printk("mmgrab %p to %d\n", mm, atomic_inc_return(&mm->mm_count)); + dump_stack(); } extern void __mmdrop(struct mm_struct *mm); @@ -45,6 +46,8 @@ static inline void mmdrop(struct mm_struct *mm) * required by the membarrier system call before returning to * user-space, after storing to rq->curr. */ + printk("mmdrop %p before %d\n", mm, atomic_read(&mm->mm_count)); + dump_stack(); if (unlikely(atomic_dec_and_test(&mm->mm_count))) __mmdrop(mm); } @@ -88,11 +91,14 @@ static inline bool mmget_still_valid(struct mm_struct *mm) */ static inline void mmget(struct mm_struct *mm) { - atomic_inc(&mm->mm_users); + printk("mget %p to %d\n", mm, atomic_inc_return(&mm->mm_users)); + dump_stack(); } static inline bool mmget_not_zero(struct mm_struct *mm) { + printk("mmget_not_zero %p\n", mm); + dump_stack(); return atomic_inc_not_zero(&mm->mm_users); } diff --git a/kernel/fork.c b/kernel/fork.c index b2b87d4..80efe50 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1076,6 +1076,8 @@ void mmput(struct mm_struct *mm) { might_sleep(); + printk("mmput mm %p before %d\n", mm, atomic_read(&mm->mm_users)); + dump_stack(); if (atomic_dec_and_test(&mm->mm_users)) __mmput(mm); }