diff options
| author | Cornelia Huck <cornelia.huck@de.ibm.com> | 2009-01-19 07:45:31 -0500 |
|---|---|---|
| committer | Arjan van de Ven <arjan@linux.intel.com> | 2009-02-08 12:56:10 -0500 |
| commit | 86532d8b167e71e24da8b564348b52977b76d15f (patch) | |
| tree | 86cfa88409db2867ddfc45322f7cd3175b6accad | |
| parent | 7a89bbc74937cd74a6bcf109cfc7c032109639be (diff) | |
async: Handle kthread_run() return codes.
If we fail to create the manager thread, fall back to non-fastboot.
If we fail to create an async thread, try again after waiting for
a bit.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
| -rw-r--r-- | kernel/async.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/async.c b/kernel/async.c index 0c90d500ab6..078d5ed150d 100644 --- a/kernel/async.c +++ b/kernel/async.c | |||
| @@ -54,6 +54,7 @@ asynchronous and synchronous parts of the kernel. | |||
| 54 | #include <linux/sched.h> | 54 | #include <linux/sched.h> |
| 55 | #include <linux/init.h> | 55 | #include <linux/init.h> |
| 56 | #include <linux/kthread.h> | 56 | #include <linux/kthread.h> |
| 57 | #include <linux/delay.h> | ||
| 57 | #include <asm/atomic.h> | 58 | #include <asm/atomic.h> |
| 58 | 59 | ||
| 59 | static async_cookie_t next_cookie = 1; | 60 | static async_cookie_t next_cookie = 1; |
| @@ -319,7 +320,11 @@ static int async_manager_thread(void *unused) | |||
| 319 | ec = atomic_read(&entry_count); | 320 | ec = atomic_read(&entry_count); |
| 320 | 321 | ||
| 321 | while (tc < ec && tc < MAX_THREADS) { | 322 | while (tc < ec && tc < MAX_THREADS) { |
| 322 | kthread_run(async_thread, NULL, "async/%i", tc); | 323 | if (IS_ERR(kthread_run(async_thread, NULL, "async/%i", |
| 324 | tc))) { | ||
| 325 | msleep(100); | ||
| 326 | continue; | ||
| 327 | } | ||
| 323 | atomic_inc(&thread_count); | 328 | atomic_inc(&thread_count); |
| 324 | tc++; | 329 | tc++; |
| 325 | } | 330 | } |
| @@ -334,7 +339,9 @@ static int async_manager_thread(void *unused) | |||
| 334 | static int __init async_init(void) | 339 | static int __init async_init(void) |
| 335 | { | 340 | { |
| 336 | if (async_enabled) | 341 | if (async_enabled) |
| 337 | kthread_run(async_manager_thread, NULL, "async/mgr"); | 342 | if (IS_ERR(kthread_run(async_manager_thread, NULL, |
| 343 | "async/mgr"))) | ||
| 344 | async_enabled = 0; | ||
| 338 | return 0; | 345 | return 0; |
| 339 | } | 346 | } |
| 340 | 347 | ||
