All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kernel:async function call:introduce async_run
@ 2009-05-13  0:33 tom.leiming
  2009-05-13 11:02 ` Cornelia Huck
  2009-05-17 20:58 ` Arjan van de Ven
  0 siblings, 2 replies; 6+ messages in thread
From: tom.leiming @ 2009-05-13  0:33 UTC (permalink / raw)
  To: arjan; +Cc: linux-kernel, akpm, Ming Lei

From: Ming Lei <tom.leiming@gmail.com>

In fact, some async function call does not need to check, async_run
is right for this kind of function call. Also, async_run is very
suitable to used to start a thread in atomic context to do somthing,
for now there is no such kind of kernel api, eg. kthread_run
can not be started in atomic context.

This patch is againt my another patch:
   kernel/async.c:introduce async_schedule*_atomic
please review.

Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
 include/linux/async.h |    1 +
 kernel/async.c        |   24 +++++++++++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/include/linux/async.h b/include/linux/async.h
index ede9849..5390572 100644
--- a/include/linux/async.h
+++ b/include/linux/async.h
@@ -16,6 +16,7 @@
 typedef u64 async_cookie_t;
 typedef void (async_func_ptr) (void *data, async_cookie_t cookie);
 
+extern void async_run(async_func_ptr *ptr, void *data);
 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);
diff --git a/kernel/async.c b/kernel/async.c
index 6bf565b..9cc4670 100644
--- a/kernel/async.c
+++ b/kernel/async.c
@@ -60,6 +60,7 @@ asynchronous and synchronous parts of the kernel.
 
 static async_cookie_t next_cookie = 1;
 
+#define MAX_COOKIE	(~0)
 #define MAX_THREADS	256
 #define MAX_WORK	32768
 
@@ -207,7 +208,10 @@ static async_cookie_t __async_schedule(async_func_ptr *ptr, void *data, \
 	entry->running = running;
 
 	spin_lock_irqsave(&async_lock, flags);
-	newcookie = entry->cookie = next_cookie++;
+	if (atomic == 1)
+		newcookie = entry->cookie = next_cookie++;
+	else
+		newcookie = entry->cookie = MAX_COOKIE;
 	list_add_tail(&entry->list, &async_pending);
 	atomic_inc(&entry_count);
 	spin_unlock_irqrestore(&async_lock, flags);
@@ -216,6 +220,24 @@ static async_cookie_t __async_schedule(async_func_ptr *ptr, void *data, \
 }
 
 /**
+ * async_run - schedule a function for asynchronous execution
+ * @ptr: function to execute asynchronously
+ * @data: data pointer to pass to the function
+ *
+ * Note:we do not allocate a cookie for this kind of aysnchronous
+ * function to decrease the wait time of async_synchronize_full().
+ * In fact, some function does not need to check, async_run is right
+ * for this kind of function call. Also, async_run is very suitable to
+ * start a thread to do somthing in atomic context,for now there is no such
+ * kind of kernel api, eg. kthread_run can not be run in atomic context.
+ */
+void async_run(async_func_ptr *ptr, void *data)
+{
+	__async_schedule(ptr, data, &async_running, 2);
+}
+EXPORT_SYMBOL_GPL(async_run);
+
+/**
  * async_schedule - schedule a function for asynchronous execution
  * @ptr: function to execute asynchronously
  * @data: data pointer to pass to the function
-- 
1.6.0.GIT


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-05-17 20:59 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-05-13  0:33 [PATCH] kernel:async function call:introduce async_run tom.leiming
2009-05-13 11:02 ` Cornelia Huck
2009-05-13 12:56   ` Ming Lei
2009-05-13 13:31     ` Cornelia Huck
2009-05-13 14:27       ` Ming Lei
2009-05-17 20:58 ` Arjan van de Ven

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.