Hello RT Folks! I'm pleased to announce the 4.19.152-rt66 stable release. You can get this release via the git tree at: git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git branch: v4.19-rt Head SHA1: 3b515711216822e708490d1c686813c819e237b1 Or to build 4.19.152-rt66 directly, the following patches should be applied: https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.19.tar.xz https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.19.152.xz https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/patch-4.19.152-rt66.patch.xz You can also build from 4.19.152-rt65 by applying the incremental patch: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/incr/patch-4.19.152-rt65-rt66.patch.xz Enjoy! Tom Changes from v4.19.152-rt65: --- Oleg Nesterov (1): ptrace: fix ptrace_unfreeze_traced() race with rt-lock Sebastian Andrzej Siewior (1): mm/memcontrol: Disable preemption in __mod_memcg_lruvec_state() Tom Zanussi (1): Linux 4.19.152-rt66 --- include/linux/memcontrol.h | 2 ++ kernel/ptrace.c | 23 +++++++++++++++-------- localversion-rt | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) --- diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index cc6b6532eb56..dbb2c4e27277 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -665,6 +665,7 @@ static inline void __mod_lruvec_state(struct lruvec *lruvec, pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); + preempt_disable_rt(); /* Update memcg */ __mod_memcg_state(pn->memcg, idx, val); @@ -675,6 +676,7 @@ static inline void __mod_lruvec_state(struct lruvec *lruvec, x = 0; } __this_cpu_write(pn->lruvec_stat_cpu->count[idx], x); + preempt_enable_rt(); } static inline void mod_lruvec_state(struct lruvec *lruvec, diff --git a/kernel/ptrace.c b/kernel/ptrace.c index a38b304fb9fd..cbefb0234be3 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -191,8 +191,8 @@ static bool ptrace_freeze_traced(struct task_struct *task) static void ptrace_unfreeze_traced(struct task_struct *task) { - if (task->state != __TASK_TRACED) - return; + unsigned long flags; + bool frozen = true; WARN_ON(!task->ptrace || task->parent != current); @@ -201,12 +201,19 @@ static void ptrace_unfreeze_traced(struct task_struct *task) * Recheck state under the lock to close this race. */ spin_lock_irq(&task->sighand->siglock); - if (task->state == __TASK_TRACED) { - if (__fatal_signal_pending(task)) - wake_up_state(task, __TASK_TRACED); - else - task->state = TASK_TRACED; - } + + raw_spin_lock_irqsave(&task->pi_lock, flags); + if (task->state == __TASK_TRACED) + task->state = TASK_TRACED; + else if (task->saved_state == __TASK_TRACED) + task->saved_state = TASK_TRACED; + else + frozen = false; + raw_spin_unlock_irqrestore(&task->pi_lock, flags); + + if (frozen && __fatal_signal_pending(task)) + wake_up_state(task, __TASK_TRACED); + spin_unlock_irq(&task->sighand->siglock); } diff --git a/localversion-rt b/localversion-rt index e2eb19782d4c..d42c0971b041 100644 --- a/localversion-rt +++ b/localversion-rt @@ -1 +1 @@ --rt65 +-rt66