Commit ef1c5bcd authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

posix-timers: Store PID type in the timer



instead of re-evaluating the signal delivery mode everywhere.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/all/20241105064213.519086500@linutronix.de
parent 54f1dd64
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#include <linux/alarmtimer.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/pid.h>
#include <linux/posix-timers_types.h>
#include <linux/rcuref.h>
#include <linux/spinlock.h>
@@ -180,6 +181,7 @@ struct k_itimer {
	s64			it_overrun_last;
	unsigned int		it_signal_seq;
	int			it_sigev_notify;
	enum pid_type		it_pid_type;
	ktime_t			it_interval;
	struct signal_struct	*it_signal;
	union {
+6 −3
Original line number Diff line number Diff line
@@ -298,7 +298,6 @@ bool posixtimer_deliver_signal(struct kernel_siginfo *info)
int posix_timer_queue_signal(struct k_itimer *timr)
{
	enum posix_timer_state state = POSIX_TIMER_DISARMED;
	enum pid_type type;
	int ret;

	lockdep_assert_held(&timr->it_lock);
@@ -308,8 +307,7 @@ int posix_timer_queue_signal(struct k_itimer *timr)

	timr->it_status = state;

	type = !(timr->it_sigev_notify & SIGEV_THREAD_ID) ? PIDTYPE_TGID : PIDTYPE_PID;
	ret = send_sigqueue(timr->sigq, timr->it_pid, type, timr->it_signal_seq);
	ret = send_sigqueue(timr->sigq, timr->it_pid, timr->it_pid_type, timr->it_signal_seq);
	/* If we failed to send the signal the timer stops. */
	return ret > 0;
}
@@ -496,6 +494,11 @@ static int do_timer_create(clockid_t which_clock, struct sigevent *event,
		new_timer->it_pid = get_pid(task_tgid(current));
	}

	if (new_timer->it_sigev_notify & SIGEV_THREAD_ID)
		new_timer->it_pid_type = PIDTYPE_PID;
	else
		new_timer->it_pid_type = PIDTYPE_TGID;

	new_timer->sigq->info.si_tid   = new_timer->it_id;
	new_timer->sigq->info.si_code  = SI_TIMER;