diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index dc9301d..15f5a71 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -709,6 +709,7 @@ long vhost_dev_set_owner(struct vhost_dev *dev) /* No owner, become one */ dev->mm = get_task_mm(current); + debug_mm = dev->mm; worker = kthread_create(vhost_worker, dev, "vhost-%d", current->pid); if (IS_ERR(worker)) { err = PTR_ERR(worker); diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index a3fda9f..fa7f5d0 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -9,6 +9,7 @@ #include #include +static struct mm_struct *debug_mm; /* * Routines for handling mm_structs */ @@ -33,6 +34,10 @@ */ static inline void mmgrab(struct mm_struct *mm) { + if (debug_mm == mm) { + printk("mmgrab %p\n", mm); + dump_stack(); + } atomic_inc(&mm->mm_count); } @@ -45,6 +50,10 @@ static inline void mmdrop(struct mm_struct *mm) * required by the membarrier system call before returning to * user-space, after storing to rq->curr. */ + if (debug_mm == mm) { + 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 +97,19 @@ static inline bool mmget_still_valid(struct mm_struct *mm) */ static inline void mmget(struct mm_struct *mm) { + if (debug_mm == mm) { + printk("mget %p\n", mm); + dump_stack(); + } atomic_inc(&mm->mm_users); } static inline bool mmget_not_zero(struct mm_struct *mm) { + if (debug_mm == 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..9a4e5d6 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1076,6 +1076,10 @@ void mmput(struct mm_struct *mm) { might_sleep(); + if (debug_mm == mm) { + 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); } @@ -1092,6 +1096,10 @@ static void mmput_async_fn(struct work_struct *work) void mmput_async(struct mm_struct *mm) { + if (debug_mm == mm) { + printk("mmput mm %p before %d\n", mm, atomic_read(&mm->mm_users)); + dump_stack(); + } if (atomic_dec_and_test(&mm->mm_users)) { INIT_WORK(&mm->async_put_work, mmput_async_fn); schedule_work(&mm->async_put_work);