Messages in this thread | | | Date | Tue, 12 May 2009 23:58:42 +0800 | From | Américo Wang <> | Subject | Re: [PATCH] kernel/async.c:introduce async_schedule*_atomic |
| |
On Tue, May 12, 2009 at 05:44:58PM +0200, Frederic Weisbecker wrote: >On Tue, May 12, 2009 at 11:13:42PM +0800, tom.leiming@gmail.com wrote: >> From: Ming Lei <tom.leiming@gmail.com> >> >> The async_schedule* may not be called in atomic contexts if out of >> memory or if there's too much work pending already, because the >> async function to be called may sleep. >> >> This patch fixes the comment of async_schedule*, and introduces >> async_schedules*_atomic to allow them called from atomic contexts >> safely. > > > >Aah, great. Such helper could easily replace some workqueues >which receive (in atomic) rare jobs but still need to exist because >they execute jobs which take too much time to be enqueued in kevents. > >A good candidate: kpsmoused! > > > >> Signed-off-by: Ming Lei <tom.leiming@gmail.com> >> --- >> include/linux/async.h | 3 ++ >> kernel/async.c | 56 ++++++++++++++++++++++++++++++++++++++++++------ >> 2 files changed, 52 insertions(+), 7 deletions(-) >> >> diff --git a/include/linux/async.h b/include/linux/async.h >> index 68a9530..ede9849 100644 >> --- a/include/linux/async.h >> +++ b/include/linux/async.h >> @@ -19,6 +19,9 @@ typedef void (async_func_ptr) (void *data, async_cookie_t cookie); >> extern async_cookie_t async_schedule(async_func_ptr *ptr, void *data); >> extern async_cookie_t async_schedule_domain(async_func_ptr *ptr, void *data, >> struct list_head *list); >> +extern async_cookie_t async_schedule_atomic(async_func_ptr *ptr, void *data); >> +extern async_cookie_t async_schedule_domain_atomic(async_func_ptr *ptr, \ > > >trailing backslash? > > >> + void *data, struct list_head *list); >> extern void async_synchronize_full(void); >> extern void async_synchronize_full_domain(struct list_head *list); >> extern void async_synchronize_cookie(async_cookie_t cookie); >> diff --git a/kernel/async.c b/kernel/async.c >> index 968ef94..6bf565b 100644 >> --- a/kernel/async.c >> +++ b/kernel/async.c >> @@ -172,12 +172,13 @@ out: >> } >> >> >> -static async_cookie_t __async_schedule(async_func_ptr *ptr, void *data, struct list_head *running) >> +static async_cookie_t __async_schedule(async_func_ptr *ptr, void *data, \ > > >another one. > > >> + struct list_head *running, int atomic) >> { >> struct async_entry *entry; >> unsigned long flags; >> async_cookie_t newcookie; >> - >> + int sync_run = 0; >> >> /* allow irq-off callers */ >> entry = kzalloc(sizeof(struct async_entry), GFP_ATOMIC); >> @@ -186,7 +187,9 @@ static async_cookie_t __async_schedule(async_func_ptr *ptr, void *data, struct l >> * If we're out of memory or if there's too much work >> * pending already, we execute synchronously. >> */ >> - if (!async_enabled || !entry || atomic_read(&entry_count) > MAX_WORK) { >> + sync_run = !async_enabled || !entry || \ >> + atomic_read(&entry_count) > MAX_WORK;
And also this one...
Hey, Ming, none of these are macros... You don't need to add backslash to join two lines, C compilers can recognize.
-- Live like a child, think like the god.
| |