CHROMIUM: cgroups: relax permissions on moving tasks between cgroups

Android expects system_server to be able to move tasks between different
cgroups/cpusets, but does not want to be running as root. Let's relax
permission check so that processes can move other tasks if they have
CAP_SYS_NICE in the affected task's user namespace.

BUG=b:31790445,chromium:647994
TEST=Boot android container, examine logcat

Change-Id: Ia919c66ab6ed6a6daf7c4cf67feb38b13b1ad09b
Signed-off-by: Dmitry Torokhov <dtor@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/394927
Reviewed-by: Ricky Zhou <rickyz@chromium.org>
Signed-off-by: Amit Pundir <amit.pundir@linaro.org>
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 4c9a7eb..111f24d 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -2675,7 +2675,8 @@
 	 */
 	if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) &&
 			!uid_eq(cred->euid, tcred->uid) &&
-			!uid_eq(cred->euid, tcred->suid))
+			!uid_eq(cred->euid, tcred->suid) &&
+			!ns_capable(tcred->user_ns, CAP_SYS_NICE))
 			ret = -EACCES;
 
 	if (!ret && cgroup_on_dfl(dst_cgrp)) {