Commit 246bb0b1deb29726990620d8b5e55ca29f331362

Authored by Oleg Nesterov
Committed by Linus Torvalds
1 parent 7b34e4283c

kill PF_BORROWED_MM in favour of PF_KTHREAD

Kill PF_BORROWED_MM.  Change use_mm/unuse_mm to not play with ->flags, and
do s/PF_BORROWED_MM/PF_KTHREAD/ for a couple of other users.

No functional changes yet.  But this allows us to do further
fixes/cleanups.

oom_kill/ptrace/etc often check "p->mm != NULL" to filter out the
kthreads, this is wrong because of use_mm().  The problem with
PF_BORROWED_MM is that we need task_lock() to avoid races.  With this
patch we can check PF_KTHREAD directly, or use a simple lockless helper:

	/* The result must not be dereferenced !!! */
	struct mm_struct *__get_task_mm(struct task_struct *tsk)
	{
		if (tsk->flags & PF_KTHREAD)
			return NULL;
		return tsk->mm;
	}

Note also ecard_task().  It runs with ->mm != NULL, but it's the kernel
thread without PF_BORROWED_MM.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 3 changed files with 3 additions and 6 deletions Side-by-side Diff

... ... @@ -586,7 +586,6 @@
586 586 struct task_struct *tsk = current;
587 587  
588 588 task_lock(tsk);
589   - tsk->flags |= PF_BORROWED_MM;
590 589 active_mm = tsk->active_mm;
591 590 atomic_inc(&mm->mm_count);
592 591 tsk->mm = mm;
... ... @@ -610,7 +609,6 @@
610 609 struct task_struct *tsk = current;
611 610  
612 611 task_lock(tsk);
613   - tsk->flags &= ~PF_BORROWED_MM;
614 612 tsk->mm = NULL;
615 613 /* active_mm is still 'mm' */
616 614 enter_lazy_tlb(mm, tsk);
include/linux/sched.h
... ... @@ -1483,7 +1483,6 @@
1483 1483 #define PF_EXITING 0x00000004 /* getting shut down */
1484 1484 #define PF_EXITPIDONE 0x00000008 /* pi exit done on shut down */
1485 1485 #define PF_VCPU 0x00000010 /* I'm a virtual CPU */
1486   -#define PF_KTHREAD 0x00000020 /* I am a kernel thread */
1487 1486 #define PF_FORKNOEXEC 0x00000040 /* forked but didn't exec */
1488 1487 #define PF_SUPERPRIV 0x00000100 /* used super-user privileges */
1489 1488 #define PF_DUMPCORE 0x00000200 /* dumped core */
... ... @@ -1497,7 +1496,7 @@
1497 1496 #define PF_KSWAPD 0x00040000 /* I am kswapd */
1498 1497 #define PF_SWAPOFF 0x00080000 /* I am in swapoff */
1499 1498 #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */
1500   -#define PF_BORROWED_MM 0x00200000 /* I am a kthread doing use_mm */
  1499 +#define PF_KTHREAD 0x00200000 /* I am a kernel thread */
1501 1500 #define PF_RANDOMIZE 0x00400000 /* randomize virtual address space */
1502 1501 #define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */
1503 1502 #define PF_SPREAD_PAGE 0x01000000 /* Spread page cache over cpuset */
... ... @@ -474,7 +474,7 @@
474 474 /**
475 475 * get_task_mm - acquire a reference to the task's mm
476 476 *
477   - * Returns %NULL if the task has no mm. Checks PF_BORROWED_MM (meaning
  477 + * Returns %NULL if the task has no mm. Checks PF_KTHREAD (meaning
478 478 * this kernel workthread has transiently adopted a user mm with use_mm,
479 479 * to do its AIO) is not set and if so returns a reference to it, after
480 480 * bumping up the use count. User must release the mm via mmput()
... ... @@ -487,7 +487,7 @@
487 487 task_lock(task);
488 488 mm = task->mm;
489 489 if (mm) {
490   - if (task->flags & PF_BORROWED_MM)
  490 + if (task->flags & PF_KTHREAD)
491 491 mm = NULL;
492 492 else
493 493 atomic_inc(&mm->mm_users);