[PATCH 2/2] kthread: call wake_up_process() whithout the lock being held
From: Dmitry Adamushko <[EMAIL PROTECTED]> Subject: kthread: call wake_up_process() whithout the lock being held - from the POV of synchronization, there should be no need to call wake_up_process() with the 'kthread_create_lock' being held; - moreover, in order to support a lockless check for list_empty(_create_list) in kthreadd() : set_current_state(TASK_INTERRUPTIBLE); if (list_empty(_create_list)) schedule(); we must ensure that a modification of the list (i.e. list_add_tail()) has been completed by the moment a state of the task is checked in try_to_wake_up(). i.e. they must not be re-ordered. wake_up_process() (i.e. try_to_wake_up() effectively) doesn't provide a full mb. By moving wake_up_process() out of the locked section, we get an UNLOCK/LOCK pair (LOCK is in try_to_wake_up()) which is guaranteed to act as a full mb. Signed-off-by: Dmitry Adamushko <[EMAIL PROTECTED]> diff --git a/kernel/kthread.c b/kernel/kthread.c index d7a7897..ec68e0f 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -158,9 +158,9 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), spin_lock(_create_lock); list_add_tail(, _create_list); - wake_up_process(kthreadd_task); spin_unlock(_create_lock); + wake_up_process(kthreadd_task); wait_for_completion(); if (!IS_ERR(create.result)) { -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/2] kthread: call wake_up_process() whithout the lock being held
From: Dmitry Adamushko [EMAIL PROTECTED] Subject: kthread: call wake_up_process() whithout the lock being held - from the POV of synchronization, there should be no need to call wake_up_process() with the 'kthread_create_lock' being held; - moreover, in order to support a lockless check for list_empty(kthread_create_list) in kthreadd() : set_current_state(TASK_INTERRUPTIBLE); if (list_empty(kthread_create_list)) schedule(); we must ensure that a modification of the list (i.e. list_add_tail()) has been completed by the moment a state of the task is checked in try_to_wake_up(). i.e. they must not be re-ordered. wake_up_process() (i.e. try_to_wake_up() effectively) doesn't provide a full mb. By moving wake_up_process() out of the locked section, we get an UNLOCK/LOCK pair (LOCK is in try_to_wake_up()) which is guaranteed to act as a full mb. Signed-off-by: Dmitry Adamushko [EMAIL PROTECTED] diff --git a/kernel/kthread.c b/kernel/kthread.c index d7a7897..ec68e0f 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -158,9 +158,9 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), spin_lock(kthread_create_lock); list_add_tail(create.list, kthread_create_list); - wake_up_process(kthreadd_task); spin_unlock(kthread_create_lock); + wake_up_process(kthreadd_task); wait_for_completion(create.done); if (!IS_ERR(create.result)) { -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/