Le Tue, Oct 01, 2024 at 10:42:06AM +0200, Thomas Gleixner a écrit :
> From: Thomas Gleixner <tglx@linutronix.de>
>
> No point in delivering a signal from the past. POSIX does not specify the
> behaviour here:
>
> - "The effect of disarming or resetting a timer with pending expiration
> notifications is unspecified."
>
> - "The disposition of pending signals for the deleted timer is unspecified."
>
> In both cases it is reasonable to expect that pending signals are
> discarded. Especially in the reprogramming case it does not make sense to
> account for previous overruns or to deliver a signal for a timer which has
> been disarmed.
The change below indeed checks if the timer has been deleted but not if
it has been reprogrammed/disarmed/reset.
Or am I missing something?
Thanks.
>
> Drop the signal as that is conistent and understandable behaviour.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
> ---
> kernel/time/posix-timers.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
> ---
> diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c
> index d7ed7542f803..b5d7e71c10f2 100644
> --- a/kernel/time/posix-timers.c
> +++ b/kernel/time/posix-timers.c
> @@ -250,14 +250,14 @@ static void common_hrtimer_rearm(struct k_itimer *timr)
> }
>
> /*
> - * This function is called from the signal delivery code if
> - * info::si_sys_private is not zero, which indicates that the timer has to
> - * be rearmed. Restart the timer and update info::si_overrun.
> + * This function is called from the signal delivery code. It decides
> + * whether the signal should be dropped and rearms interval timers.
> */
> bool posixtimer_deliver_signal(struct kernel_siginfo *info)
> {
> struct k_itimer *timr;
> unsigned long flags;
> + bool ret = false;
>
> /*
> * Release siglock to ensure proper locking order versus
> @@ -279,6 +279,7 @@ bool posixtimer_deliver_signal(struct kernel_siginfo *info)
>
> info->si_overrun = timer_overrun_to_int(timr, info->si_overrun);
> }
> + ret = true;
>
> unlock_timer(timr, flags);
> out:
> @@ -286,7 +287,7 @@ bool posixtimer_deliver_signal(struct kernel_siginfo *info)
>
> /* Don't expose the si_sys_private value to userspace */
> info->si_sys_private = 0;
> - return true;
> + return ret;
> }
>
> int posix_timer_queue_signal(struct k_itimer *timr)
>