mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [GIT PULL] workqueue fixes for v3.14-rc3
@ 2014-02-20 13:51 Tejun Heo
  0 siblings, 0 replies; only message in thread
From: Tejun Heo @ 2014-02-20 13:51 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: linux-kernel

Hello, Linus.

Two workqueue fixes.  One for an unlikely but possible critical bug
during kworker shutdown and the other to make lockdep names a bit more
descriptive.

The following changes since commit 38dbfb59d1175ef458d006556061adeaa8751b72:

  Linus 3.14-rc1 (2014-02-02 16:42:13 -0800)

are available in the git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git for-3.14-fixes

for you to fetch changes up to 5bdfff96c69a4d5ab9c49e60abf9e070ecd2acbb:

  workqueue: ensure @task is valid across kthread_stop() (2014-02-18 16:35:20 -0500)

Thanks.
----------------------------------------------------------------
Lai Jiangshan (1):
      workqueue: ensure @task is valid across kthread_stop()

Li Zhong (1):
      workqueue: add args to workqueue lockdep name

 include/linux/workqueue.h | 5 +----
 kernel/workqueue.c        | 7 +++++++
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index 594521b..704f4f6 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,
 	static struct lock_class_key __key;				\
 	const char *__lock_name;					\
 									\
-	if (__builtin_constant_p(fmt))					\
-		__lock_name = (fmt);					\
-	else								\
-		__lock_name = #fmt;					\
+	__lock_name = #fmt#args;					\
 									\
 	__alloc_workqueue_key((fmt), (flags), (max_active),		\
 			      &__key, __lock_name, ##args);		\
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 82ef9f3..193e977 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -1851,6 +1851,12 @@ static void destroy_worker(struct worker *worker)
 	if (worker->flags & WORKER_IDLE)
 		pool->nr_idle--;
 
+	/*
+	 * Once WORKER_DIE is set, the kworker may destroy itself at any
+	 * point.  Pin to ensure the task stays until we're done with it.
+	 */
+	get_task_struct(worker->task);
+
 	list_del_init(&worker->entry);
 	worker->flags |= WORKER_DIE;
 
@@ -1859,6 +1865,7 @@ static void destroy_worker(struct worker *worker)
 	spin_unlock_irq(&pool->lock);
 
 	kthread_stop(worker->task);
+	put_task_struct(worker->task);
 	kfree(worker);
 
 	spin_lock_irq(&pool->lock);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-02-20 13:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-20 13:51 [GIT PULL] workqueue fixes for v3.14-rc3 Tejun Heo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®