diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/kthread.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/kernel/kthread.c b/kernel/kthread.c index a84dee265f94..9b12d65186f7 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c | |||
@@ -324,12 +324,6 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data), | |||
324 | return p; | 324 | return p; |
325 | } | 325 | } |
326 | 326 | ||
327 | static struct kthread *task_get_live_kthread(struct task_struct *k) | ||
328 | { | ||
329 | get_task_struct(k); | ||
330 | return to_live_kthread(k); | ||
331 | } | ||
332 | |||
333 | static void __kthread_unpark(struct task_struct *k, struct kthread *kthread) | 327 | static void __kthread_unpark(struct task_struct *k, struct kthread *kthread) |
334 | { | 328 | { |
335 | clear_bit(KTHREAD_SHOULD_PARK, &kthread->flags); | 329 | clear_bit(KTHREAD_SHOULD_PARK, &kthread->flags); |
@@ -356,11 +350,10 @@ static void __kthread_unpark(struct task_struct *k, struct kthread *kthread) | |||
356 | */ | 350 | */ |
357 | void kthread_unpark(struct task_struct *k) | 351 | void kthread_unpark(struct task_struct *k) |
358 | { | 352 | { |
359 | struct kthread *kthread = task_get_live_kthread(k); | 353 | struct kthread *kthread = to_live_kthread(k); |
360 | 354 | ||
361 | if (kthread) | 355 | if (kthread) |
362 | __kthread_unpark(k, kthread); | 356 | __kthread_unpark(k, kthread); |
363 | put_task_struct(k); | ||
364 | } | 357 | } |
365 | 358 | ||
366 | /** | 359 | /** |
@@ -377,7 +370,7 @@ void kthread_unpark(struct task_struct *k) | |||
377 | */ | 370 | */ |
378 | int kthread_park(struct task_struct *k) | 371 | int kthread_park(struct task_struct *k) |
379 | { | 372 | { |
380 | struct kthread *kthread = task_get_live_kthread(k); | 373 | struct kthread *kthread = to_live_kthread(k); |
381 | int ret = -ENOSYS; | 374 | int ret = -ENOSYS; |
382 | 375 | ||
383 | if (kthread) { | 376 | if (kthread) { |
@@ -390,7 +383,6 @@ int kthread_park(struct task_struct *k) | |||
390 | } | 383 | } |
391 | ret = 0; | 384 | ret = 0; |
392 | } | 385 | } |
393 | put_task_struct(k); | ||
394 | return ret; | 386 | return ret; |
395 | } | 387 | } |
396 | 388 | ||
@@ -411,10 +403,13 @@ int kthread_park(struct task_struct *k) | |||
411 | */ | 403 | */ |
412 | int kthread_stop(struct task_struct *k) | 404 | int kthread_stop(struct task_struct *k) |
413 | { | 405 | { |
414 | struct kthread *kthread = task_get_live_kthread(k); | 406 | struct kthread *kthread; |
415 | int ret; | 407 | int ret; |
416 | 408 | ||
417 | trace_sched_kthread_stop(k); | 409 | trace_sched_kthread_stop(k); |
410 | |||
411 | get_task_struct(k); | ||
412 | kthread = to_live_kthread(k); | ||
418 | if (kthread) { | 413 | if (kthread) { |
419 | set_bit(KTHREAD_SHOULD_STOP, &kthread->flags); | 414 | set_bit(KTHREAD_SHOULD_STOP, &kthread->flags); |
420 | __kthread_unpark(k, kthread); | 415 | __kthread_unpark(k, kthread); |
@@ -422,10 +417,9 @@ int kthread_stop(struct task_struct *k) | |||
422 | wait_for_completion(&kthread->exited); | 417 | wait_for_completion(&kthread->exited); |
423 | } | 418 | } |
424 | ret = k->exit_code; | 419 | ret = k->exit_code; |
425 | |||
426 | put_task_struct(k); | 420 | put_task_struct(k); |
427 | trace_sched_kthread_stop_ret(ret); | ||
428 | 421 | ||
422 | trace_sched_kthread_stop_ret(ret); | ||
429 | return ret; | 423 | return ret; |
430 | } | 424 | } |
431 | EXPORT_SYMBOL(kthread_stop); | 425 | EXPORT_SYMBOL(kthread_stop); |