diff options
Diffstat (limited to 'kernel/cpuset.c')
| -rw-r--r-- | kernel/cpuset.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 9fceb97e989c..64a05da9bc4c 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -1194,6 +1194,15 @@ static int cpuset_can_attach(struct cgroup_subsys *ss, | |||
| 1194 | 1194 | ||
| 1195 | if (cpus_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed)) | 1195 | if (cpus_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed)) |
| 1196 | return -ENOSPC; | 1196 | return -ENOSPC; |
| 1197 | if (tsk->flags & PF_THREAD_BOUND) { | ||
| 1198 | cpumask_t mask; | ||
| 1199 | |||
| 1200 | mutex_lock(&callback_mutex); | ||
| 1201 | mask = cs->cpus_allowed; | ||
| 1202 | mutex_unlock(&callback_mutex); | ||
| 1203 | if (!cpus_equal(tsk->cpus_allowed, mask)) | ||
| 1204 | return -EINVAL; | ||
| 1205 | } | ||
| 1197 | 1206 | ||
| 1198 | return security_task_setscheduler(tsk, 0, NULL); | 1207 | return security_task_setscheduler(tsk, 0, NULL); |
| 1199 | } | 1208 | } |
| @@ -1207,11 +1216,14 @@ static void cpuset_attach(struct cgroup_subsys *ss, | |||
| 1207 | struct mm_struct *mm; | 1216 | struct mm_struct *mm; |
| 1208 | struct cpuset *cs = cgroup_cs(cont); | 1217 | struct cpuset *cs = cgroup_cs(cont); |
| 1209 | struct cpuset *oldcs = cgroup_cs(oldcont); | 1218 | struct cpuset *oldcs = cgroup_cs(oldcont); |
| 1219 | int err; | ||
| 1210 | 1220 | ||
| 1211 | mutex_lock(&callback_mutex); | 1221 | mutex_lock(&callback_mutex); |
| 1212 | guarantee_online_cpus(cs, &cpus); | 1222 | guarantee_online_cpus(cs, &cpus); |
| 1213 | set_cpus_allowed_ptr(tsk, &cpus); | 1223 | err = set_cpus_allowed_ptr(tsk, &cpus); |
| 1214 | mutex_unlock(&callback_mutex); | 1224 | mutex_unlock(&callback_mutex); |
| 1225 | if (err) | ||
| 1226 | return; | ||
| 1215 | 1227 | ||
| 1216 | from = oldcs->mems_allowed; | 1228 | from = oldcs->mems_allowed; |
| 1217 | to = cs->mems_allowed; | 1229 | to = cs->mems_allowed; |
