diff options
-rw-r--r-- | include/linux/workqueue.h | 5 | ||||
-rw-r--r-- | kernel/workqueue.c | 7 |
2 files changed, 8 insertions, 4 deletions
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h index 594521ba0d43..704f4f652d0a 100644 --- a/include/linux/workqueue.h +++ b/include/linux/workqueue.h | |||
@@ -419,10 +419,7 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, | |||
419 | static struct lock_class_key __key; \ | 419 | static struct lock_class_key __key; \ |
420 | const char *__lock_name; \ | 420 | const char *__lock_name; \ |
421 | \ | 421 | \ |
422 | if (__builtin_constant_p(fmt)) \ | 422 | __lock_name = #fmt#args; \ |
423 | __lock_name = (fmt); \ | ||
424 | else \ | ||
425 | __lock_name = #fmt; \ | ||
426 | \ | 423 | \ |
427 | __alloc_workqueue_key((fmt), (flags), (max_active), \ | 424 | __alloc_workqueue_key((fmt), (flags), (max_active), \ |
428 | &__key, __lock_name, ##args); \ | 425 | &__key, __lock_name, ##args); \ |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 82ef9f3b7473..193e977a10ea 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -1851,6 +1851,12 @@ static void destroy_worker(struct worker *worker) | |||
1851 | if (worker->flags & WORKER_IDLE) | 1851 | if (worker->flags & WORKER_IDLE) |
1852 | pool->nr_idle--; | 1852 | pool->nr_idle--; |
1853 | 1853 | ||
1854 | /* | ||
1855 | * Once WORKER_DIE is set, the kworker may destroy itself at any | ||
1856 | * point. Pin to ensure the task stays until we're done with it. | ||
1857 | */ | ||
1858 | get_task_struct(worker->task); | ||
1859 | |||
1854 | list_del_init(&worker->entry); | 1860 | list_del_init(&worker->entry); |
1855 | worker->flags |= WORKER_DIE; | 1861 | worker->flags |= WORKER_DIE; |
1856 | 1862 | ||
@@ -1859,6 +1865,7 @@ static void destroy_worker(struct worker *worker) | |||
1859 | spin_unlock_irq(&pool->lock); | 1865 | spin_unlock_irq(&pool->lock); |
1860 | 1866 | ||
1861 | kthread_stop(worker->task); | 1867 | kthread_stop(worker->task); |
1868 | put_task_struct(worker->task); | ||
1862 | kfree(worker); | 1869 | kfree(worker); |
1863 | 1870 | ||
1864 | spin_lock_irq(&pool->lock); | 1871 | spin_lock_irq(&pool->lock); |