[patch V5 19/26] posix-timers: Move sequence logic into struct k_itimer

From: Thomas Gleixner
Date: Tue Oct 01 2024 - 04:46:05 EST


The posix timer signal handling uses siginfo::si_sys_private for handling
the sequence counter check. That indirection is not longer required and the
sequence count value at signal queueing time can be stored in struct
k_itimer itself.

This removes the requirement of treating siginfo::si_sys_private special as
it's now always zero as the kernel does not touch it anymore.

Suggested-by: Eric W. Biederman <ebiederm@xxxxxxxxxxxx>
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
---
V5: New patch
---
include/linux/posix-timers.h | 2 ++
kernel/signal.c | 8 +++-----
kernel/time/posix-timers.c | 5 +----
3 files changed, 6 insertions(+), 9 deletions(-)

--- a/include/linux/posix-timers.h
+++ b/include/linux/posix-timers.h
@@ -162,6 +162,7 @@ static inline void posix_cputimers_init_
* @it_overrun: The overrun counter for pending signals
* @it_overrun_last: The overrun at the time of the last delivered signal
* @it_signal_seq: Sequence count to control signal delivery
+ * @it_sigqueue_seq: The sequence count at the point where the signal was queued
* @it_sigev_notify: The notify word of sigevent struct for signal delivery
* @it_interval: The interval for periodic timers
* @it_signal: Pointer to the creators signal struct
@@ -184,6 +185,7 @@ struct k_itimer {
s64 it_overrun;
s64 it_overrun_last;
unsigned int it_signal_seq;
+ unsigned int it_sigqueue_seq;
int it_sigev_notify;
enum pid_type it_pid_type;
ktime_t it_interval;
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1968,12 +1968,10 @@ int posixtimer_send_sigqueue(struct k_it
return -1;

/*
- * Update @q::info::si_sys_private for posix timer signals with
- * sighand locked to prevent a race against dequeue_signal() which
- * decides based on si_sys_private whether to invoke
- * posixtimer_rearm() or not.
+ * Update @tmr::sigqueue_seq for posix timer signals with sighand
+ * locked to prevent a race against dequeue_signal().
*/
- q->info.si_sys_private = tmr->it_signal_seq;
+ tmr->it_sigqueue_seq = tmr->it_signal_seq;

/*
* Set the overrun count to zero unconditionally. The posix timer
--- a/kernel/time/posix-timers.c
+++ b/kernel/time/posix-timers.c
@@ -272,7 +272,7 @@ bool posixtimer_deliver_signal(struct ke
* since the signal was queued. In either case, don't rearm and
* drop the signal.
*/
- if (!timr->it_signal || timr->it_signal_seq != info->si_sys_private)
+ if (!timr->it_signal || timr->it_signal_seq != timr->it_sigqueue_seq)
goto out_unlock;

if (timr->it_interval && timr->it_status == POSIX_TIMER_REQUEUE_PENDING) {
@@ -293,9 +293,6 @@ bool posixtimer_deliver_signal(struct ke
posixtimer_putref(timr);

spin_lock(&current->sighand->siglock);
-
- /* Don't expose the si_sys_private value to userspace */
- info->si_sys_private = 0;
return ret;
}