mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
posix-timers: Move POSIX timer group exit related code out of do_exit()
Move the POSIX timer group exit handling into the posix timer code and provide a proper stub when POSIX timers are disabled in Kconfig. No functional change. Signed-off-by: Thomas Gleixner <tglx@kernel.org> Tested-by: Kijo Park <red993688@gmail.com> Reviewed-by: Frederic Weisbecker <frederic@kernel.org> Reviewed-by: Oleg Nesterov <oleg@redhat.com> Link: https://patch.msgid.link/20260911090541.733966325@kernel.org
This commit is contained in:
parent
7117334f02
commit
24adce0b86
|
|
@ -233,6 +233,7 @@ int update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new);
|
|||
|
||||
#ifdef CONFIG_POSIX_TIMERS
|
||||
void posixtimer_exec(void);
|
||||
void posixtimer_exit(void);
|
||||
|
||||
static inline void posixtimer_putref(struct k_itimer *tmr)
|
||||
{
|
||||
|
|
@ -262,6 +263,7 @@ static inline bool posixtimer_valid(const struct k_itimer *timer)
|
|||
}
|
||||
#else /* CONFIG_POSIX_TIMERS */
|
||||
static inline void posixtimer_exec(void) { }
|
||||
static inline void posixtimer_exit(void) { }
|
||||
static inline void posixtimer_sigqueue_getref(struct sigqueue *q) { }
|
||||
static inline void posixtimer_sigqueue_putref(struct sigqueue *q) { }
|
||||
#endif /* !CONFIG_POSIX_TIMERS */
|
||||
|
|
|
|||
|
|
@ -94,7 +94,6 @@ static inline void exit_thread(struct task_struct *tsk)
|
|||
extern __noreturn void do_group_exit(int);
|
||||
|
||||
extern void exit_files(struct task_struct *);
|
||||
extern void exit_itimers(struct task_struct *);
|
||||
|
||||
extern pid_t kernel_clone(struct kernel_clone_args *kargs);
|
||||
struct task_struct *copy_process(struct pid *pid, int trace, int node,
|
||||
|
|
|
|||
|
|
@ -966,13 +966,12 @@ void __noreturn do_exit(long code)
|
|||
panic("Attempted to kill init! exitcode=0x%08x\n",
|
||||
tsk->signal->group_exit_code ?: (int)code);
|
||||
|
||||
#ifdef CONFIG_POSIX_TIMERS
|
||||
hrtimer_cancel(&tsk->signal->real_timer);
|
||||
exit_itimers(tsk);
|
||||
#endif
|
||||
posixtimer_exit();
|
||||
|
||||
if (tsk->mm)
|
||||
setmax_mm_hiwater_rss(&tsk->signal->maxrss, tsk->mm);
|
||||
}
|
||||
|
||||
acct_collect(code, group_dead);
|
||||
if (group_dead)
|
||||
tty_audit_exit();
|
||||
|
|
|
|||
|
|
@ -1077,13 +1077,9 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Invoked from do_exit() when the last thread of a thread group exits.
|
||||
* At that point no other task can access the timers of the dying
|
||||
* task anymore.
|
||||
*/
|
||||
void exit_itimers(struct task_struct *tsk)
|
||||
static void posixtimer_delete_timers(void)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
struct hlist_head timers;
|
||||
struct hlist_node *next;
|
||||
struct k_itimer *timer;
|
||||
|
|
@ -1120,12 +1116,18 @@ void exit_itimers(struct task_struct *tsk)
|
|||
}
|
||||
}
|
||||
|
||||
void posixtimer_exit(void)
|
||||
{
|
||||
hrtimer_cancel(¤t->signal->real_timer);
|
||||
posixtimer_delete_timers();
|
||||
}
|
||||
|
||||
void posixtimer_exec(void)
|
||||
{
|
||||
scoped_guard(spinlock_irq, ¤t->sighand->siglock)
|
||||
posix_cpu_timers_exit(current);
|
||||
|
||||
exit_itimers(current);
|
||||
posixtimer_delete_timers();
|
||||
flush_itimer_signals();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user