Skip to content
Snippets Groups Projects
Commit 9814b57f authored by Gabriele Monaco's avatar Gabriele Monaco Committed by Frieder Schrempf
Browse files

rv: Reset per-task monitors also for idle tasks

commit 8259cb14a70680553d5e82d65d1302fe589e9b39 upstream.

RV per-task monitors are implemented through a monitor structure
available for each task_struct. This structure is reset every time the
monitor is (re-)started, to avoid inconsistencies if the monitor was
activated previously.
To do so, we reset the monitor on all threads using the macro
for_each_process_thread. However, this macro excludes the idle tasks on
each CPU. Idle tasks could be considered tasks on their own right and it
should be up to the model whether to ignore them or not.

Reset monitors also on the idle tasks for each present CPU whenever we
reset all per-task monitors.

Cc: stable@vger.kernel.org
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: John Kacur <jkacur@redhat.com>
Link: https://lore.kernel.org/20250115151547.605750-2-gmonaco@redhat.com


Fixes: 79257534 ("rv/include: Add deterministic automata monitor definition via C macros")
Signed-off-by: default avatarGabriele Monaco <gmonaco@redhat.com>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 57af4c55
No related branches found
No related tags found
1 merge request!191🤖 Sync Bot: Update v6.1-ktn to Latest Stable Kernel (v6.1.129)
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <rv/automata.h> #include <rv/automata.h>
#include <linux/rv.h> #include <linux/rv.h>
#include <linux/bug.h> #include <linux/bug.h>
#include <linux/sched.h>
#ifdef CONFIG_RV_REACTORS #ifdef CONFIG_RV_REACTORS
...@@ -324,10 +325,13 @@ static inline struct da_monitor *da_get_monitor_##name(struct task_struct *tsk) ...@@ -324,10 +325,13 @@ static inline struct da_monitor *da_get_monitor_##name(struct task_struct *tsk)
static void da_monitor_reset_all_##name(void) \ static void da_monitor_reset_all_##name(void) \
{ \ { \
struct task_struct *g, *p; \ struct task_struct *g, *p; \
int cpu; \
\ \
read_lock(&tasklist_lock); \ read_lock(&tasklist_lock); \
for_each_process_thread(g, p) \ for_each_process_thread(g, p) \
da_monitor_reset_##name(da_get_monitor_##name(p)); \ da_monitor_reset_##name(da_get_monitor_##name(p)); \
for_each_present_cpu(cpu) \
da_monitor_reset_##name(da_get_monitor_##name(idle_task(cpu))); \
read_unlock(&tasklist_lock); \ read_unlock(&tasklist_lock); \
} \ } \
\ \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment