From nobody Thu Apr 2 03:25:19 2026 Received: from mail-dy1-f172.google.com (mail-dy1-f172.google.com [74.125.82.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 63E92345CD3 for ; Wed, 25 Mar 2026 09:11:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429885; cv=none; b=m+OLlsx8i2VnMAAfZPjc2CdfUKSgXzDXO3oCYjicV8v8YDNRL7iiB7RKNtOrIzs0v/zR6A6XORlkzZ8jfbulrcg4g2IRddRWKMZa6rVN8qF8GKrx4krp13w/u+pji0BRWsHCRng+DhZRX+wPDGeGCJgyvPsNsJClmW/fO5BBQWQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774429885; c=relaxed/simple; bh=f7O9UMgeqrl0r9w3zlKNvRPg+oNFv2EqHzEVcBEVPEc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OTSPzS9ZpCJbC+BMaJModrflKMxwMAo7FMdd6bshThZSslbDJJdGvFaPuo6SkT2iXhbSq5QWgLEKqwl10y41LLS0mC6RSws5a4LFuPgJaZAmGL8BVMwnFrbvxEChs4wiQIayEZvwu6xplNZsn9o7uhvRZ9cD/oYje1fLrUnCYvc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=f7SAw6kz; arc=none smtp.client-ip=74.125.82.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="f7SAw6kz" Received: by mail-dy1-f172.google.com with SMTP id 5a478bee46e88-2c1092cc08cso2897800eec.1 for ; Wed, 25 Mar 2026 02:11:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774429884; x=1775034684; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=scmgWcS5GsqDyCs8R5zf+G8RGx6zlEEWGauepG1UF1o=; b=f7SAw6kz5cKyzfzptXjE6xketXSyTYWYPeHAkXxFM/H6W/aWSVDEweYdp9SHeJtZ7i Lyg/FuDdUlNKsCu7Os3L7XFdvVzcNPrnpGYirQUEF5dV85/WEwIJgcWRRVzAo9JNutVe MoyzAQQCNChd0Vaor3W5j76lWlMVijZZ2Vv0CZtxZUd6AtLgUNnIjYfMKawJvpdIkYmo sm6OgStWtKRHBXkuz4hQWH4oC4YkX494+sm8VUat8GEPZBrfe/F0r3UA2EgvFSpBXXj5 K01+3d0obkZKW+Jw/V/zALpIhGGm2YkrY/d1UbsoGx6bIzpKO+ga/sP0ZS5v5VlrveYL yuGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774429884; x=1775034684; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=scmgWcS5GsqDyCs8R5zf+G8RGx6zlEEWGauepG1UF1o=; b=JmmSfOXqyn1K0hFwz56mA3vgZp3rACEaMd1BGnZdsre8eB97Xo9Dt46dGipnq+HLM1 hjnn1tZ2jaPfN4+eK3ykruJocl3HEfk+NPEYk9cbtpwlwWA1KEeJuslGYFSM9Pe9yZvo LOlGstImWF80xT3l5oz42kXcOtkX3IhoNDW9njW+uc+3vysJKK0plheJAoA1DVeXgwQM zKiS0ctbZebRoioqI8Ruglx+NL5NlUFx5PjpK5hZ56lsGNoY3+Zd0dBaOmyN6MoDPVxt tw4R6co7ki8VxOVlqvltgCw4c0YrgCQ3r4bTlzbNftkRsudalCvxPUDXwMGNTXgNZSzb Dk4Q== X-Gm-Message-State: AOJu0Yx+wV/9HtgiHAXlDVLroQK/kiOaFEpVwmk96C3sqSQg5xHIy0/R FeIHSBH2heZ4MuwzfEpJ2wW+hH3LEh097HozB7IQRCzxaSfRLDSaXxQY X-Gm-Gg: ATEYQzwTp0uHkapIyWY9Bg8V88pxyTHdSmyTiJ/7CS13Y6435NXpDFOZ1Vi1TUgZmSC at3/f2XA0F7jWsp4aUJgi91Qhul3FnRJfpf5oIUf3RNRwDeXWm8ZprW1HgphVSFjBiZe0hNm/Of 6uaGDAdSu9sE69xuVmpf/5/CBETbRJCpxtf9WmweFDLy9pgXeHSnrt/Tpwgv7lDl4qNjX7iiiEK fLJQwl+OA7pIpe0D3RUcoohSkDEPRdcRH6oU/bnS8hhVq7OuJyxbjsJ0PfY4ZErKyumV8zMoP5f zJbqBCAcE9oXqqjBW9UAOH+xo880Fly7jHhYhxYAxxt6X+b9v2cAt+9IXUMUMwlYhFhH0p0Ythg X0svgflofvDvArKH7WeJye9xJaagOA0oMDGw9d/TJQ25IjbzZpm7fR6j59J+EPGqxzk0nVG2dFS ExK+JEXicaqWSu+Rmw X-Received: by 2002:a05:7301:19a8:b0:2b8:64ad:ad4d with SMTP id 5a478bee46e88-2c15d479457mr1165933eec.26.1774429883454; Wed, 25 Mar 2026 02:11:23 -0700 (PDT) Received: from wujing. ([74.48.213.230]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c159e25dc7sm2786389eec.27.2026.03.25.02.11.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2026 02:11:23 -0700 (PDT) From: Qiliang Yuan Date: Wed, 25 Mar 2026 17:09:44 +0800 Subject: [PATCH 13/15] sched/isolation: Implement sysfs interface for dynamic housekeeping Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260325-dhei-v12-final-v1-13-919cca23cadf@gmail.com> References: <20260325-dhei-v12-final-v1-0-919cca23cadf@gmail.com> In-Reply-To: <20260325-dhei-v12-final-v1-0-919cca23cadf@gmail.com> To: Ingo Molnar , Peter Zijlstra , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Thomas Gleixner , "Paul E. McKenney" , Frederic Weisbecker , Neeraj Upadhyay , Joel Fernandes , Josh Triplett , Boqun Feng , Uladzislau Rezki , Mathieu Desnoyers , Lai Jiangshan , Zqiang , Tejun Heo , Andrew Morton , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Brendan Jackman , Johannes Weiner , Zi Yan , Anna-Maria Behnsen , Ingo Molnar , Shuah Khan Cc: linux-kernel@vger.kernel.org, rcu@vger.kernel.org, linux-mm@kvack.org, linux-kselftest@vger.kernel.org, Qiliang Yuan X-Mailer: b4 0.13.0 Subsystem housekeeping masks are currently static and can only be set via boot-time parameters (isolcpus, nohz_full, etc.). There is no userspace interface to reconfigure these boundaries at runtime. Implement the DHEI sysfs interface under /sys/kernel/housekeeping. This enables userspace to independently reconfigure different kernel services' affinities without a reboot. Signed-off-by: Qiliang Yuan --- kernel/sched/isolation.c | 89 ++++++++++++++++++++++++--------------------= ---- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c index 685cc0df1bd9f..1c867784d155b 100644 --- a/kernel/sched/isolation.c +++ b/kernel/sched/isolation.c @@ -8,7 +8,12 @@ * */ #include +#include #include +#include +#include +#include +#include #include #include #include "sched.h" @@ -16,9 +21,17 @@ enum hk_flags { HK_FLAG_DOMAIN =3D BIT(HK_TYPE_DOMAIN), HK_FLAG_MANAGED_IRQ =3D BIT(HK_TYPE_MANAGED_IRQ), - HK_FLAG_KERNEL_NOISE =3D BIT(HK_TYPE_KERNEL_NOISE), + HK_FLAG_TICK =3D BIT(HK_TYPE_TICK), + HK_FLAG_TIMER =3D BIT(HK_TYPE_TIMER), + HK_FLAG_RCU =3D BIT(HK_TYPE_RCU), + HK_FLAG_MISC =3D BIT(HK_TYPE_MISC), + HK_FLAG_WQ =3D BIT(HK_TYPE_WQ), + HK_FLAG_KTHREAD =3D BIT(HK_TYPE_KTHREAD), }; =20 +#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); @@ -44,6 +57,9 @@ static ssize_t smt_aware_store(struct kobject *kobj, { bool val; =20 + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + if (kstrtobool(buf, &val)) return -EINVAL; =20 @@ -53,7 +69,7 @@ static ssize_t smt_aware_store(struct kobject *kobj, } =20 static struct kobj_attribute smt_aware_attr =3D - __ATTR(smt_aware_mode, 0644, smt_aware_show, smt_aware_store); + __ATTR(smt_aware_mode, 0600, smt_aware_show, smt_aware_store); =20 bool housekeeping_enabled(enum hk_type type) { @@ -171,6 +187,9 @@ static ssize_t housekeeping_store(struct kobject *kobje= ct, cpumask_var_t new_mask; int err; =20 + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + if (!alloc_cpumask_var(&new_mask, GFP_KERNEL)) return -ENOMEM; =20 @@ -178,42 +197,26 @@ static ssize_t housekeeping_store(struct kobject *kob= ject, if (err) goto out_free; =20 - /* Safety check: must have at least one online CPU for housekeeping */ - if (!cpumask_intersects(new_mask, cpu_online_mask)) { + if (cpumask_empty(new_mask) || + !cpumask_intersects(new_mask, cpu_online_mask)) { err =3D -EINVAL; goto out_free; } =20 - if (housekeeping_smt_aware) { - int cpu, sibling; - cpumask_var_t tmp_mask; + mutex_lock(&housekeeping_mutex); =20 - if (!alloc_cpumask_var(&tmp_mask, GFP_KERNEL)) { - err =3D -ENOMEM; - goto out_free; - } + if (housekeeping_smt_aware) { + int cpu; =20 - cpumask_copy(tmp_mask, new_mask); - for_each_cpu(cpu, tmp_mask) { - for_each_cpu(sibling, topology_sibling_cpumask(cpu)) { - if (!cpumask_test_cpu(sibling, tmp_mask)) { - /* SMT sibling should stay grouped */ - cpumask_clear_cpu(cpu, new_mask); - break; - } + for_each_cpu(cpu, new_mask) { + if (!cpumask_subset(topology_sibling_cpumask(cpu), + new_mask)) { + err =3D -EINVAL; + goto out_unlock; } } - free_cpumask_var(tmp_mask); - - /* Re-check after SMT sync */ - if (!cpumask_intersects(new_mask, cpu_online_mask)) { - err =3D -EINVAL; - goto out_free; - } } =20 - mutex_lock(&housekeeping_mutex); - if (!housekeeping.cpumasks[type]) { if (!alloc_cpumask_var(&housekeeping.cpumasks[type], GFP_KERNEL)) { err =3D -ENOMEM; @@ -242,7 +245,7 @@ static ssize_t housekeeping_store(struct kobject *kobje= ct, } =20 static struct hk_attribute housekeeping_attrs[HK_TYPE_MAX]; -static struct attribute *housekeeping_attr_ptr[HK_TYPE_MAX + 1]; +static struct attribute *housekeeping_attr_ptr[HK_TYPE_MAX + 2]; =20 static const struct attribute_group housekeeping_attr_group =3D { .attrs =3D housekeeping_attr_ptr, @@ -265,28 +268,22 @@ static int __init housekeeping_sysfs_init(void) housekeeping_attrs[i].type =3D i; sysfs_attr_init(&housekeeping_attrs[i].kattr.attr); housekeeping_attrs[i].kattr.attr.name =3D hk_type_names[i]; - housekeeping_attrs[i].kattr.attr.mode =3D 0644; + housekeeping_attrs[i].kattr.attr.mode =3D 0600; housekeeping_attrs[i].kattr.show =3D housekeeping_show; housekeeping_attrs[i].kattr.store =3D housekeeping_store; housekeeping_attr_ptr[j++] =3D &housekeeping_attrs[i].kattr.attr; } + + housekeeping_attr_ptr[j++] =3D &smt_aware_attr.attr; housekeeping_attr_ptr[j] =3D NULL; =20 ret =3D sysfs_create_group(housekeeping_kobj, &housekeeping_attr_group); - if (ret) - goto err_group; - - ret =3D sysfs_create_file(housekeeping_kobj, &smt_aware_attr.attr); - if (ret) - goto err_file; + if (ret) { + kobject_put(housekeeping_kobj); + return ret; + } =20 return 0; - -err_file: - sysfs_remove_group(housekeeping_kobj, &housekeeping_attr_group); -err_group: - kobject_put(housekeeping_kobj); - return ret; } late_initcall(housekeeping_sysfs_init); =20 @@ -313,8 +310,12 @@ static void __init housekeeping_setup_type(enum hk_typ= e type, if (!slab_is_available()) gfp =3D GFP_NOWAIT; =20 - if (!housekeeping.cpumasks[type]) - alloc_cpumask_var(&housekeeping.cpumasks[type], gfp); + if (!housekeeping.cpumasks[type]) { + if (!alloc_cpumask_var(&housekeeping.cpumasks[type], gfp)) { + pr_err("housekeeping: failed to allocate cpumask for type %d\n", type); + return; + } + } =20 cpumask_copy(housekeeping.cpumasks[type], housekeeping_staging); --=20 2.43.0