From: Qiliang Yuan <realwujing@gmail.com>
To: Ingo Molnar <mingo@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Juri Lelli <juri.lelli@redhat.com>,
Vincent Guittot <vincent.guittot@linaro.org>,
Dietmar Eggemann <dietmar.eggemann@arm.com>,
Steven Rostedt <rostedt@goodmis.org>,
Ben Segall <bsegall@google.com>, Mel Gorman <mgorman@suse.de>,
Valentin Schneider <vschneid@redhat.com>,
Thomas Gleixner <tglx@kernel.org>,
"Paul E. McKenney" <paulmck@kernel.org>,
Frederic Weisbecker <frederic@kernel.org>,
Neeraj Upadhyay <neeraj.upadhyay@kernel.org>,
Joel Fernandes <joelagnelf@nvidia.com>,
Josh Triplett <josh@joshtriplett.org>,
Boqun Feng <boqun.feng@gmail.com>,
Uladzislau Rezki <urezki@gmail.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Lai Jiangshan <jiangshanlai@gmail.com>,
Zqiang <qiang.zhang@linux.dev>, Tejun Heo <tj@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Vlastimil Babka <vbabka@suse.cz>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
Brendan Jackman <jackmanb@google.com>,
Johannes Weiner <hannes@cmpxchg.org>, Zi Yan <ziy@nvidia.com>,
Anna-Maria Behnsen <anna-maria@linutronix.de>,
Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, rcu@vger.kernel.org,
linux-mm@kvack.org, Qiliang Yuan <realwujing@gmail.com>,
Qiliang Yuan <yuanql9@chinatelecom.cn>
Subject: [PATCH RFC 09/12] sched/isolation: Separate housekeeping types and add sysfs interface
Date: Fri, 06 Feb 2026 02:04:30 -0500 [thread overview]
Message-ID: <20260206-feature-dynamic_isolcpus_dhei-v1-9-00a711eb0c74@gmail.com> (raw)
In-Reply-To: <20260206-feature-dynamic_isolcpus_dhei-v1-0-00a711eb0c74@gmail.com>
Currently, most housekeeping types (timer, rcu, misc, etc.) share the
same mask (HK_TYPE_KERNEL_NOISE), preventing fine-grained control over
CPU isolation. Additionally, there is no way to update these masks at
runtime.
Separate the housekeeping types into individual enum entries and expand
the cpumasks array to accommodate them. Introduce a sysfs interface at
/sys/kernel/housekeeping/ that allows users to view and update the
housekeeping masks for each type at runtime. When a mask is updated via
sysfs, a notifier is triggered to re-affine the relevant kernel
subsystems and services.
Signed-off-by: Qiliang Yuan <realwujing@gmail.com>
Signed-off-by: Qiliang Yuan <yuanql9@chinatelecom.cn>
---
include/linux/sched/isolation.h | 20 +++---
kernel/sched/isolation.c | 134 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 140 insertions(+), 14 deletions(-)
diff --git a/include/linux/sched/isolation.h b/include/linux/sched/isolation.h
index 5c07e3e9b8d1..e8fe1cfa5022 100644
--- a/include/linux/sched/isolation.h
+++ b/include/linux/sched/isolation.h
@@ -10,21 +10,17 @@
enum hk_type {
HK_TYPE_DOMAIN,
HK_TYPE_MANAGED_IRQ,
- HK_TYPE_KERNEL_NOISE,
+ HK_TYPE_TICK,
+ HK_TYPE_TIMER,
+ HK_TYPE_RCU,
+ HK_TYPE_MISC,
+ HK_TYPE_WQ,
+ HK_TYPE_KTHREAD,
HK_TYPE_MAX,
-
- /*
- * The following housekeeping types are only set by the nohz_full
- * boot commandline option. So they can share the same value.
- */
- HK_TYPE_TICK = HK_TYPE_KERNEL_NOISE,
- HK_TYPE_TIMER = HK_TYPE_KERNEL_NOISE,
- HK_TYPE_RCU = HK_TYPE_KERNEL_NOISE,
- HK_TYPE_MISC = HK_TYPE_KERNEL_NOISE,
- HK_TYPE_WQ = HK_TYPE_KERNEL_NOISE,
- HK_TYPE_KTHREAD = HK_TYPE_KERNEL_NOISE
};
+#define HK_TYPE_KERNEL_NOISE HK_TYPE_TICK
+
struct housekeeping_update {
enum hk_type type;
const struct cpumask *new_mask;
diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c
index 97cc41626a33..d9ce26cf31fe 100644
--- a/kernel/sched/isolation.c
+++ b/kernel/sched/isolation.c
@@ -9,14 +9,26 @@
*/
#include <linux/sched/isolation.h>
#include <linux/mutex.h>
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+#include <linux/slab.h>
+#include <linux/ctype.h>
#include "sched.h"
enum hk_flags {
HK_FLAG_DOMAIN = BIT(HK_TYPE_DOMAIN),
HK_FLAG_MANAGED_IRQ = BIT(HK_TYPE_MANAGED_IRQ),
- HK_FLAG_KERNEL_NOISE = BIT(HK_TYPE_KERNEL_NOISE),
+ HK_FLAG_TICK = BIT(HK_TYPE_TICK),
+ HK_FLAG_TIMER = BIT(HK_TYPE_TIMER),
+ HK_FLAG_RCU = BIT(HK_TYPE_RCU),
+ HK_FLAG_MISC = BIT(HK_TYPE_MISC),
+ HK_FLAG_WQ = BIT(HK_TYPE_WQ),
+ HK_FLAG_KTHREAD = BIT(HK_TYPE_KTHREAD),
};
+#define HK_FLAG_KERNEL_NOISE (HK_FLAG_TICK | HK_FLAG_TIMER | HK_FLAG_RCU | \
+ HK_FLAG_MISC | HK_FLAG_WQ | HK_FLAG_KTHREAD)
+
static DEFINE_MUTEX(housekeeping_mutex);
static BLOCKING_NOTIFIER_HEAD(housekeeping_notifier_list);
DEFINE_STATIC_KEY_FALSE(housekeeping_overridden);
@@ -99,7 +111,7 @@ int housekeeping_unregister_notifier(struct notifier_block *nb)
}
EXPORT_SYMBOL_GPL(housekeeping_unregister_notifier);
-static int __maybe_unused housekeeping_update_notify(enum hk_type type, const struct cpumask *new_mask)
+static int housekeeping_update_notify(enum hk_type type, const struct cpumask *new_mask)
{
struct housekeeping_update update = {
.type = type,
@@ -109,6 +121,124 @@ static int __maybe_unused housekeeping_update_notify(enum hk_type type, const st
return blocking_notifier_call_chain(&housekeeping_notifier_list, HK_UPDATE_MASK, &update);
}
+static const char * const hk_type_names[] = {
+ [HK_TYPE_TIMER] = "timer",
+ [HK_TYPE_RCU] = "rcu",
+ [HK_TYPE_MISC] = "misc",
+ [HK_TYPE_TICK] = "tick",
+ [HK_TYPE_DOMAIN] = "domain",
+ [HK_TYPE_WQ] = "workqueue",
+ [HK_TYPE_MANAGED_IRQ] = "managed_irq",
+ [HK_TYPE_KTHREAD] = "kthread",
+};
+
+struct hk_attribute {
+ struct kobj_attribute kattr;
+ enum hk_type type;
+};
+
+#define to_hk_attr(_kattr) container_of(_kattr, struct hk_attribute, kattr)
+
+static ssize_t housekeeping_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ struct hk_attribute *hk_attr = to_hk_attr(attr);
+ const struct cpumask *mask = housekeeping_cpumask(hk_attr->type);
+
+ return cpumap_print_to_pagebuf(false, buf, mask);
+}
+
+static ssize_t housekeeping_store(struct kobject *kobject,
+ struct kobj_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct hk_attribute *hk_attr = to_hk_attr(attr);
+ enum hk_type type = hk_attr->type;
+ cpumask_var_t new_mask;
+ int err;
+
+ if (!alloc_cpumask_var(&new_mask, GFP_KERNEL))
+ return -ENOMEM;
+
+ err = cpulist_parse(buf, new_mask);
+ if (err)
+ goto out_free;
+
+ if (cpumask_empty(new_mask)) {
+ err = -EINVAL;
+ goto out_free;
+ }
+
+ mutex_lock(&housekeeping_mutex);
+
+ if (!housekeeping.cpumasks[type]) {
+ if (!alloc_cpumask_var(&housekeeping.cpumasks[type], GFP_KERNEL)) {
+ err = -ENOMEM;
+ goto out_unlock;
+ }
+ }
+
+ if (cpumask_equal(housekeeping.cpumasks[type], new_mask)) {
+ err = 0;
+ goto out_unlock;
+ }
+
+ cpumask_copy(housekeeping.cpumasks[type], new_mask);
+ housekeeping.flags |= BIT(type);
+ static_branch_enable(&housekeeping_overridden);
+
+ housekeeping_update_notify(type, new_mask);
+
+ err = count;
+
+out_unlock:
+ mutex_unlock(&housekeeping_mutex);
+out_free:
+ free_cpumask_var(new_mask);
+ return err < 0 ? err : count;
+}
+
+static struct hk_attribute housekeeping_attrs[HK_TYPE_MAX];
+static struct attribute *housekeeping_attr_ptr[HK_TYPE_MAX + 1];
+
+static const struct attribute_group housekeeping_attr_group = {
+ .attrs = housekeeping_attr_ptr,
+};
+
+static int __init housekeeping_sysfs_init(void)
+{
+ struct kobject *housekeeping_kobj;
+ int i, j = 0;
+ int ret;
+
+ housekeeping_kobj = kobject_create_and_add("housekeeping", kernel_kobj);
+ if (!housekeeping_kobj)
+ return -ENOMEM;
+
+ for (i = 0; i < HK_TYPE_MAX; i++) {
+ if (!hk_type_names[i])
+ continue;
+
+ housekeeping_attrs[i].type = i;
+ sysfs_attr_init(&housekeeping_attrs[i].kattr.attr);
+ housekeeping_attrs[i].kattr.attr.name = hk_type_names[i];
+ housekeeping_attrs[i].kattr.attr.mode = 0644;
+ housekeeping_attrs[i].kattr.show = housekeeping_show;
+ housekeeping_attrs[i].kattr.store = housekeeping_store;
+ housekeeping_attr_ptr[j++] = &housekeeping_attrs[i].kattr.attr;
+ }
+ housekeeping_attr_ptr[j] = NULL;
+
+ ret = sysfs_create_group(housekeeping_kobj, &housekeeping_attr_group);
+ if (ret) {
+ kobject_put(housekeeping_kobj);
+ return ret;
+ }
+
+ return 0;
+}
+late_initcall(housekeeping_sysfs_init);
+
void housekeeping_init(void)
{
enum hk_type type;
--
2.51.0
next prev parent reply other threads:[~2026-02-06 7:06 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-06 7:04 [PATCH RFC 00/12] Implementation of Dynamic Housekeeping & Enhanced Isolation (DHEI) Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 01/12] sched/isolation: Remove __init restriction from housekeeping cores Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 02/12] sched/isolation: Introduce reconfiguration notifier chain Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 03/12] genirq: Implement dynamic migration for Managed IRQs Qiliang Yuan
2026-02-06 12:24 ` Thomas Gleixner
2026-02-06 7:04 ` [PATCH RFC 04/12] rcu: Sync RCU housekeeping mask on notification Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 05/12] sched/core: Dynamic update housekeeping_cpumask(HK_TYPE_DOMAIN) Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 06/12] watchdog: Allow runtime toggle of hardlockup detector on CPUs Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 07/12] workqueue: Dynamic housekeeping mask update support Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 08/12] kcompactd: Add housekeeping notifier for dynamic mask update Qiliang Yuan
2026-02-06 15:09 ` Zi Yan
2026-02-06 7:04 ` Qiliang Yuan [this message]
2026-02-06 7:04 ` [PATCH RFC 10/12] tick/nohz: Implement dynamic nohz_full state update Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 11/12] sched/isolation: Implement SMT sibling auto-isolation and safety check Qiliang Yuan
2026-02-06 7:04 ` [PATCH RFC 12/12] sched/isolation: Bridge isolcpus and support runtime tick offload init Qiliang Yuan
2026-02-20 19:07 ` [PATCH RFC 00/12] Implementation of Dynamic Housekeeping & Enhanced Isolation (DHEI) Joel Fernandes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260206-feature-dynamic_isolcpus_dhei-v1-9-00a711eb0c74@gmail.com \
--to=realwujing@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=anna-maria@linutronix.de \
--cc=boqun.feng@gmail.com \
--cc=bsegall@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=frederic@kernel.org \
--cc=hannes@cmpxchg.org \
--cc=jackmanb@google.com \
--cc=jiangshanlai@gmail.com \
--cc=joelagnelf@nvidia.com \
--cc=josh@joshtriplett.org \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mgorman@suse.de \
--cc=mhocko@suse.com \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=neeraj.upadhyay@kernel.org \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=qiang.zhang@linux.dev \
--cc=rcu@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=surenb@google.com \
--cc=tglx@kernel.org \
--cc=tj@kernel.org \
--cc=urezki@gmail.com \
--cc=vbabka@suse.cz \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
--cc=yuanql9@chinatelecom.cn \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox