Re: [PATCH 1/4] add task handling notifier: base definitions

2008-01-23 Thread Matt Helsley

On Wed, 2008-01-09 at 09:46 +, Jan Beulich wrote:
> >> +BLOCKING_NOTIFIER_HEAD(task_notifier_list);
> >> +EXPORT_SYMBOL_GPL(task_notifier_list);
> >> +ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
> >> +EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
> >> +
> >
> >When these global notifier lists were proposed years ago folks at SGI
> >loudly objected with concerns over anticipated cache line bouncing on
> >512+ cpu machines. Is that no longer a concern?
> 
> I can't see an alternative, since the serialization is unavoidable.

There are definitely alternatives. Naturally they are all much more
complex than using a single notifier chain. You could do per-cpu chains
for example (ugly, I know..).

> >> @@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
> >>WARN_ON(atomic_read(>usage));
> >>WARN_ON(tsk == current);
> >> 
> >> +  atomic_notifier_call_chain(_task_notifier_list,
> >> + TASK_DELETE, tsk);
> >> +
> >>security_task_free(tsk);
> >>free_uid(tsk->user);
> >>put_group_info(tsk->group_info);
> >
> >Would the atomic notifier call chain be necessary if you hooked into an
> >earlier section of do_exit() instead?
> 
> I'm afraid it is, as I was told that sleeping in the do_exit() path is not
> generally possible.
> 
> Jan

Odd. Last I checked I thought I saw a bunch of calls in do_exit() that
could sleep. Only in certain sections and at the end did it appear to
prevent sleeping.

Sorry for the late reply.

Cheers,
-Matt Helsley

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/4] add task handling notifier: base definitions

2008-01-23 Thread Matt Helsley

On Wed, 2008-01-09 at 09:46 +, Jan Beulich wrote:
  +BLOCKING_NOTIFIER_HEAD(task_notifier_list);
  +EXPORT_SYMBOL_GPL(task_notifier_list);
  +ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
  +EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
  +
 
 When these global notifier lists were proposed years ago folks at SGI
 loudly objected with concerns over anticipated cache line bouncing on
 512+ cpu machines. Is that no longer a concern?
 
 I can't see an alternative, since the serialization is unavoidable.

There are definitely alternatives. Naturally they are all much more
complex than using a single notifier chain. You could do per-cpu chains
for example (ugly, I know..).

  @@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
 WARN_ON(atomic_read(tsk-usage));
 WARN_ON(tsk == current);
  
  +  atomic_notifier_call_chain(atomic_task_notifier_list,
  + TASK_DELETE, tsk);
  +
 security_task_free(tsk);
 free_uid(tsk-user);
 put_group_info(tsk-group_info);
 
 Would the atomic notifier call chain be necessary if you hooked into an
 earlier section of do_exit() instead?
 
 I'm afraid it is, as I was told that sleeping in the do_exit() path is not
 generally possible.
 
 Jan

Odd. Last I checked I thought I saw a bunch of calls in do_exit() that
could sleep. Only in certain sections and at the end did it appear to
prevent sleeping.

Sorry for the late reply.

Cheers,
-Matt Helsley

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/4] add task handling notifier: base definitions

2008-01-09 Thread Jan Beulich
>> +BLOCKING_NOTIFIER_HEAD(task_notifier_list);
>> +EXPORT_SYMBOL_GPL(task_notifier_list);
>> +ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
>> +EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
>> +
>
>When these global notifier lists were proposed years ago folks at SGI
>loudly objected with concerns over anticipated cache line bouncing on
>512+ cpu machines. Is that no longer a concern?

I can't see an alternative, since the serialization is unavoidable.

>> @@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
>>  WARN_ON(atomic_read(>usage));
>>  WARN_ON(tsk == current);
>> 
>> +atomic_notifier_call_chain(_task_notifier_list,
>> +   TASK_DELETE, tsk);
>> +
>>  security_task_free(tsk);
>>  free_uid(tsk->user);
>>  put_group_info(tsk->group_info);
>
>Would the atomic notifier call chain be necessary if you hooked into an
>earlier section of do_exit() instead?

I'm afraid it is, as I was told that sleeping in the do_exit() path is not
generally possible.

Jan

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/4] add task handling notifier: base definitions

2008-01-09 Thread Jan Beulich
 +BLOCKING_NOTIFIER_HEAD(task_notifier_list);
 +EXPORT_SYMBOL_GPL(task_notifier_list);
 +ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
 +EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
 +

