On Tue, 2006-06-20 at 15:28 +1000, Peter Williams wrote:Matt Helsley wrote:This introduces a second, per-task, blocking notifier chain. The per-task[bits deleted]
chain offers watchers the chance to register with a specific task nstead of
all tasks. It also allows the watcher to associate a block of data with the task
by wrapping the notifier block using containerof().
Both the global, all-tasks chain and the per-task chain are called from the samefunction. The two types of chains share the same set of notification
values, however registration functions and the registered notifier blocks must
be separate.
These notifiers are only safe if notifier blocks are registered with the current
task while in the context of the current task. This ensures that there are no
races between registration, unregistration, and notification.
Signed-off-by: Matt Helsley <matthltc@xxxxxxxxxx>
Cc: Jes Sorensen <jes@xxxxxxx>
Cc: Chandra S. Seetharaman <sekharan@xxxxxxxxxx>
Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
Index: linux-2.6.17-rc6-mm2/kernel/sys.cIt's possible for this task to exit without returning a result.
===================================================================
--- linux-2.6.17-rc6-mm2.orig/kernel/sys.c
+++ linux-2.6.17-rc6-mm2/kernel/sys.c
@@ -450,13 +450,41 @@ int unregister_task_watcher(struct notif
return blocking_notifier_chain_unregister(&task_watchers, nb);
}
EXPORT_SYMBOL_GPL(unregister_task_watcher);
+static inline int notify_per_task_watchers(unsigned int val,
+ struct task_struct *task)
+{
+ if (get_watch_event(val) != WATCH_TASK_INIT)
+ return raw_notifier_call_chain(&task->notify, val, task);
+ RAW_INIT_NOTIFIER_HEAD(&task->notify);
+ if (task->real_parent)
+ return raw_notifier_call_chain(&task->real_parent->notify,
+ val, task);
+}
Assuming you meant s/task/function/:
In the common case this will return a result because most tasks have a
real parent. The only exception should be the init task. However, the
init task does not "fork" from another task so this function will never
get called with WATCH_TASK_INIT and the init task.
This means that if one wants to use per-task watchers to associate data
and a function call with *every* task, special care will need to be
taken to register with the init task.