if (!timr)
                goto out;
 
-       if (timr->it_interval && timr->it_signal_seq == info->si_sys_private) {
+       if (timr->it_signal_seq != info->si_sys_private)
+               goto out_unlock;
+
+       if (timr->it_interval && !WARN_ON_ONCE(timr->it_status != POSIX_TIMER_REQUEUE_PENDING)) {
                timr->kclock->timer_rearm(timr);
 
                timr->it_status = POSIX_TIMER_ARMED;
        }
        ret = true;
 
+out_unlock:
        unlock_timer(timr, flags);
 out:
        spin_lock(¤t->sighand->siglock);
 int posix_timer_queue_signal(struct k_itimer *timr)
 {
        enum posix_timer_state state = POSIX_TIMER_DISARMED;
-       int ret, si_private = 0;
        enum pid_type type;
+       int ret;
 
        lockdep_assert_held(&timr->it_lock);
 
-       if (timr->it_interval) {
+       if (timr->it_interval)
                state = POSIX_TIMER_REQUEUE_PENDING;
-               si_private = ++timr->it_signal_seq;
-       }
+
        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, si_private);
+       ret = send_sigqueue(timr->sigq, timr->it_pid, type, timr->it_signal_seq);
        /* If we failed to send the signal the timer stops. */
        return ret > 0;
 }
         * is a SIGEV_NONE timer move the expiry time forward by intervals,
         * so expiry is > now.
         */
-       if (iv && (timr->it_signal_seq & REQUEUE_PENDING || sig_none))
+       if (iv && timr->it_status != POSIX_TIMER_ARMED)
                timr->it_overrun += kc->timer_forward(timr, now);
 
        remaining = kc->timer_remaining(timr, now);
        else
                timer->it_interval = 0;
 
-       /* Prevent reloading in case there is a signal pending */
-       timer->it_signal_seq = (timer->it_signal_seq + 2) & ~REQUEUE_PENDING;
        /* Reset overrun accounting */
        timer->it_overrun_last = 0;
        timer->it_overrun = -1LL;
        if (old_setting)
                common_timer_get(timr, old_setting);
 
-       /* Prevent rearming by clearing the interval */
-       timr->it_interval = 0;
        /*
         * Careful here. On SMP systems the timer expiry function could be
         * active and spinning on timr->it_lock.
        if (old_spec64)
                old_spec64->it_interval = ktime_to_timespec64(timr->it_interval);
 
+       /* Prevent signal delivery and rearming. */
+       timr->it_signal_seq++;
+
        kc = timr->kclock;
        if (WARN_ON_ONCE(!kc || !kc->timer_set))
                error = -EINVAL;
 {
        const struct k_clock *kc = timer->kclock;
 
-       timer->it_interval = 0;
        if (kc->timer_try_to_cancel(timer) < 0)
                return TIMER_RETRY;
        timer->it_status = POSIX_TIMER_DISARMED;
 {
        const struct k_clock *kc = timer->kclock;
 
+       /* Prevent signal delivery and rearming. */
+       timer->it_signal_seq++;
+
        if (WARN_ON_ONCE(!kc || !kc->timer_del))
                return -EINVAL;
        return kc->timer_del(timer);