When these global notifier lists were proposed years ago folks at SGI
loudly objected with concerns over anticipated cache line bouncing on
512+ cpu machines. Is that no longer a concern?

I can't see an alternative, since the serialization is unavoidable.

 @@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
  WARN_ON(atomic_read(tsk-usage));
  WARN_ON(tsk == current);
 
 +atomic_notifier_call_chain(atomic_task_notifier_list,
 +   TASK_DELETE, tsk);
 +
  security_task_free(tsk);
  free_uid(tsk-user);
  put_group_info(tsk-group_info);

Would the atomic notifier call chain be necessary if you hooked into an
earlier section of do_exit() instead?

I'm afraid it is, as I was told that sleeping in the do_exit() path is not
generally possible.

Jan

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/4] add task handling notifier: base definitions

2008-01-08 Thread Matthew Helsley
On Thu, 2007-12-20 at 13:12 +, Jan Beulich wrote:
> This is the base patch, adding notification for task creation and
> deletion.
> 
> Signed-off-by: Jan Beulich <[EMAIL PROTECTED]>
> ---
>  include/linux/sched.h |8 +++-
>  kernel/fork.c |   11 +++
>  2 files changed, 18 insertions(+), 1 deletion(-)
> 
> --- 2.6.24-rc5-notify-task.orig/include/linux/sched.h
> +++ 2.6.24-rc5-notify-task/include/linux/sched.h
> @@ -80,7 +80,7 @@ struct sched_param {
>  #include 
>  #include 
>  #include 
> -
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -1700,6 +1700,12 @@ extern int do_execve(char *, char __user
>  extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned 
> long, int __user *, int __user *);
>  struct task_struct *fork_idle(int);
> 
> +#define TASK_NEW 1
> +#define TASK_DELETE 2
> +
> +extern struct blocking_notifier_head task_notifier_list;
> +extern struct atomic_notifier_head atomic_task_notifier_list;
> +
>  extern void set_task_comm(struct task_struct *tsk, char *from);
>  extern void get_task_comm(char *to, struct task_struct *tsk);
> 
> --- 2.6.24-rc5-notify-task.orig/kernel/fork.c
> +++ 2.6.24-rc5-notify-task/kernel/fork.c
> @@ -46,6 +46,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -71,6 +72,11 @@ DEFINE_PER_CPU(unsigned long, process_co
> 
>  __cacheline_aligned DEFINE_RWLOCK(tasklist_lock);  /* outer */
> 
> +BLOCKING_NOTIFIER_HEAD(task_notifier_list);
> +EXPORT_SYMBOL_GPL(task_notifier_list);
> +ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
> +EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
> +

When these global notifier lists were proposed years ago folks at SGI
loudly objected with concerns over anticipated cache line bouncing on
512+ cpu machines. Is that no longer a concern?

>  int nr_processes(void)
>  {
>   int cpu;
> @@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
>   WARN_ON(atomic_read(>usage));
>   WARN_ON(tsk == current);
> 
> + atomic_notifier_call_chain(_task_notifier_list,
> +TASK_DELETE, tsk);
> +
>   security_task_free(tsk);
>   free_uid(tsk->user);
>   put_group_info(tsk->group_info);

Would the atomic notifier call chain be necessary if you hooked into an
earlier section of do_exit() instead?

Cheers,
-Matt Helsley

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/4] add task handling notifier: base definitions

2008-01-08 Thread Matthew Helsley
On Thu, 2007-12-20 at 13:12 +, Jan Beulich wrote:
 This is the base patch, adding notification for task creation and
 deletion.
 
 Signed-off-by: Jan Beulich [EMAIL PROTECTED]
 ---
  include/linux/sched.h |8 +++-
  kernel/fork.c |   11 +++
  2 files changed, 18 insertions(+), 1 deletion(-)
 
 --- 2.6.24-rc5-notify-task.orig/include/linux/sched.h
 +++ 2.6.24-rc5-notify-task/include/linux/sched.h
 @@ -80,7 +80,7 @@ struct sched_param {
  #include linux/rcupdate.h
  #include linux/futex.h
  #include linux/rtmutex.h
 -
 +#include linux/notifier.h
  #include linux/time.h
  #include linux/param.h
  #include linux/resource.h
 @@ -1700,6 +1700,12 @@ extern int do_execve(char *, char __user
  extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned 
 long, int __user *, int __user *);
  struct task_struct *fork_idle(int);
 
 +#define TASK_NEW 1
 +#define TASK_DELETE 2
 +
 +extern struct blocking_notifier_head task_notifier_list;
 +extern struct atomic_notifier_head atomic_task_notifier_list;
 +
  extern void set_task_comm(struct task_struct *tsk, char *from);
  extern void get_task_comm(char *to, struct task_struct *tsk);
 
 --- 2.6.24-rc5-notify-task.orig/kernel/fork.c
 +++ 2.6.24-rc5-notify-task/kernel/fork.c
 @@ -46,6 +46,7 @@
  #include linux/tsacct_kern.h
  #include linux/cn_proc.h
  #include linux/freezer.h
 +#include linux/notifier.h
  #include linux/delayacct.h
  #include linux/taskstats_kern.h
  #include linux/random.h
 @@ -71,6 +72,11 @@ DEFINE_PER_CPU(unsigned long, process_co
 
  __cacheline_aligned DEFINE_RWLOCK(tasklist_lock);  /* outer */
 
 +BLOCKING_NOTIFIER_HEAD(task_notifier_list);
 +EXPORT_SYMBOL_GPL(task_notifier_list);
 +ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
 +EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
 +

When these global notifier lists were proposed years ago folks at SGI
loudly objected with concerns over anticipated cache line bouncing on
512+ cpu machines. Is that no longer a concern?

  int nr_processes(void)
  {
   int cpu;
 @@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
   WARN_ON(atomic_read(tsk-usage));
   WARN_ON(tsk == current);
 
 + atomic_notifier_call_chain(atomic_task_notifier_list,
 +TASK_DELETE, tsk);
 +
   security_task_free(tsk);
   free_uid(tsk-user);
   put_group_info(tsk-group_info);

Would the atomic notifier call chain be necessary if you hooked into an
earlier section of do_exit() instead?

Cheers,
-Matt Helsley

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/4] add task handling notifier: base definitions

2007-12-21 Thread Andi Kleen
"Jan Beulich" <[EMAIL PROTECTED]> writes:

> This is the base patch, adding notification for task creation and
> deletion.

I like the basic concept. At some point I suspect we'll even need
a per task dynamic data allocator, that would remove even
more cruft.

Could you change the block notifier calls first to not take their lock
when there is nothing in the list (the common case)? It is 
weird that they don't already do this, but they should definitely
here.

I think the use of the blocking/atomic notifiers needs some comment.
I think I understand why you did it -- exit atomic because sleeping
in exit can be illegal and blocking for fork to allow GFP_KERNEL
allocations -- but that should be documented somewhere.

-Andi
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 1/4] add task handling notifier: base definitions

2007-12-21 Thread Andi Kleen
Jan Beulich [EMAIL PROTECTED] writes:

 This is the base patch, adding notification for task creation and
 deletion.

I like the basic concept. At some point I suspect we'll even need
a per task dynamic data allocator, that would remove even
more cruft.

Could you change the block notifier calls first to not take their lock
when there is nothing in the list (the common case)? It is 
weird that they don't already do this, but they should definitely
here.

I think the use of the blocking/atomic notifiers needs some comment.
I think I understand why you did it -- exit atomic because sleeping
in exit can be illegal and blocking for fork to allow GFP_KERNEL
allocations -- but that should be documented somewhere.

-Andi
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/4] add task handling notifier: base definitions

2007-12-20 Thread Jan Beulich
This is the base patch, adding notification for task creation and
deletion.

Signed-off-by: Jan Beulich <[EMAIL PROTECTED]>
---
 include/linux/sched.h |8 +++-
 kernel/fork.c |   11 +++
 2 files changed, 18 insertions(+), 1 deletion(-)

--- 2.6.24-rc5-notify-task.orig/include/linux/sched.h
+++ 2.6.24-rc5-notify-task/include/linux/sched.h
@@ -80,7 +80,7 @@ struct sched_param {
 #include 
 #include 
 #include 
-
+#include 
 #include 
 #include 
 #include 
@@ -1700,6 +1700,12 @@ extern int do_execve(char *, char __user
 extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned 
long, int __user *, int __user *);
 struct task_struct *fork_idle(int);
 
+#define TASK_NEW 1
+#define TASK_DELETE 2
+
+extern struct blocking_notifier_head task_notifier_list;
+extern struct atomic_notifier_head atomic_task_notifier_list;
+
 extern void set_task_comm(struct task_struct *tsk, char *from);
 extern void get_task_comm(char *to, struct task_struct *tsk);
 
--- 2.6.24-rc5-notify-task.orig/kernel/fork.c
+++ 2.6.24-rc5-notify-task/kernel/fork.c
@@ -46,6 +46,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -71,6 +72,11 @@ DEFINE_PER_CPU(unsigned long, process_co
 
 __cacheline_aligned DEFINE_RWLOCK(tasklist_lock);  /* outer */
 
+BLOCKING_NOTIFIER_HEAD(task_notifier_list);
+EXPORT_SYMBOL_GPL(task_notifier_list);
+ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
+EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
+
 int nr_processes(void)
 {
int cpu;
@@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
WARN_ON(atomic_read(>usage));
WARN_ON(tsk == current);
 
+   atomic_notifier_call_chain(_task_notifier_list,
+  TASK_DELETE, tsk);
+
security_task_free(tsk);
free_uid(tsk->user);
put_group_info(tsk->group_info);
@@ -1450,6 +1459,8 @@ long do_fork(unsigned long clone_flags,
set_tsk_thread_flag(p, TIF_SIGPENDING);
}
 
+   blocking_notifier_call_chain(_notifier_list, TASK_NEW, p);
+
if (!(clone_flags & CLONE_STOPPED))
wake_up_new_task(p, clone_flags);
else



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 1/4] add task handling notifier: base definitions

2007-12-20 Thread Jan Beulich
This is the base patch, adding notification for task creation and
deletion.

Signed-off-by: Jan Beulich [EMAIL PROTECTED]
---
 include/linux/sched.h |8 +++-
 kernel/fork.c |   11 +++
 2 files changed, 18 insertions(+), 1 deletion(-)

--- 2.6.24-rc5-notify-task.orig/include/linux/sched.h
+++ 2.6.24-rc5-notify-task/include/linux/sched.h
@@ -80,7 +80,7 @@ struct sched_param {
 #include linux/rcupdate.h
 #include linux/futex.h
 #include linux/rtmutex.h
-
+#include linux/notifier.h
 #include linux/time.h
 #include linux/param.h
 #include linux/resource.h
@@ -1700,6 +1700,12 @@ extern int do_execve(char *, char __user
 extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned 
long, int __user *, int __user *);
 struct task_struct *fork_idle(int);
 
+#define TASK_NEW 1
+#define TASK_DELETE 2
+
+extern struct blocking_notifier_head task_notifier_list;
+extern struct atomic_notifier_head atomic_task_notifier_list;
+
 extern void set_task_comm(struct task_struct *tsk, char *from);
 extern void get_task_comm(char *to, struct task_struct *tsk);
 
--- 2.6.24-rc5-notify-task.orig/kernel/fork.c
+++ 2.6.24-rc5-notify-task/kernel/fork.c
@@ -46,6 +46,7 @@
 #include linux/tsacct_kern.h
 #include linux/cn_proc.h
 #include linux/freezer.h
+#include linux/notifier.h
 #include linux/delayacct.h
 #include linux/taskstats_kern.h
 #include linux/random.h
@@ -71,6 +72,11 @@ DEFINE_PER_CPU(unsigned long, process_co
 
 __cacheline_aligned DEFINE_RWLOCK(tasklist_lock);  /* outer */
 
+BLOCKING_NOTIFIER_HEAD(task_notifier_list);
+EXPORT_SYMBOL_GPL(task_notifier_list);
+ATOMIC_NOTIFIER_HEAD(atomic_task_notifier_list);
+EXPORT_SYMBOL_GPL(atomic_task_notifier_list);
+
 int nr_processes(void)
 {
int cpu;
@@ -121,6 +127,9 @@ void __put_task_struct(struct task_struc
WARN_ON(atomic_read(tsk-usage));
WARN_ON(tsk == current);
 
+   atomic_notifier_call_chain(atomic_task_notifier_list,
+  TASK_DELETE, tsk);
+
security_task_free(tsk);
free_uid(tsk-user);
put_group_info(tsk-group_info);
@@ -1450,6 +1459,8 @@ long do_fork(unsigned long clone_flags,
set_tsk_thread_flag(p, TIF_SIGPENDING);
}
 
+   blocking_notifier_call_chain(task_notifier_list, TASK_NEW, p);
+
if (!(clone_flags  CLONE_STOPPED))
wake_up_new_task(p, clone_flags);
else



--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/