From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Vern Lovejoy <vlovejoy@redhat.com>,
Oleg Nesterov <oleg@redhat.com>,
"Peter Zijlstra (Intel)" <peterz@infradead.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Mike Galbraith <efault@gmx.de>,
Thomas Gleixner <tglx@linutronix.de>,
hartsjc@redhat.com, vbendel@redhat.com,
Ingo Molnar <mingo@kernel.org>,
Sumit Semwal <sumit.semwal@linaro.org>
Subject: [PATCH 4.4 27/27] sched/autogroup: Fix autogroup_move_group() to never skip sched_move_task()
Date: Tue, 24 Oct 2017 14:58:12 +0200 [thread overview]
Message-ID: <20171024125712.169948579@linuxfoundation.org> (raw)
In-Reply-To: <20171024125711.074929246@linuxfoundation.org>
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov <oleg@redhat.com>
commit 18f649ef344127ef6de23a5a4272dbe2fdb73dde upstream.
The PF_EXITING check in task_wants_autogroup() is no longer needed. Remove
it, but see the next patch.
However the comment is correct in that autogroup_move_group() must always
change task_group() for every thread so the sysctl_ check is very wrong;
we can race with cgroups and even sys_setsid() is not safe because a task
running with task_group() == ag->tg must participate in refcounting:
int main(void)
{
int sctl = open("/proc/sys/kernel/sched_autogroup_enabled", O_WRONLY);
assert(sctl > 0);
if (fork()) {
wait(NULL); // destroy the child's ag/tg
pause();
}
assert(pwrite(sctl, "1\n", 2, 0) == 2);
assert(setsid() > 0);
if (fork())
pause();
kill(getppid(), SIGKILL);
sleep(1);
// The child has gone, the grandchild runs with kref == 1
assert(pwrite(sctl, "0\n", 2, 0) == 2);
assert(setsid() > 0);
// runs with the freed ag/tg
for (;;)
sleep(1);
return 0;
}
crashes the kernel. It doesn't really need sleep(1), it doesn't matter if
autogroup_move_group() actually frees the task_group or this happens later.
Reported-by: Vern Lovejoy <vlovejoy@redhat.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: hartsjc@redhat.com
Cc: vbendel@redhat.com
Link: http://lkml.kernel.org/r/20161114184609.GA15965@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org>
[sumits: submit to 4.4 LTS, post testing on Hikey]
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
kernel/sched/auto_group.c | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
--- a/kernel/sched/auto_group.c
+++ b/kernel/sched/auto_group.c
@@ -111,14 +111,11 @@ bool task_wants_autogroup(struct task_st
{
if (tg != &root_task_group)
return false;
-
/*
- * We can only assume the task group can't go away on us if
- * autogroup_move_group() can see us on ->thread_group list.
+ * If we race with autogroup_move_group() the caller can use the old
+ * value of signal->autogroup but in this case sched_move_task() will
+ * be called again before autogroup_kref_put().
*/
- if (p->flags & PF_EXITING)
- return false;
-
return true;
}
@@ -138,13 +135,17 @@ autogroup_move_group(struct task_struct
}
p->signal->autogroup = autogroup_kref_get(ag);
-
- if (!READ_ONCE(sysctl_sched_autogroup_enabled))
- goto out;
-
+ /*
+ * We can't avoid sched_move_task() after we changed signal->autogroup,
+ * this process can already run with task_group() == prev->tg or we can
+ * race with cgroup code which can read autogroup = prev under rq->lock.
+ * In the latter case for_each_thread() can not miss a migrating thread,
+ * cpu_cgroup_attach() must not be possible after cgroup_exit() and it
+ * can't be removed from thread list, we hold ->siglock.
+ */
for_each_thread(p, t)
sched_move_task(t);
-out:
+
unlock_task_sighand(p, &flags);
autogroup_kref_put(prev);
}
next prev parent reply other threads:[~2017-10-24 13:00 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-24 12:57 [PATCH 4.4 00/27] 4.4.95-stable review Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 01/27] USB: devio: Revert "USB: devio: Dont corrupt user memory" Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 02/27] USB: core: fix out-of-bounds access bug in usb_get_bos_descriptor() Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 03/27] USB: serial: metro-usb: add MS7820 device id Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 04/27] usb: cdc_acm: Add quirk for Elatec TWN3 Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 06/27] usb: hub: Allow reset retry for USB2 devices on connect bounce Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 07/27] ALSA: usb-audio: Add native DSD support for Pro-Ject Pre Box S2 Digital Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 08/27] can: gs_usb: fix busy loop if no more TX context is available Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 09/27] usb: musb: sunxi: Explicitly release USB PHY on exit Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 10/27] usb: musb: Check for host-mode using is_host_active() on reset interrupt Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 12/27] drm/nouveau/bsp/g92: disable by default Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 13/27] drm/nouveau/mmu: flush tlbs before deleting page tables Greg Kroah-Hartman
2017-10-24 12:57 ` [PATCH 4.4 14/27] ALSA: seq: Enable use locking in all configurations Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 15/27] ALSA: hda: Remove superfluous - added by printk conversion Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 16/27] i2c: ismt: Separate I2C block read from SMBus block read Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 17/27] brcmsmac: make some local variables static const to reduce stack size Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 18/27] bus: mbus: fix window size calculation for 4GB windows Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 19/27] clockevents/drivers/cs5535: Improve resilience to spurious interrupts Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 20/27] rtlwifi: rtl8821ae: Fix connection lost problem Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 21/27] KEYS: encrypted: fix dereference of NULL user_key_payload Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 22/27] lib/digsig: " Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 23/27] KEYS: dont let add_key() update an uninstantiated key Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 24/27] pkcs7: Prevent NULL pointer dereference, since sinfo is not always set Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 25/27] parisc: Avoid trashing sr2 and sr3 in LWS code Greg Kroah-Hartman
2017-10-24 12:58 ` [PATCH 4.4 26/27] parisc: Fix double-word compare and exchange in LWS code on 32-bit kernels Greg Kroah-Hartman
2017-10-24 12:58 ` Greg Kroah-Hartman [this message]
2017-10-24 21:28 ` [PATCH 4.4 00/27] 4.4.95-stable review Guenter Roeck
2017-10-24 22:30 ` Tom Gall
[not found] ` <59ef8e09.43aadf0a.289f1.707d@mx.google.com>
2017-10-25 6:50 ` Greg Kroah-Hartman
2017-10-30 10:59 ` Kevin Hilman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171024125712.169948579@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=efault@gmx.de \
--cc=hartsjc@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=stable@vger.kernel.org \
--cc=sumit.semwal@linaro.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=vbendel@redhat.com \
--cc=vlovejoy@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).