diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/pid_namespace.c | 6 | ||||
| -rw-r--r-- | kernel/workqueue.c | 12 |
2 files changed, 15 insertions, 3 deletions
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index b3c7fd554250..6144bab8fd8e 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c | |||
| @@ -232,15 +232,19 @@ static int pid_ns_ctl_handler(struct ctl_table *table, int write, | |||
| 232 | */ | 232 | */ |
| 233 | 233 | ||
| 234 | tmp.data = ¤t->nsproxy->pid_ns->last_pid; | 234 | tmp.data = ¤t->nsproxy->pid_ns->last_pid; |
| 235 | return proc_dointvec(&tmp, write, buffer, lenp, ppos); | 235 | return proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | extern int pid_max; | ||
| 239 | static int zero = 0; | ||
| 238 | static struct ctl_table pid_ns_ctl_table[] = { | 240 | static struct ctl_table pid_ns_ctl_table[] = { |
| 239 | { | 241 | { |
| 240 | .procname = "ns_last_pid", | 242 | .procname = "ns_last_pid", |
| 241 | .maxlen = sizeof(int), | 243 | .maxlen = sizeof(int), |
| 242 | .mode = 0666, /* permissions are checked in the handler */ | 244 | .mode = 0666, /* permissions are checked in the handler */ |
| 243 | .proc_handler = pid_ns_ctl_handler, | 245 | .proc_handler = pid_ns_ctl_handler, |
| 246 | .extra1 = &zero, | ||
| 247 | .extra2 = &pid_max, | ||
| 244 | }, | 248 | }, |
| 245 | { } | 249 | { } |
| 246 | }; | 250 | }; |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 1e1373bcb3e3..b80065a2450a 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -1349,8 +1349,16 @@ static void busy_worker_rebind_fn(struct work_struct *work) | |||
| 1349 | struct worker *worker = container_of(work, struct worker, rebind_work); | 1349 | struct worker *worker = container_of(work, struct worker, rebind_work); |
| 1350 | struct global_cwq *gcwq = worker->pool->gcwq; | 1350 | struct global_cwq *gcwq = worker->pool->gcwq; |
| 1351 | 1351 | ||
| 1352 | if (worker_maybe_bind_and_lock(worker)) | 1352 | worker_maybe_bind_and_lock(worker); |
| 1353 | worker_clr_flags(worker, WORKER_REBIND); | 1353 | |
| 1354 | /* | ||
| 1355 | * %WORKER_REBIND must be cleared even if the above binding failed; | ||
| 1356 | * otherwise, we may confuse the next CPU_UP cycle or oops / get | ||
| 1357 | * stuck by calling idle_worker_rebind() prematurely. If CPU went | ||
| 1358 | * down again inbetween, %WORKER_UNBOUND would be set, so clearing | ||
| 1359 | * %WORKER_REBIND is always safe. | ||
| 1360 | */ | ||
| 1361 | worker_clr_flags(worker, WORKER_REBIND); | ||
| 1354 | 1362 | ||
| 1355 | spin_unlock_irq(&gcwq->lock); | 1363 | spin_unlock_irq(&gcwq->lock); |
| 1356 | } | 1364 | } |
