[PATCH 17/17] sysfs: disable arch handling if paravirt file being written

From: Shrikanth Hegde

Date: Wed Nov 19 2025 - 07:46:37 EST


Arch specific code can update the mask based on the steal time. For
debugging it is desired to overwrite the arch logic. Do that with this
debug patch.

Signed-off-by: Shrikanth Hegde <sshegde@xxxxxxxxxxxxx>
---
This isn't meant to be merged. It is debug patch helping the previous
one for easier debugging.

arch/powerpc/platforms/pseries/lpar.c | 3 +++
drivers/base/cpu.c | 2 ++
include/linux/sched.h | 4 ++++
kernel/sched/core.c | 1 +
4 files changed, 10 insertions(+)

diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
index 090e5c48243b..04bc75e22e7b 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -681,6 +681,9 @@ static void process_steal(int cpu)
unsigned long steal = 0;
unsigned int i;

+ if (static_branch_unlikely(&disable_arch_paravirt_handling))
+ return;
+
if (!should_cpu_process_steal(cpu))
return;

diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
index 766584c85051..06a11a69b7c0 100644
--- a/drivers/base/cpu.c
+++ b/drivers/base/cpu.c
@@ -403,7 +403,9 @@ static ssize_t paravirt_store(struct device *dev,
/* No more paravirt cpus */
if (cpumask_empty(temp_mask)) {
cpumask_copy((struct cpumask *)&__cpu_paravirt_mask, temp_mask);
+ static_branch_disable(&disable_arch_paravirt_handling);
} else {
+ static_branch_enable(&disable_arch_paravirt_handling);
cpumask_copy((struct cpumask *)&__cpu_paravirt_mask, temp_mask);

/* Enable tick on nohz_full cpu */
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 3628edd1468b..1afa5dd5b0ae 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2427,4 +2427,8 @@ extern void migrate_enable(void);

DEFINE_LOCK_GUARD_0(migrate, migrate_disable(), migrate_enable())

+#ifdef CONFIG_PARAVIRT
+DECLARE_STATIC_KEY_FALSE(disable_arch_paravirt_handling);
+#endif
+
#endif
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 65c247c24191..b65a9898c694 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -10873,6 +10873,7 @@ void sched_change_end(struct sched_change_ctx *ctx)
#ifdef CONFIG_PARAVIRT
struct cpumask __cpu_paravirt_mask __read_mostly;
EXPORT_SYMBOL(__cpu_paravirt_mask);
+DEFINE_STATIC_KEY_FALSE(disable_arch_paravirt_handling);

static DEFINE_PER_CPU(struct cpu_stop_work, pv_push_task_work);

--
2.47.3