lkml.org 
[lkml]   [2007]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] kthread: Simplify kthread_create.
    Date

    This removes an unneeded completion from kthread_create and moves
    wake_up_process out of the kthread_create_lock making it clear that
    wake_up_process doesn't need the protection of the
    kthread_create_lock.

    Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
    ---
    kernel/kthread.c | 16 ++++++----------
    1 files changed, 6 insertions(+), 10 deletions(-)

    diff --git a/kernel/kthread.c b/kernel/kthread.c
    index 06c7e51..cd89b49 100644
    --- a/kernel/kthread.c
    +++ b/kernel/kthread.c
    @@ -24,7 +24,6 @@ struct kthread_create_info
    /* Information passed to kthread() from kthreadd. */
    int (*threadfn)(void *data);
    void *data;
    - struct completion started;

    /* Result passed back to kthread_create() from kthreadd. */
    struct task_struct *result;
    @@ -41,6 +40,9 @@ static int kthread(void *_create)
    void *data;
    int ret = -EINTR;

    + /* Report which task_struct I am */
    + create->result = current;
    +
    /* Setup a completion on this thread's stack */
    init_completion(&done);
    current->vfork_done = &done;
    @@ -51,7 +53,7 @@ static int kthread(void *_create)

    /* OK, tell user we're spawned, wait for stop or wakeup */
    __set_current_state(TASK_INTERRUPTIBLE);
    - complete(&create->started);
    + complete(&create->done);
    schedule();

    if (!kthread_should_stop())
    @@ -68,13 +70,8 @@ static void create_kthread(struct kthread_create_info *create)
    pid = kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD);
    if (pid < 0) {
    create->result = ERR_PTR(pid);
    - } else {
    - wait_for_completion(&create->started);
    - read_lock(&tasklist_lock);
    - create->result = find_task_by_pid(pid);
    - read_unlock(&tasklist_lock);
    + complete(&create->done);
    }
    - complete(&create->done);
    }

    /**
    @@ -105,14 +102,13 @@ struct task_struct *kthread_create(int (*threadfn)(void *data),

    create.threadfn = threadfn;
    create.data = data;
    - init_completion(&create.started);
    init_completion(&create.done);

    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)) {
    --
    1.5.0.g53756
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-04-14 05:21    [W:0.024 / U:30.192 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site