diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2008-12-01 14:18:13 -0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-12-12 17:00:07 +0100 |
commit | 27af4245b6ce99e08c6a7c38825383bf51119cc9 (patch) | |
tree | 07ab6b1da26b4d170ccaa700b2207ec1b1aff0db /include/linux/posix-timers.h | |
parent | 6c34bc2976b30dc8b56392c020e25bae1f363cab (diff) | |
download | op-kernel-dev-27af4245b6ce99e08c6a7c38825383bf51119cc9.zip op-kernel-dev-27af4245b6ce99e08c6a7c38825383bf51119cc9.tar.gz |
posix-timers: use "struct pid*" instead of "struct task_struct*"
Impact: restructure, clean up code
k_itimer holds the ref to the ->it_process until sys_timer_delete(). This
allows to pin up to RLIMIT_SIGPENDING dead task_struct's. Change the code
to use "struct pid *" instead.
The patch doesn't kill ->it_process, it places ->it_pid into the union.
->it_process is still used by do_cpu_nanosleep() as before. It would be
trivial to change the nanosleep code as well, but since it uses it_process
in a special way I think it is better to keep this field for grep.
The patch bloats the kernel by 104 bytes and it also adds the new pointer,
->it_signal, to k_itimer. It is used by lock_timer() to verify that the
found timer was not created by another process. It is not clear why do we
use the global database (and thus the global idr_lock) for posix timers.
We still need the signal_struct->posix_timers which contains all useable
timers, perhaps it is better to use some form of per-process array
instead.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/posix-timers.h')
-rw-r--r-- | include/linux/posix-timers.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index a7c7213..4f71bf4 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -45,7 +45,11 @@ struct k_itimer { int it_requeue_pending; /* waiting to requeue this timer */ #define REQUEUE_PENDING 1 int it_sigev_notify; /* notify word of sigevent struct */ - struct task_struct *it_process; /* process to send signal to */ + struct signal_struct *it_signal; + union { + struct pid *it_pid; /* pid of process to send signal to */ + struct task_struct *it_process; /* for clock_nanosleep */ + }; struct sigqueue *sigq; /* signal queue entry. */ union { struct { |