diff options
Diffstat (limited to 'kernel/kthread.c')
| -rw-r--r-- | kernel/kthread.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/kthread.c b/kernel/kthread.c index 4f9c60ef95e8..1db8c72d0d38 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c | |||
| @@ -31,6 +31,8 @@ struct kthread_create_info | |||
| 31 | /* Result passed back to kthread_create() from keventd. */ | 31 | /* Result passed back to kthread_create() from keventd. */ |
| 32 | struct task_struct *result; | 32 | struct task_struct *result; |
| 33 | struct completion done; | 33 | struct completion done; |
| 34 | |||
| 35 | struct work_struct work; | ||
| 34 | }; | 36 | }; |
| 35 | 37 | ||
| 36 | struct kthread_stop_info | 38 | struct kthread_stop_info |
| @@ -111,9 +113,10 @@ static int kthread(void *_create) | |||
| 111 | } | 113 | } |
| 112 | 114 | ||
| 113 | /* We are keventd: create a thread. */ | 115 | /* We are keventd: create a thread. */ |
| 114 | static void keventd_create_kthread(void *_create) | 116 | static void keventd_create_kthread(struct work_struct *work) |
| 115 | { | 117 | { |
| 116 | struct kthread_create_info *create = _create; | 118 | struct kthread_create_info *create = |
| 119 | container_of(work, struct kthread_create_info, work); | ||
| 117 | int pid; | 120 | int pid; |
| 118 | 121 | ||
| 119 | /* We want our own signal handler (we take no signals by default). */ | 122 | /* We want our own signal handler (we take no signals by default). */ |
| @@ -154,20 +157,20 @@ struct task_struct *kthread_create(int (*threadfn)(void *data), | |||
| 154 | ...) | 157 | ...) |
| 155 | { | 158 | { |
| 156 | struct kthread_create_info create; | 159 | struct kthread_create_info create; |
| 157 | DECLARE_WORK(work, keventd_create_kthread, &create); | ||
| 158 | 160 | ||
| 159 | create.threadfn = threadfn; | 161 | create.threadfn = threadfn; |
| 160 | create.data = data; | 162 | create.data = data; |
| 161 | init_completion(&create.started); | 163 | init_completion(&create.started); |
| 162 | init_completion(&create.done); | 164 | init_completion(&create.done); |
| 165 | INIT_WORK(&create.work, keventd_create_kthread); | ||
| 163 | 166 | ||
| 164 | /* | 167 | /* |
| 165 | * The workqueue needs to start up first: | 168 | * The workqueue needs to start up first: |
| 166 | */ | 169 | */ |
| 167 | if (!helper_wq) | 170 | if (!helper_wq) |
| 168 | work.func(work.data); | 171 | create.work.func(&create.work); |
| 169 | else { | 172 | else { |
| 170 | queue_work(helper_wq, &work); | 173 | queue_work(helper_wq, &create.work); |
| 171 | wait_for_completion(&create.done); | 174 | wait_for_completion(&create.done); |
| 172 | } | 175 | } |
| 173 | if (!IS_ERR(create.result)) { | 176 | if (!IS_ERR(create.result)) { |
