From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.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 753C0367B73 for ; Fri, 10 Jul 2026 03:29:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783654189; cv=none; b=YyATcKV414LV92ozoKeLpTuGcJ4g2DBA3eDaoq26D/1OlpVwQN4aOxYP0TH01RgX7aGnMy+U4kgv12s3RybartNOIPgvIHCNqttUENeEQrMbqlkAo+8olwOb1y2WUaTTfKqRKYkCczDa0ax5PmG1EAr0QKKJ0xJtfDjvCtvtxwA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783654189; c=relaxed/simple; bh=Fu7ulrEF9vMTmeYkdDPOqk6yNZOJFGTqTgSUSx/HiFE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TIjGs9K5WDfI3zN9oc1xEqCWLVpTWGAmolK4K51FGYubivdd63sl9LofWGPGZV3VE5lmx1UJB4LENZssvyUCT953rWmRZpNyzn8+7XsxP6pf0bCHMDaf0zXnq9TETkloi7dlfm2+Ss4UMGWe3Y0zB6LIdBpJn+aOdWGu8LWnx+A= 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=CPjSwQ1+; arc=none smtp.client-ip=209.85.214.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="CPjSwQ1+" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2ccf2360620so3186945ad.3 for ; Thu, 09 Jul 2026 20:29:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783654188; x=1784258988; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=csN4cJukbkvLe5YqSWgDpZ0W4w2lD/0lFTHmWQ8kViM=; b=CPjSwQ1+Uh+vPpiUN05+zQHyfSzuyXF4e3gROBnIIoc2rU4Ll0devqaPDVA9FCir8o 5LVYRJITVLiku3cPATljGHQ1eB1yHBR20dcFXTuo+talptIz++27a0LM6nhRWs0K7Hwa wxACCtUNOziunFnY7mbMCo627vNHOktUsBl5DIJ0G+xZQ8SEnWua8BPiGENm0X3fT7lv uhg9/zkRaDLCxUU4fiaSUPbryuaJ4bQUwalWRnKnkP6dnv3kNXATI2umjMHm4zsmx8Ju ybXTCKBjPEVV0n3jNhEOJbweOsBBCq69kmyrSwG0/rnJZUu/9eX01RydiiYGnLkwtJsn MvDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783654188; x=1784258988; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=csN4cJukbkvLe5YqSWgDpZ0W4w2lD/0lFTHmWQ8kViM=; b=rp6d8TgKES2WoIjy45GqVpTwCQZJUEzzvubc/CbBlG8DNz0aQbUtZ8MmcZcz+V5E7g AxuPDrmvZFuBB0bNb4JJEXOlwvhuYYMMNADBXNJpTpDtAYk/UkSCLK2d2QMEg4jWn7li ocY2ZN6O6RezKNs9MW4RKxwtkXrjaZYlxjak8RyeoVN/GP23n+ZDVQw1xH5rQ5261e4l hLL2Jx1/sHYHqme4tzxY5h8uT2EAlK/u0dIKIym+EXnefxKifA/XvyMl1GrNtcg1EjKZ gMlt+fbieI4BEa3dcl11VVOHx5w5D7JBHAg/+sQ2BQma1M+8HV8JliyE+4hD3YQTPkA9 emUw== X-Forwarded-Encrypted: i=1; AHgh+Ro7YMtZ0kGjP50tT+fGYLm+zaY1xlkGq6jRroJ1ZAXR5iU3B05S4MOzPAR2gY4tdRB3jgGLw8oonWI41DzXnh4=@vger.kernel.org X-Gm-Message-State: AOJu0YzlmFXzRH1VmlftNOtNjcte+rvqop5vWqqxHKXuUA6BTlqkgHf6 PPnWmzJF5qcCAd6G+OjO4IEctZMiZcA77dq22sfV0m2nI2feJVf9AX+3 X-Gm-Gg: AfdE7cnK9+7kJplgd4WaTjdzMAn3GBWsScMtTSsTo7+JeArvEZeA83eZwNlzsUhtwSL O4b/y/KzrLr+hdCoTiz6a1T0YO1SU3d4v8URJ+XbwbXt/YmVhYbdlHN9CBmFUkDMPkIb7oFXFDX m/bWFVssmU2h0N2RSwZiVXCLROKqjCjml69lMeJEL6ybRv9E79k5ph+IUq6gbVEpBzvoiA6ZKg8 9axX/1wH0ufr39ih5w3Du6TdHnVZQX1S5Nyx6Pp5+bAc7vYVZ61GIty0sjqu1lvyACWF14nhSJh Cg8vICmmG0DwykmpGP3AMP+3tOb5k6KNJ03XKe02hEhqEzhy/9t4MFZw59vSrLlX3j6jYa+wSdZ OPaNx2PNUcLWBVPqF9mHPcd43YFVmePZBaAfyQ9IHwJ7FLzCUO9/is/uLlGqQFwLOUgpSq5HrUK arQbRpM2VF+8g= X-Received: by 2002:a17:903:2990:b0:2cc:f4d4:29a7 with SMTP id d9443c01a7336-2ccf4d46bd1mr83112295ad.24.1783654187634; Thu, 09 Jul 2026 20:29:47 -0700 (PDT) Received: from [127.0.1.1] ([138.199.21.246]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ccc9bdb56fsm53436465ad.15.2026.07.09.20.29.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2026 20:29:47 -0700 (PDT) From: Jing Wu Date: Fri, 10 Jul 2026 11:28:20 +0800 Subject: [PATCH v4 09/11] cpuset: drive kernel-noise isolation via per-CPU hotplug cycling Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260710-wujing-dhm-v4-9-2e912e5d9645@gmail.com> References: <20260710-wujing-dhm-v4-0-2e912e5d9645@gmail.com> In-Reply-To: <20260710-wujing-dhm-v4-0-2e912e5d9645@gmail.com> To: Ingo Molnar , Peter Zijlstra , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , "Paul E. McKenney" , Frederic Weisbecker , Neeraj Upadhyay , Joel Fernandes , Josh Triplett , Boqun Feng , Uladzislau Rezki , Mathieu Desnoyers , Lai Jiangshan , Zqiang , Anna-Maria Behnsen , Tejun Heo , Jonathan Corbet , Shuah Khan , Shuah Khan , Thomas Gleixner Cc: Waiman Long , linux-kernel@vger.kernel.org, rcu@vger.kernel.org, cgroups@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, Jing Wu , Qiliang Yuan X-Mailer: b4 0.13.0 Track A (cpuset_update_sd_hk_unlock) updates the HK_TYPE_KERNEL_NOISE and HK_TYPE_MANAGED_IRQ cpumasks but performs no per-CPU reconfiguration. Tick suppression, RCU callback offloading and managed-IRQ remapping only take effect when the affected CPUs pass through the CPU hotplug machinery. Implement dhm_cycle_isolated_cpus() and call it from cpuset_update_sd_hk_unlock() after all cpuset and hotplug locks are released so that remove_cpu()/add_cpu() may acquire cpus_write_lock without violating the cpu_hotplug_lock > cpuset_top_mutex order. On isolation, for each newly-isolated CPU: 1. remove_cpu() - offline; dying callbacks migrate IRQs 2. tick_nohz_cpu_isolate() - add to tick_nohz_full_mask, enable context tracking (B0/B3) 3. rcu_nocb_cpu_isolate() - lazy nocb init, spawn kthreads, offload callbacks (B1) 4. add_cpu() - online; tick and IRQ online callbacks reconfigure against updated HK masks On de-isolation, the reverse order is applied. The managed-IRQ remapping requires no explicit call: irq_migrate_all_off_this_cpu() (dying callback) and irq_affinity_online_cpu() (online callback) already consult the updated HK_TYPE_MANAGED_IRQ mask. dhm_prev_isolated tracks the previous isolation set so that only CPUs whose state changed are cycled rather than the full isolation set. lockup_detector_hk_update() (B2) is called once after all CPUs are cycled to update the watchdog mask. CPUs with hotplug disabled (e.g. x86-64 boot CPU) cannot be taken offline and are skipped. On any remove_cpu() failure the corresponding CPU is cleared from dhm_prev_isolated so the next isolation attempt will retry rather than silently treating it as already isolated. Symmetrically, a de-isolation remove_cpu() failure re-sets the bit in dhm_prev_isolated so the CPU remains tracked as still isolated. Co-developed-by: Qiliang Yuan Signed-off-by: Qiliang Yuan Signed-off-by: Jing Wu --- kernel/cgroup/cpuset.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 62eb6798a0c3e..d9e121bf14292 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -20,6 +20,8 @@ */ #include "cpuset-internal.h" +#include +#include #include #include #include @@ -33,7 +35,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -164,6 +168,14 @@ static cpumask_var_t isolated_hk_cpus; /* T */ static DEFINE_SPINLOCK(dhm_cycling_lock); static cpumask_var_t dhm_cycling_cpus; +/* + * Snapshot of the isolated CPUs from the previous housekeeping update. + * Used to compute the delta (newly isolated / newly de-isolated) so that + * only the changed CPUs are cycled rather than the full isolation set. + * Protected by cpuset_top_mutex. + */ +static cpumask_var_t dhm_prev_isolated; + /* * A flag to force sched domain rebuild at the end of an operation. * It can be set in @@ -1339,6 +1351,84 @@ static bool prstate_housekeeping_conflict(int prstate, struct cpumask *new_cpus) return false; } +/* + * dhm_cycle_isolated_cpus - Apply kernel-noise isolation via hotplug cycling + * + * For each CPU newly entering isolation: cycle it offline, configure tick + * suppression and RCU callback offloading while it is offline, then bring + * it back online. The managed-IRQ state is handled automatically by the + * existing irq_migrate_all_off_this_cpu() dying callback and the + * irq_affinity_online_cpu() online callback which both consult the + * already-updated HK_TYPE_MANAGED_IRQ mask. + * + * For each CPU leaving isolation: cycle it offline, de-offload RCU and + * restore the tick, then bring it back online. + * + * Must be called without any cpuset or hotplug locks held. + */ +static void dhm_cycle_isolated_cpus(const struct cpumask *new_isolated) +{ + cpumask_var_t newly_isolated, newly_deisolated; + int cpu; + + if (!alloc_cpumask_var(&newly_isolated, GFP_KERNEL) || + !alloc_cpumask_var(&newly_deisolated, GFP_KERNEL)) { + free_cpumask_var(newly_isolated); + return; + } + + cpumask_andnot(newly_isolated, new_isolated, dhm_prev_isolated); + cpumask_andnot(newly_deisolated, dhm_prev_isolated, new_isolated); + cpumask_copy(dhm_prev_isolated, new_isolated); + + if (cpumask_empty(newly_isolated) && cpumask_empty(newly_deisolated)) + return; + + /* Mark cycling CPUs so cpuset_hotplug_update_tasks skips invalidation */ + spin_lock(&dhm_cycling_lock); + cpumask_or(dhm_cycling_cpus, newly_isolated, newly_deisolated); + spin_unlock(&dhm_cycling_lock); + + for_each_cpu(cpu, newly_isolated) { + if (!cpu_is_hotpluggable(cpu)) { + pr_warn_once("cpuset: CPU%d cannot be isolated (hotplug disabled)\n", + cpu); + cpumask_clear_cpu(cpu, dhm_prev_isolated); + continue; + } + if (remove_cpu(cpu)) { + pr_warn_once("cpuset: failed to offline CPU%d for isolation\n", + cpu); + cpumask_clear_cpu(cpu, dhm_prev_isolated); + continue; + } + WARN_ON_ONCE(tick_nohz_cpu_isolate(cpu)); + WARN_ON_ONCE(rcu_nocb_cpu_isolate(cpu)); + WARN_ON_ONCE(add_cpu(cpu)); + } + + for_each_cpu(cpu, newly_deisolated) { + if (remove_cpu(cpu)) { + pr_warn_once("cpuset: failed to offline CPU%d for de-isolation\n", + cpu); + cpumask_set_cpu(cpu, dhm_prev_isolated); + continue; + } + WARN_ON_ONCE(rcu_nocb_cpu_deoffload(cpu)); + tick_nohz_cpu_deisolate(cpu); + WARN_ON_ONCE(add_cpu(cpu)); + } + + spin_lock(&dhm_cycling_lock); + cpumask_clear(dhm_cycling_cpus); + spin_unlock(&dhm_cycling_lock); + + lockup_detector_hk_update(); + + free_cpumask_var(newly_isolated); + free_cpumask_var(newly_deisolated); +} + /* * cpuset_update_sd_hk_unlock - Rebuild sched domains, update HK & unlock * @@ -1386,6 +1476,13 @@ static void cpuset_update_sd_hk_unlock(void) WARN_ON_ONCE(housekeeping_update_types(noise_types, isolated_hk_cpus)); mutex_unlock(&cpuset_top_mutex); + + /* + * All cpuset and hotplug locks are released. Cycle each + * affected CPU through hotplug to activate tick suppression, + * RCU callback offloading and managed-IRQ remapping. + */ + dhm_cycle_isolated_cpus(isolated_hk_cpus); } else { cpuset_full_unlock(); } @@ -3717,6 +3814,7 @@ int __init cpuset_init(void) BUG_ON(!zalloc_cpumask_var(&isolated_cpus, GFP_KERNEL)); BUG_ON(!zalloc_cpumask_var(&isolated_hk_cpus, GFP_KERNEL)); BUG_ON(!zalloc_cpumask_var(&dhm_cycling_cpus, GFP_KERNEL)); + BUG_ON(!zalloc_cpumask_var(&dhm_prev_isolated, GFP_KERNEL)); cpumask_setall(top_cpuset.cpus_allowed); nodes_setall(top_cpuset.mems_allowed); -- 2.43.0