Commit 4cf7bf2a authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

posix-cpu-timers: Use dedicated flag for CPU timer nanosleep



POSIX CPU timer nanosleep creates a k_itimer on stack and uses the sigq
pointer to detect the nanosleep case in the expiry function.

Prepare for embedding sigqueue into struct k_itimer by using a dedicated
flag for nanosleep.

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.238550394@linutronix.de
parent bf635681
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ static inline int clockid_to_fd(const clockid_t clk)
 * @pid:	Pointer to target task PID
 * @elist:	List head for the expiry list
 * @firing:	Timer is currently firing
 * @nanosleep:	Timer is used for nanosleep and is not a regular posix-timer
 * @handling:	Pointer to the task which handles expiry
 */
struct cpu_timer {
@@ -50,6 +51,7 @@ struct cpu_timer {
	struct pid			*pid;
	struct list_head		elist;
	bool				firing;
	bool				nanosleep;
	struct task_struct __rcu	*handling;
};

+2 −1
Original line number Diff line number Diff line
@@ -596,7 +596,7 @@ static void cpu_timer_fire(struct k_itimer *timer)

	timer->it_status = POSIX_TIMER_DISARMED;

	if (unlikely(timer->sigq == NULL)) {
	if (unlikely(ctmr->nanosleep)) {
		/*
		 * This a special case for clock_nanosleep,
		 * not a normal timer from sys_timer_create.
@@ -1493,6 +1493,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock, int flags,
	timer.it_overrun = -1;
	error = posix_cpu_timer_create(&timer);
	timer.it_process = current;
	timer.it.cpu.nanosleep = true;

	if (!error) {
		static struct itimerspec64 zero_it;