From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f51.google.com (mail-dl1-f51.google.com [74.125.82.51]) (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 4BDE5397E7E for ; Mon, 13 Apr 2026 07:44:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776066289; cv=none; b=uUmbvur/GcL6F9uHgcyPL0pfREFCxXWE7tsp/Kwknatmhr5RnPxApPzJhzbZBFtOKgrKJiKj1wDoQd6kI1Db+j4DOisMgAIHq5lTIBbvUHzPQMCw3cM7Hbb4jp8fqopRCAciFEsUldZgponDhs/xwBI4HsqtanoZueNtLdq/W/U= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776066289; c=relaxed/simple; bh=kiArkSt0flIs7bU/fXEY7xT5bOeGaqUbcFrMu1wIeUY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AMV08oGYhiMPIhmrfzq0vpP/2YdsTJEvlnav3JBe8BmZWqweRePn+pwCAZr5oLehSemZDpfqY24BYXV4cWyimz7ViQyn1ACDY5VFkcTHflM2HrVIhemjo5wKRcuee5GWOp6tAfGYl13vXrE8T03WdrP+Prx69QPAxV2boi7NCss= 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=lgnwjA3T; arc=none smtp.client-ip=74.125.82.51 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="lgnwjA3T" Received: by mail-dl1-f51.google.com with SMTP id a92af1059eb24-12c42a23c8eso1497795c88.1 for ; Mon, 13 Apr 2026 00:44:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776066286; x=1776671086; 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=CyDvJikQxepnDoa9At7D55yqji9L3lHPWXvHJrxbFWg=; b=lgnwjA3TLeboVOt7tdBB7T2Z/AXluc+LVd2DZ6NLe5wr4foxO2TQapCKhLZt0YH0be T+ZYkABD3ysqa/LweE+RXd+eUEgTor2n+X+gUFM+/QYv0oTmkTyr14bD7IgSrMrrzdjW mpoHKgALSgQzPqfJHANCccwE7vS7+QQEeSUOgKsdEbJLbJ+OweLbJXW9Sk0kfce2E1ib MWWIbPqmgg5dNvtsLb2ZgdlRdxYo8I3nSRY4T3J2fc7C3VEMCfbHprhE6kTzVflo/wL9 BbqOm+Z/pBstDD60zpS6YewnhcTDPCbPAO/Jre1woxVaEkYPy849EpuqasTS7OfaPNeM ejVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776066286; x=1776671086; 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=CyDvJikQxepnDoa9At7D55yqji9L3lHPWXvHJrxbFWg=; b=HqeRmOKO83QpIYgfaVLtXPsmvT/vG7GoGJSnAgUG9QTqM0R0HM9IojJ9hFcL/L/mNZ /y4vLM/k6+vODYZOq8Vx+c9CmSHjsaqBSFeh3EZB4FKQg/qyLcFAgM34yWFlfQvzq+hx yuE3icOE2K+HqDJZRzJDLADIwAUXnj6uLFB/wReqR+Lwg4MYNIyCOrdkzqcekQ5q4BDR 8G5tZkvHVdxcD/Mg/P8ovPZGauwzfhY4pnCOkGbKOl2JNkM/UUkGNxNIAcTPqsc0VL68 UlyzlOF2k0eHJn8wELGKugE0TCLzsPGm5pXDowc4vTp/12iJ6uHH8h/gGOR5wFSlVvj1 QcsA== X-Forwarded-Encrypted: i=1; AFNElJ87bUH1usRvWZ/kJS9S+W440OVjzX10lFrM7LMts4mBp7Zo75v+4B3aNjJPv3Q+SCLmbvUdkvwG2ObcQd1ZzZU=@vger.kernel.org X-Gm-Message-State: AOJu0YzgxAh3wEIwz9z5wN0oHr6JAHelIBG4jJKCr+E7QBkVEJIny8sw urS2YzSDi6KLeNdMUVsts2CRM86Tcc0Pa+y9u+jgaCbYUlwADZonwGU/ X-Gm-Gg: AeBDievsYYonv8WsAZN/aug0A78BpZuJy+b/WVG6k2ROmPD/SVeuaF/v4a4blqrOGY9 4BYa1dXpMw3HbftlaJkrkZAWYPA0bi4YpBo3Rey6XtrZ1kqsnQBaZj+g0Z/3RWkP1k4L8vecn/q eAGRs5zwpKYWkK2piD0xav+edvMH7YLprzhl00JzdZfBDIZXoyB7yKxZ5uTHT4XEMkX4/w7Bx2R NWWZ5Mo/NONlDbkM3QCsPQxCgrKkaJ33vaaIJy3JjeOEARye0A6wlVAgBmVjPtrOMfEKMdChVdk 5Cw740uuZcO0jwNAytE//P0/0jNyMGgJ+5uFTz8xjnEanzcr6zmDavk9iqZqnQu+PECWQHrid3h pd7649QV9E7y4ZrHhqt/2V925K5yVGGNuwOH1OPuWIRP3/FFnWNgiem793MRS92aK5c2HsTaFJ+ XC5gubHGDivy4z4u5q X-Received: by 2002:a05:7022:61a2:b0:128:d51a:5157 with SMTP id a92af1059eb24-12c34f1449emr6389794c88.33.1776066286323; Mon, 13 Apr 2026 00:44:46 -0700 (PDT) Received: from wujing. ([74.48.213.230]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12c347fa2c9sm12884610c88.15.2026.04.13.00.44.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Apr 2026 00:44:46 -0700 (PDT) From: Qiliang Yuan Date: Mon, 13 Apr 2026 15:43:14 +0800 Subject: [PATCH v2 08/12] workqueue, mm: Support dynamic housekeeping mask updates 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: <20260413-wujing-dhm-v2-8-06df21caba5d@gmail.com> References: <20260413-wujing-dhm-v2-0-06df21caba5d@gmail.com> In-Reply-To: <20260413-wujing-dhm-v2-0-06df21caba5d@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 , Ingo Molnar , Thomas Gleixner , Tejun Heo , Andrew Morton , Vlastimil Babka , Suren Baghdasaryan , Michal Hocko , Brendan Jackman , Johannes Weiner , Zi Yan , Waiman Long , Chen Ridong , =?utf-8?q?Michal_Koutn=C3=BD?= , Jonathan Corbet , Shuah Khan , Shuah Khan Cc: linux-kernel@vger.kernel.org, rcu@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, Qiliang Yuan X-Mailer: b4 0.13.0 Unbound workqueues and kcompactd threads determine their default CPU affinity from housekeeping masks (HK_TYPE_WQ, HK_TYPE_DOMAIN, and HK_TYPE_KTHREAD) at boot. Currently, these boundaries are static and are not updated if housekeeping is reconfigured at runtime. Implement housekeeping notifiers for both workqueue and mm compaction. This ensures that unbound workqueue tasks and background compaction threads honor dynamic isolation boundaries configured via sysfs or cpuset at runtime. Signed-off-by: Qiliang Yuan --- kernel/workqueue.c | 42 ++++++++++++++++++++++++++++++++++++++++++ mm/compaction.c | 27 +++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/kernel/workqueue.c b/kernel/workqueue.c index eda756556341a..354e788004b48 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -8008,6 +8008,47 @@ static void __init wq_cpu_intensive_thresh_init(void) wq_cpu_intensive_thresh_us = thresh; } +static int wq_housekeeping_reconfigure(struct notifier_block *nb, + unsigned long action, void *data) +{ + if (action == HK_UPDATE_MASK) { + struct housekeeping_update *upd = data; + unsigned int type = upd->type; + + if (type == HK_TYPE_WQ || type == HK_TYPE_DOMAIN) { + cpumask_var_t cpumask; + + if (!alloc_cpumask_var(&cpumask, GFP_KERNEL)) { + pr_warn("workqueue: failed to allocate cpumask for housekeeping update\n"); + return NOTIFY_BAD; + } + + cpumask_copy(cpumask, cpu_possible_mask); + if (!cpumask_empty(housekeeping_cpumask(HK_TYPE_WQ))) + cpumask_and(cpumask, cpumask, housekeeping_cpumask(HK_TYPE_WQ)); + if (!cpumask_empty(housekeeping_cpumask(HK_TYPE_DOMAIN))) + cpumask_and(cpumask, cpumask, housekeeping_cpumask(HK_TYPE_DOMAIN)); + + workqueue_set_unbound_cpumask(cpumask); + + if (type == HK_TYPE_DOMAIN) { + apply_wqattrs_lock(); + cpumask_andnot(wq_isolated_cpumask, cpu_possible_mask, + housekeeping_cpumask(HK_TYPE_DOMAIN)); + apply_wqattrs_unlock(); + } + + free_cpumask_var(cpumask); + } + } + + return NOTIFY_OK; +} + +static struct notifier_block wq_housekeeping_nb = { + .notifier_call = wq_housekeeping_reconfigure, +}; + /** * workqueue_init - bring workqueue subsystem fully online * @@ -8068,6 +8109,7 @@ void __init workqueue_init(void) wq_online = true; wq_watchdog_init(); + housekeeping_register_notifier(&wq_housekeeping_nb); } /* diff --git a/mm/compaction.c b/mm/compaction.c index 1e8f8eca318c6..574ee3c6dc942 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "internal.h" #ifdef CONFIG_COMPACTION @@ -3246,6 +3247,7 @@ void __meminit kcompactd_run(int nid) pr_err("Failed to start kcompactd on node %d\n", nid); pgdat->kcompactd = NULL; } else { + housekeeping_affine(pgdat->kcompactd, HK_TYPE_KTHREAD); wake_up_process(pgdat->kcompactd); } } @@ -3320,6 +3322,30 @@ static const struct ctl_table vm_compaction[] = { }, }; +static int kcompactd_housekeeping_reconfigure(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct housekeeping_update *upd = data; + unsigned int type = upd->type; + + if (action == HK_UPDATE_MASK && type == HK_TYPE_KTHREAD) { + int nid; + + for_each_node_state(nid, N_MEMORY) { + pg_data_t *pgdat = NODE_DATA(nid); + + if (pgdat->kcompactd) + housekeeping_affine(pgdat->kcompactd, HK_TYPE_KTHREAD); + } + } + + return NOTIFY_OK; +} + +static struct notifier_block kcompactd_housekeeping_nb = { + .notifier_call = kcompactd_housekeeping_reconfigure, +}; + static int __init kcompactd_init(void) { int nid; @@ -3327,6 +3353,7 @@ static int __init kcompactd_init(void) for_each_node_state(nid, N_MEMORY) kcompactd_run(nid); register_sysctl_init("vm", vm_compaction); + housekeeping_register_notifier(&kcompactd_housekeeping_nb); return 0; } subsys_initcall(kcompactd_init) -- 2.43.0