Re: [PATCH RT 0/1] Linux v4.19.312-rt134-rc2
Hi Sebastian, On Tue, May 07, 2024 at 11:54:07AM GMT, Sebastian Andrzej Siewior wrote: > I compared mine outcome vs v4.19-rt-next and the diff at the bottom came > out: > > - timer_delete_sync() used to have "#if 0" block around > lockdep_assert_preemption_enabled() because the function is not part > of v4.19. You ended up with might_sleep() which is a minor change. > Your queue as of a previous release had the if0 block (in > __del_timer_sync()). > I would say this is minor but looks like a miss-merge. Therefore I > would say it should go back for consistency vs previous release and > not change it due to conflicts. Makes sense. > - The timer_delete_sync() is structured differently with > __del_timer_sync(). That function invokes timer_sync_wait_running() > which drops two locks which are not acquired. That is wrong. It should > have been del_timer_wait_running(). Understood. I was a bit strungling here. Glad you caught this error. > I suggest you apply the diff below to align it with later versions. It > also gets rid of the basep argument in __try_to_del_timer_sync() which > is not really used. Will do. > As an alternative I can send you my rebased queue if this makes it > easier for you. Yes please, this makes it easy to sync the rebase branch. Thanks a lot! Cheers, Daniel
Re: [PATCH RT 0/1] Linux v4.19.312-rt134-rc2
On 2024-05-06 13:00:39 [+0200], Daniel Wagner wrote: > Hi Sebastian, Hi Daniel, > On 06.05.24 12:46, Daniel Wagner wrote: > > Dear RT Folks, > > > > This is the RT stable review cycle of patch 4.19.312-rt134-rc2. > > > > Please scream at me if I messed something up. Please test the patches > > too. > > My announce script is not attaching any conflict resolve diffs > (eventually, I'll fix this). Could have a look if I got the > kernel/time/timer.c upddate right? This was caused by stable > including the 030dcdd197d7 ("timers: Prepare support for > PREEMPT_RT") patch. I compared mine outcome vs v4.19-rt-next and the diff at the bottom came out: - timer_delete_sync() used to have "#if 0" block around lockdep_assert_preemption_enabled() because the function is not part of v4.19. You ended up with might_sleep() which is a minor change. Your queue as of a previous release had the if0 block (in __del_timer_sync()). I would say this is minor but looks like a miss-merge. Therefore I would say it should go back for consistency vs previous release and not change it due to conflicts. - The timer_delete_sync() is structured differently with __del_timer_sync(). That function invokes timer_sync_wait_running() which drops two locks which are not acquired. That is wrong. It should have been del_timer_wait_running(). I suggest you apply the diff below to align it with later versions. It also gets rid of the basep argument in __try_to_del_timer_sync() which is not really used. As an alternative I can send you my rebased queue if this makes it easier for you. Sebastian -->8- diff --git a/kernel/time/timer.c b/kernel/time/timer.c --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1250,25 +1250,6 @@ int del_timer(struct timer_list *timer) } EXPORT_SYMBOL(del_timer); -static int __try_to_del_timer_sync(struct timer_list *timer, - struct timer_base **basep) -{ - struct timer_base *base; - unsigned long flags; - int ret = -1; - - debug_assert_init(timer); - - *basep = base = lock_timer_base(timer, ); - - if (base->running_timer != timer) - ret = detach_if_pending(timer, base, true); - - raw_spin_unlock_irqrestore(>lock, flags); - - return ret; -} - /** * try_to_del_timer_sync - Try to deactivate a timer * @timer: Timer to deactivate @@ -1288,8 +1269,19 @@ static int __try_to_del_timer_sync(struct timer_list *timer, int try_to_del_timer_sync(struct timer_list *timer) { struct timer_base *base; + unsigned long flags; + int ret = -1; - return __try_to_del_timer_sync(timer, ); + debug_assert_init(timer); + + base = lock_timer_base(timer, ); + + if (base->running_timer != timer) + ret = detach_if_pending(timer, base, true); + + raw_spin_unlock_irqrestore(>lock, flags); + + return ret; } EXPORT_SYMBOL(try_to_del_timer_sync); @@ -1366,36 +1358,6 @@ static inline void timer_sync_wait_running(struct timer_base *base) { } static inline void del_timer_wait_running(struct timer_list *timer) { } #endif -static int __del_timer_sync(struct timer_list *timer) -{ - struct timer_base *base; - int ret; - - /* -* Must be able to sleep on PREEMPT_RT because of the slowpath in -* del_timer_wait_running(). -*/ -#if 0 - if (IS_ENABLED(CONFIG_PREEMPT_RT) && !(timer->flags & TIMER_IRQSAFE)) - lockdep_assert_preemption_enabled(); -#endif - - for (;;) { - ret = __try_to_del_timer_sync(timer, ); - if (ret >= 0) - return ret; - - if (READ_ONCE(timer->flags) & TIMER_IRQSAFE) - continue; - - /* -* When accessing the lock, timers of base are no longer expired -* and so timer is no longer running. -*/ - timer_sync_wait_running(base); - } -} - /** * timer_delete_sync - Deactivate a timer and wait for the handler to finish. * @timer: The timer to be deactivated @@ -1437,6 +1399,8 @@ static int __del_timer_sync(struct timer_list *timer) */ int timer_delete_sync(struct timer_list *timer) { + int ret; + #ifdef CONFIG_LOCKDEP unsigned long flags; @@ -1454,14 +1418,26 @@ int timer_delete_sync(struct timer_list *timer) * could lead to deadlock. */ WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE)); + /* * Must be able to sleep on PREEMPT_RT because of the slowpath in -* __del_timer_sync(). +* del_timer_wait_running(). */ +#if 0 if (IS_ENABLED(CONFIG_PREEMPT_RT) && !(timer->flags & TIMER_IRQSAFE)) - might_sleep(); + lockdep_assert_preemption_enabled(); +#endif - return __del_timer_sync(timer); + do { + ret =
Re: [PATCH RT 0/1] Linux v4.19.312-rt134-rc2
Hi Sebastian, On 06.05.24 12:46, Daniel Wagner wrote: Dear RT Folks, This is the RT stable review cycle of patch 4.19.312-rt134-rc2. Please scream at me if I messed something up. Please test the patches too. My announce script is not attaching any conflict resolve diffs (eventually, I'll fix this). Could have a look if I got the kernel/time/timer.c upddate right? This was caused by stable including the 030dcdd197d7 ("timers: Prepare support for PREEMPT_RT") patch. commit 2c1a32c5e05fd75885186793bc0d26e0a65b473d Merge: 4790d0210f19 3d86e7f5bdf3 Author: Daniel Wagner Date: Wed Apr 17 16:31:21 2024 +0200 Merge tag 'v4.19.312' into v4.19-rt-next This is the 4.19.312 stable release Conflicts: include/linux/timer.h kernel/time/timer.c diff --git a/include/linux/timer.h b/include/linux/timer.h remerge CONFLICT (content): Merge conflict in include/linux/timer.h index b70c5168a346..aef40cac2add 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h @@ -173,13 +173,6 @@ extern void add_timer(struct timer_list *timer); extern int try_to_del_timer_sync(struct timer_list *timer); extern int timer_delete_sync(struct timer_list *timer); -<<< 4790d0210f19 (Linux 4.19.307-rt133) -#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) - extern int del_timer_sync(struct timer_list *timer); -#else -# define del_timer_sync(t) del_timer(t) -#endif -=== /** * del_timer_sync - Delete a pending timer and wait for a running callback * @timer: The timer to be deleted @@ -192,7 +185,6 @@ static inline int del_timer_sync(struct timer_list *timer) { return timer_delete_sync(timer); } ->>> 3d86e7f5bdf3 (Linux 4.19.312) #define del_singleshot_timer_sync(t) del_timer_sync(t) diff --git a/kernel/time/timer.c b/kernel/time/timer.c remerge CONFLICT (content): Merge conflict in kernel/time/timer.c index 911191916df1..bc5ce0cf9488 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1250,6 +1250,25 @@ int del_timer(struct timer_list *timer) } EXPORT_SYMBOL(del_timer); +static int __try_to_del_timer_sync(struct timer_list *timer, + struct timer_base **basep) +{ + struct timer_base *base; + unsigned long flags; + int ret = -1; + + debug_assert_init(timer); + + *basep = base = lock_timer_base(timer, ); + + if (base->running_timer != timer) + ret = detach_if_pending(timer, base, true); + + raw_spin_unlock_irqrestore(>lock, flags); + + return ret; +} + /** * try_to_del_timer_sync - Try to deactivate a timer * @timer: Timer to deactivate @@ -1269,19 +1288,8 @@ EXPORT_SYMBOL(del_timer); int try_to_del_timer_sync(struct timer_list *timer) { struct timer_base *base; - unsigned long flags; - int ret = -1; - - debug_assert_init(timer); - - base = lock_timer_base(timer, ); - - if (base->running_timer != timer) - ret = detach_if_pending(timer, base, true); - - raw_spin_unlock_irqrestore(>lock, flags); - return ret; + return __try_to_del_timer_sync(timer, ); } EXPORT_SYMBOL(try_to_del_timer_sync); @@ -1303,7 +1311,6 @@ static inline void timer_base_unlock_expiry(struct timer_base *base) /* * The counterpart to del_timer_wait_running(). -<<< 4790d0210f19 (Linux 4.19.307-rt133) * * If there is a waiter for base->expiry_lock, then it was waiting for the * timer callback to finish. Drop expiry_lock and reaquire it. That allows @@ -1359,64 +1366,35 @@ static inline void timer_sync_wait_running(struct timer_base *base) { } static inline void del_timer_wait_running(struct timer_list *timer) { } #endif -#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT_FULL) -/** - * del_timer_sync - deactivate a timer and wait for the handler to finish. - * @timer: the timer to be deactivated -=== ->>> 3d86e7f5bdf3 (Linux 4.19.312) - * - * If there is a waiter for base->expiry_lock, then it was waiting for the - * timer callback to finish. Drop expiry_lock and reaquire it. That allows - * the waiter to acquire the lock and make progress. - */ -static void timer_sync_wait_running(struct timer_base *base) +static int __del_timer_sync(struct timer_list *timer) { - if (atomic_read(>timer_waiters)) { - spin_unlock(>expiry_lock); - spin_lock(>expiry_lock); - } -} + struct timer_base *base; + int ret; -/* - * This function is called on PREEMPT_RT kernels when the fast path - * deletion of a timer failed because the timer callback function was - * running. - * - * This prevents priority inversion, if the softirq thread on a remote CPU - * got preempted, and it prevents a life lock when the task which tries to - * delete a timer preempted the softirq thread running the timer callback - * function. - */ -static void del_timer_wait_running(struct timer_list *timer) -{ - u32 tf; + /* +
[PATCH RT 0/1] Linux v4.19.312-rt134-rc2
Dear RT Folks, This is the RT stable review cycle of patch 4.19.312-rt134-rc2. Please scream at me if I messed something up. Please test the patches too. The -rc release is also available on kernel.org https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git on the v4.19-rt-next branch. If all goes well, this patch will be converted to the next main release on 2024-05-13. Signing key fingerprint: 5BF6 7BC5 0826 72CA BB45 ACAE 587C 5ECA 5D0A 306C All keys used for the above files and repositories can be found on the following git repository: git://git.kernel.org/pub/scm/docs/kernel/pgpkeys.git Enjoy! Daniel Changes from v4.19.307-rt133: Daniel Wagner (1): Linux 4.19.312-rt134 localversion-rt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- 2.44.0