From nobody Tue Sep 9 21:32:28 2025 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (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 C119128505E for ; Fri, 5 Sep 2025 09:05:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757063118; cv=none; b=OEe/0C8icoRbBnQ+W2Gaf//OJdBtLCU7Xn+nM5T06s+bK1hAkI0sAsp1x9ew96Gmra/vI5QYOA3p6Ya954X2fYJsPEeEkXadWznydkHR+kHH1fPMM1NX8nVhqdoOGt7EY7l6UHCwjFuzTU1JU0vDtPJdkubPeASwMlDzJM+xdKg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757063118; c=relaxed/simple; bh=KQKQVJ7lJzRB3wBu/0Dgv/3ZrfXT/Pn1PrSSG8Lq3Uo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EKwJ7Lkecis2S3cXIabkQgkI0/TdEDrGDZM8e4J6nI2bACzY/U8tBRD7x5eRQeV0jaZpJayFCeM5L1g2onR7GSKSXPpA+H7TMHcUcsZnJ6o3QJ4R/CqFoCgoB1w4OA8V1645cM+zwT5gP6AfIfcCUsfg0V7CeAbfDJucqwqEti0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=JusYlXTc; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="JusYlXTc" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-45a1b065d59so11909415e9.1 for ; Fri, 05 Sep 2025 02:05:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1757063114; x=1757667914; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=K+xd/zkrq9qnCtuPpoVr2SZdLtt3PbE8CPFIIoENU5A=; b=JusYlXTcMeQA4qGayJ3Sj+yL2aUtegL5KG+GsjeVm+vh9r6fllgqpAcreyIlzShsEn cRQi+heiXZqe5N3GuGGsye5aclpx3xzlnAxlKMHuGmH3tiO5wVHFz+3+r5K5D8rsOotS t+Yv5k4Sq/Z538OcKQMYUPeUGrRxHa9LGazKDdXyyahemJryjCBQdSU0n37h8jR0Y1TX 3Q/888xGIBTZrvYe6MPaV11MNl88uDfE8hHvOmijR7LV69DdFX1/6XtRhP0+FZHAsDA7 zubwj95EesbIyTsEg0w7pdL/qkYLsHSyZXBbDBszgtZJkgXB3sPOYlreGEQip1CMEewh NIIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757063114; x=1757667914; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=K+xd/zkrq9qnCtuPpoVr2SZdLtt3PbE8CPFIIoENU5A=; b=bvbmPXwKQruehqDtggCgumfqOHlf8tX61BDZURQxV/Ap04cmrssiqQ4egHERWp+BaH VQGqd1KDpA5Wtbscyb0nxiuRjUcPt+XCwstLYXnMqb6Xvs0Tfi7Bz1NbHgl1E3/YeSMe ndwLNmO7VvFrSCGnEIYYXfgXPigK4i4W2WV/Nep6rJLoAULSREVSEJ3/mLynu11d6kle oFIBaTiSzFn4ikADUTC4iu7ThnljyuxdN0H0ayS6VmZhIiHX+ckKlio147CsIoL8zmbU ZZpxARCxv3Z+HiQMDIOlB5gYiHhibDr1WiDGz8EZlEE9MpKDe/4CtQ41L9akyPeJVbt5 DN6g== X-Gm-Message-State: AOJu0YzUVkCiQJ+HrqkIWqPU9Ncb+nIIF4JBCopW12FdDNQTzche7pWp Rdz49X+DtY5UzDVhv+DZZU+qvcL4+2tXIW5gVs5w9aYsnXIei6aV1q+7CNpqFLrYsxUWiWOiDst wMHnV X-Gm-Gg: ASbGnct0n7riUse3+xBG+UdNr//OcjV3kYhjbH11v4VvVKhkytXElVQxCNT63AbxHNa eXY+ydg13wFLXViyKJTaBYuvLn2XBJTy9UUcwxKIVXfpp9/fmzYddD7C6YUIJVP3H1TH8Hw0IUz JYWyDOCHBWIiFIH2PNMtDMc5odX0vk8it+BPhVFusk7OYAuNSQxHlyCSaYt5GX1Fx6OddkOh6XY WiJ9QjhFqxpwtp8QZDwuxWK/UZH1pO5Q1ExcDzTcuTflJoDvT4KiCsHfPUpFOQsNFpKB4/mrd4Q OpDaiQJASUDYYjX9TnK8QCtd43v+lMnyFDKN995VWW/ggZhFcHzVgOIu+CAmzViKZlJaBC5glrN DqR37UzKCFBXQULAXzNtUP7hbjh1J8LMXmblgwuVhrERB9p0oDqJbkQ9sIQ== X-Google-Smtp-Source: AGHT+IGliwPQzMpMR1QlkorP2dKk5+DSC/EvCZeJQnsDT+TYenQJ/XIyO1x6P/liehaCAtNovimi5w== X-Received: by 2002:a05:600c:c1c8:10b0:45b:8600:2bcb with SMTP id 5b1f17b1804b1-45b86002ceemr135661645e9.7.1757063113655; Fri, 05 Sep 2025 02:05:13 -0700 (PDT) Received: from localhost.localdomain ([2a00:6d43:105:c401:e307:1a37:2e76:ce91]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45dd07480d5sm34118215e9.8.2025.09.05.02.05.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Sep 2025 02:05:13 -0700 (PDT) From: Marco Crivellari To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Tejun Heo , Lai Jiangshan , Frederic Weisbecker , Sebastian Andrzej Siewior , Marco Crivellari , Michal Hocko , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Subject: [PATCH net-next 1/3] net: replace use of system_unbound_wq with system_dfl_wq Date: Fri, 5 Sep 2025 11:05:03 +0200 Message-ID: <20250905090505.104882-2-marco.crivellari@suse.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250905090505.104882-1-marco.crivellari@suse.com> References: <20250905090505.104882-1-marco.crivellari@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently if a user enqueue a work item using schedule_delayed_work() the used wq is "system_wq" (per-cpu wq) while queue_delayed_work() use WORK_CPU_UNBOUND (used when a cpu is not specified). The same applies to schedule_work() that is using system_wq and queue_work(), that makes use again of WORK_CPU_UNBOUND. This lack of consistentcy cannot be addressed without refactoring the API. system_unbound_wq should be the default workqueue so as not to enforce locality constraints for random work whenever it's not required. Adding system_dfl_wq to encourage its use when unbound work should be used. queue_work() / queue_delayed_work() / mod_delayed_work() will now use the new unbound wq: whether the user still use the old wq a warn will be printed along with a wq redirect to the new one. The old system_unbound_wq will be kept for a few release cycles. Suggested-by: Tejun Heo Signed-off-by: Marco Crivellari --- drivers/net/macvlan.c | 2 +- drivers/net/netdevsim/dev.c | 6 +++--- drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 4 ++-- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 2 +- net/core/link_watch.c | 4 ++-- net/unix/garbage.c | 2 +- net/wireless/core.c | 4 ++-- net/wireless/sysfs.c | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index d0dfa6bca6cc..8572748b79f6 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -369,7 +369,7 @@ static void macvlan_broadcast_enqueue(struct macvlan_po= rt *port, } spin_unlock(&port->bc_queue.lock); =20 - queue_work(system_unbound_wq, &port->bc_work); + queue_work(system_dfl_wq, &port->bc_work); =20 if (err) goto free_nskb; diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 3e0b61202f0c..0b7c945a0e96 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -836,7 +836,7 @@ static void nsim_dev_trap_report_work(struct work_struc= t *work) nsim_dev =3D nsim_trap_data->nsim_dev; =20 if (!devl_trylock(priv_to_devlink(nsim_dev))) { - queue_delayed_work(system_unbound_wq, + queue_delayed_work(system_dfl_wq, &nsim_dev->trap_data->trap_report_dw, 1); return; } @@ -852,7 +852,7 @@ static void nsim_dev_trap_report_work(struct work_struc= t *work) cond_resched(); } devl_unlock(priv_to_devlink(nsim_dev)); - queue_delayed_work(system_unbound_wq, + queue_delayed_work(system_dfl_wq, &nsim_dev->trap_data->trap_report_dw, msecs_to_jiffies(NSIM_TRAP_REPORT_INTERVAL_MS)); } @@ -909,7 +909,7 @@ static int nsim_dev_traps_init(struct devlink *devlink) =20 INIT_DELAYED_WORK(&nsim_dev->trap_data->trap_report_dw, nsim_dev_trap_report_work); - queue_delayed_work(system_unbound_wq, + queue_delayed_work(system_dfl_wq, &nsim_dev->trap_data->trap_report_dw, msecs_to_jiffies(NSIM_TRAP_REPORT_INTERVAL_MS)); =20 diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wire= less/intel/iwlwifi/fw/dbg.c index 03f639fbf9b6..2467b5d56014 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c @@ -2950,7 +2950,7 @@ int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fw= rt, IWL_WARN(fwrt, "Collecting data: trigger %d fired.\n", le32_to_cpu(desc->trig_desc.type)); =20 - queue_delayed_work(system_unbound_wq, &wk_data->wk, + queue_delayed_work(system_dfl_wq, &wk_data->wk, usecs_to_jiffies(delay)); =20 return 0; @@ -3254,7 +3254,7 @@ int iwl_fw_dbg_ini_collect(struct iwl_fw_runtime *fwr= t, if (sync) iwl_fw_dbg_collect_sync(fwrt, idx); else - queue_delayed_work(system_unbound_wq, + queue_delayed_work(system_dfl_wq, &fwrt->dump.wks[idx].wk, usecs_to_jiffies(delay)); =20 diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/w= ireless/intel/iwlwifi/iwl-trans.h index 25fb4c50e38b..29ff021b5779 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h @@ -1163,7 +1163,7 @@ static inline void iwl_trans_schedule_reset(struct iw= l_trans *trans, */ trans->restart.during_reset =3D test_bit(STATUS_IN_SW_RESET, &trans->status); - queue_work(system_unbound_wq, &trans->restart.wk); + queue_work(system_dfl_wq, &trans->restart.wk); } =20 static inline void iwl_trans_fw_error(struct iwl_trans *trans, diff --git a/net/core/link_watch.c b/net/core/link_watch.c index cb04ef2b9807..7c17cba6437d 100644 --- a/net/core/link_watch.c +++ b/net/core/link_watch.c @@ -157,9 +157,9 @@ static void linkwatch_schedule_work(int urgent) * override the existing timer. */ if (test_bit(LW_URGENT, &linkwatch_flags)) - mod_delayed_work(system_unbound_wq, &linkwatch_work, 0); + mod_delayed_work(system_dfl_wq, &linkwatch_work, 0); else - queue_delayed_work(system_unbound_wq, &linkwatch_work, delay); + queue_delayed_work(system_dfl_wq, &linkwatch_work, delay); } =20 =20 diff --git a/net/unix/garbage.c b/net/unix/garbage.c index 01e2b9452c75..684ab03137b6 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c @@ -592,7 +592,7 @@ static DECLARE_WORK(unix_gc_work, __unix_gc); void unix_gc(void) { WRITE_ONCE(gc_in_progress, true); - queue_work(system_unbound_wq, &unix_gc_work); + queue_work(system_dfl_wq, &unix_gc_work); } =20 #define UNIX_INFLIGHT_TRIGGER_GC 16000 diff --git a/net/wireless/core.c b/net/wireless/core.c index dcce326fdb8c..ffe0f439fda8 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -428,7 +428,7 @@ static void cfg80211_wiphy_work(struct work_struct *wor= k) if (wk) { list_del_init(&wk->entry); if (!list_empty(&rdev->wiphy_work_list)) - queue_work(system_unbound_wq, work); + queue_work(system_dfl_wq, work); spin_unlock_irq(&rdev->wiphy_work_lock); =20 trace_wiphy_work_run(&rdev->wiphy, wk); @@ -1670,7 +1670,7 @@ void wiphy_work_queue(struct wiphy *wiphy, struct wip= hy_work *work) list_add_tail(&work->entry, &rdev->wiphy_work_list); spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags); =20 - queue_work(system_unbound_wq, &rdev->wiphy_work); + queue_work(system_dfl_wq, &rdev->wiphy_work); } EXPORT_SYMBOL_GPL(wiphy_work_queue); =20 diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c index 62f26618f674..8d142856e385 100644 --- a/net/wireless/sysfs.c +++ b/net/wireless/sysfs.c @@ -137,7 +137,7 @@ static int wiphy_resume(struct device *dev) if (rdev->wiphy.registered && rdev->ops->resume) ret =3D rdev_resume(rdev); rdev->suspended =3D false; - queue_work(system_unbound_wq, &rdev->wiphy_work); + queue_work(system_dfl_wq, &rdev->wiphy_work); wiphy_unlock(&rdev->wiphy); =20 if (ret) --=20 2.51.0 From nobody Tue Sep 9 21:32:28 2025 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 CE38B2853E7 for ; Fri, 5 Sep 2025 09:05:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757063119; cv=none; b=UuFva04vPanJxGjbM/LcctO1ntcEXUgL9b4kqQLgXIAZn3zu3uXPIYwjtXr7YmLaiOiS5ZVw9xx77Cbia3al70QvJOQ1aeV4bSft8ZBtsLmgDoeVG5kpKuYzIYvWnVhL929kLl9Ybh8iXFKtR1aCTXvM0J5T7epsWuzhpgDSWJ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757063119; c=relaxed/simple; bh=tkpTnSvsTVeadQu+R6KtlwfCPBOXazKYJ6mCD9nBZ54=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N5diKXaX8QBjZy7way9XM+ZxFTZwCGB3Y6VdnxveCLiJKseBBpzfYi5kVrCT+mV1twSLaiRCILI4VD/kmMP4FDza8HaEmkFsejKcH33H0AwjzDUCzbaPrBzL2zSTsGye3ryMqwCHrEpqZFrZAZAkvoIW6d1G+ORhOzloG1NinoU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=DYjaNE2t; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="DYjaNE2t" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-45cb5492350so12596865e9.1 for ; Fri, 05 Sep 2025 02:05:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1757063115; x=1757667915; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=tjgwxAkrVtHfV6W1dztk3Jt179FxDlZFaz1T04VTrBg=; b=DYjaNE2tnbxoVuxXKxkXVHBt+KOoUGyzKf/YutcgVDvz6hoY6+CXfJeJ1+lC23fcUL /RUbUTBvjYrAJaC1GPglyDp3HtSRpe7L+/OLlyyLZQdsXlg0kR7OqrIgtnuLKKUH7FAJ pwqIm+T7QULM7Y5aFsYlgUjIEz0OvAnol7kCmBmnJP242sB6n7jDvOV5rUau44PdsPsG weRVK646sT6uJPSPuPjIoCIdbU4R2SwocWZhKE+HnYqKdg44PuhyiCWZGnrCh5N4LUw2 DhxVbmcUalOdEyJBxyj/ys0TqF9ngL5arImQLMO23CVEAUGPLACZrla8Z+beDX9uZ33K nxgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757063115; x=1757667915; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tjgwxAkrVtHfV6W1dztk3Jt179FxDlZFaz1T04VTrBg=; b=FGXJiwa7F3agMimdttVGMHJFwsOs7h/q006FrVMH64jn3uVvCF+k/6Umdw6mhq8uDX 6PtZFZlZ1vhCqP5mTOCWg4OvuMvw4NYaln5PM9HheK1wZ26dEjdbEES9FC1crwqo27/5 ZjrHkX95849gBRASXv8PIQhLetYGaY3oFdLEGUDueZBhMrrXIoxRLcZfYFyad5bHwp// WN968YlvTW7nwrjlvKzimpQlycyAHozguPXBSa3d1WlmjxcCrqrMlHVSbhu/AQft2t02 9WvPoIQoQKxIB+/eavdNc/rUNGiOIMyhNNnfqABlikHKRdYcSQgaZYHZymneBplg3SMe 20kA== X-Gm-Message-State: AOJu0YyI/GQVl1WyM927tVvWOWEA2dYAzmvpWQ1X3+q6Kkwjny5CEc6P 1dq4ZkNw+dpu3oVC6J62AQibKRY9oBNTBj3EbRw9KMlWCopYNes6bL5AKRAVO+xVH3tFRiwMHcf Nu7Bt X-Gm-Gg: ASbGnctOOxkDAHW3ywQU8Z9nk6PcskUU3bi1qB+4NyLF+fTF3TMh0ZDzEJSmxevllRl dmFYLkxuaa4t8XJSXPgvzSgIsoDJmjCEsXItGV3F0fsgeRYYE/9Lq7p0GlLQ6raL8uXoW9x/6+p mr43yrwntWmxWjDVFL19+EiXw0Sg8auUF5ntKv3rh58MUNigsOWsnQrqHZTmdVe23Yo6N3BoXkG BRBcMvKDIu8lAU3+smIcIPhZxhjTWsN2FHQpq5dXyYlyLo++ai8OFVbzvbGXbyneVJXDlJDT6uH MmSaZLOEdUjY6MSRZAs7zeDdiI9du8yzuRqkqS0SvxaRDY5plBD+lc6zA/JhNCdKeCYxaIZJDQR dKiLOXU4AplFXl4TcR0F58eRyWwUCGzT2ssn4f/6Vauwk8UJs+/KUf8Kqog== X-Google-Smtp-Source: AGHT+IFc0lpmmk1SBvX9AIDtZdZhHW62mg1Km6v6BS0T01t+0rChjs88kYkD58jciUgtlH/+xqVinQ== X-Received: by 2002:a05:600c:45c5:b0:45b:6743:2242 with SMTP id 5b1f17b1804b1-45b85589b3dmr179126555e9.22.1757063114609; Fri, 05 Sep 2025 02:05:14 -0700 (PDT) Received: from localhost.localdomain ([2a00:6d43:105:c401:e307:1a37:2e76:ce91]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45dd07480d5sm34118215e9.8.2025.09.05.02.05.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Sep 2025 02:05:14 -0700 (PDT) From: Marco Crivellari To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Tejun Heo , Lai Jiangshan , Frederic Weisbecker , Sebastian Andrzej Siewior , Marco Crivellari , Michal Hocko , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Subject: [PATCH net-next 2/3] net: replace use of system_wq with system_percpu_wq Date: Fri, 5 Sep 2025 11:05:04 +0200 Message-ID: <20250905090505.104882-3-marco.crivellari@suse.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250905090505.104882-1-marco.crivellari@suse.com> References: <20250905090505.104882-1-marco.crivellari@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently if a user enqueue a work item using schedule_delayed_work() the used wq is "system_wq" (per-cpu wq) while queue_delayed_work() use WORK_CPU_UNBOUND (used when a cpu is not specified). The same applies to schedule_work() that is using system_wq and queue_work(), that makes use again of WORK_CPU_UNBOUND. This lack of consistentcy cannot be addressed without refactoring the API. system_unbound_wq should be the default workqueue so as not to enforce locality constraints for random work whenever it's not required. Adding system_dfl_wq to encourage its use when unbound work should be used. queue_work() / queue_delayed_work() / mod_delayed_work() will now use the new unbound wq: whether the user still use the old wq a warn will be printed along with a wq redirect to the new one. The old system_unbound_wq will be kept for a few release cycles. Suggested-by: Tejun Heo Signed-off-by: Marco Crivellari --- drivers/net/ethernet/sfc/efx_channels.c | 2 +- drivers/net/ethernet/sfc/siena/efx_channels.c | 2 +- drivers/net/phy/sfp.c | 12 ++++++------ drivers/net/wireless/intel/ipw2x00/ipw2100.c | 6 +++--- drivers/net/wireless/intel/ipw2x00/ipw2200.c | 2 +- drivers/net/wireless/intel/iwlwifi/mvm/tdls.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt7921/init.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7925/init.c | 2 +- net/bridge/br_cfm.c | 6 +++--- net/bridge/br_mrp.c | 8 ++++---- net/ceph/mon_client.c | 2 +- net/core/skmsg.c | 2 +- net/devlink/core.c | 2 +- net/ipv4/inet_fragment.c | 2 +- net/netfilter/nf_conntrack_ecache.c | 2 +- net/openvswitch/dp_notify.c | 2 +- net/rfkill/input.c | 2 +- net/smc/smc_core.c | 2 +- net/vmw_vsock/af_vsock.c | 2 +- 19 files changed, 33 insertions(+), 33 deletions(-) diff --git a/drivers/net/ethernet/sfc/efx_channels.c b/drivers/net/ethernet= /sfc/efx_channels.c index 06b4f52713ef..4fba49d4f36c 100644 --- a/drivers/net/ethernet/sfc/efx_channels.c +++ b/drivers/net/ethernet/sfc/efx_channels.c @@ -1281,7 +1281,7 @@ static int efx_poll(struct napi_struct *napi, int bud= get) time =3D jiffies - channel->rfs_last_expiry; /* Would our quota be >=3D 20? */ if (channel->rfs_filter_count * time >=3D 600 * HZ) - mod_delayed_work(system_wq, &channel->filter_work, 0); + mod_delayed_work(system_percpu_wq, &channel->filter_work, 0); #endif =20 /* There is no race here; although napi_disable() will diff --git a/drivers/net/ethernet/sfc/siena/efx_channels.c b/drivers/net/et= hernet/sfc/siena/efx_channels.c index d120b3c83ac0..2039083205bb 100644 --- a/drivers/net/ethernet/sfc/siena/efx_channels.c +++ b/drivers/net/ethernet/sfc/siena/efx_channels.c @@ -1300,7 +1300,7 @@ static int efx_poll(struct napi_struct *napi, int bud= get) time =3D jiffies - channel->rfs_last_expiry; /* Would our quota be >=3D 20? */ if (channel->rfs_filter_count * time >=3D 600 * HZ) - mod_delayed_work(system_wq, &channel->filter_work, 0); + mod_delayed_work(system_percpu_wq, &channel->filter_work, 0); #endif =20 /* There is no race here; although napi_disable() will diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c index 347c1e0e94d9..19fcff02db51 100644 --- a/drivers/net/phy/sfp.c +++ b/drivers/net/phy/sfp.c @@ -890,7 +890,7 @@ static void sfp_soft_start_poll(struct sfp *sfp) =20 if (sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT) && !sfp->need_poll) - mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); + mod_delayed_work(system_percpu_wq, &sfp->poll, poll_jiffies); mutex_unlock(&sfp->st_mutex); } =20 @@ -1661,7 +1661,7 @@ static void sfp_hwmon_probe(struct work_struct *work) err =3D sfp_read(sfp, true, 0, &sfp->diag, sizeof(sfp->diag)); if (err < 0) { if (sfp->hwmon_tries--) { - mod_delayed_work(system_wq, &sfp->hwmon_probe, + mod_delayed_work(system_percpu_wq, &sfp->hwmon_probe, T_PROBE_RETRY_SLOW); } else { dev_warn(sfp->dev, "hwmon probe failed: %pe\n", @@ -1688,7 +1688,7 @@ static void sfp_hwmon_probe(struct work_struct *work) static int sfp_hwmon_insert(struct sfp *sfp) { if (sfp->have_a2 && sfp->id.ext.diagmon & SFP_DIAGMON_DDM) { - mod_delayed_work(system_wq, &sfp->hwmon_probe, 1); + mod_delayed_work(system_percpu_wq, &sfp->hwmon_probe, 1); sfp->hwmon_tries =3D R_PROBE_RETRY_SLOW; } =20 @@ -2542,7 +2542,7 @@ static void sfp_sm_module(struct sfp *sfp, unsigned i= nt event) /* Force a poll to re-read the hardware signal state after * sfp_sm_mod_probe() changed state_hw_mask. */ - mod_delayed_work(system_wq, &sfp->poll, 1); + mod_delayed_work(system_percpu_wq, &sfp->poll, 1); =20 err =3D sfp_hwmon_insert(sfp); if (err) @@ -2987,7 +2987,7 @@ static void sfp_poll(struct work_struct *work) // it's unimportant if we race while reading this. if (sfp->state_soft_mask & (SFP_F_LOS | SFP_F_TX_FAULT) || sfp->need_poll) - mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); + mod_delayed_work(system_percpu_wq, &sfp->poll, poll_jiffies); } =20 static struct sfp *sfp_alloc(struct device *dev) @@ -3157,7 +3157,7 @@ static int sfp_probe(struct platform_device *pdev) } =20 if (sfp->need_poll) - mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); + mod_delayed_work(system_percpu_wq, &sfp->poll, poll_jiffies); =20 /* We could have an issue in cases no Tx disable pin is available or * wired as modules using a laser as their light source will continue to diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2100.c b/drivers/net/wir= eless/intel/ipw2x00/ipw2100.c index 215814861cbd..c7c5bc0f1650 100644 --- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c @@ -2143,7 +2143,7 @@ static void isr_indicate_rf_kill(struct ipw2100_priv = *priv, u32 status) =20 /* Make sure the RF Kill check timer is running */ priv->stop_rf_kill =3D 0; - mod_delayed_work(system_wq, &priv->rf_kill, round_jiffies_relative(HZ)); + mod_delayed_work(system_percpu_wq, &priv->rf_kill, round_jiffies_relative= (HZ)); } =20 static void ipw2100_scan_event(struct work_struct *work) @@ -2170,7 +2170,7 @@ static void isr_scan_complete(struct ipw2100_priv *pr= iv, u32 status) round_jiffies_relative(msecs_to_jiffies(4000))); } else { priv->user_requested_scan =3D 0; - mod_delayed_work(system_wq, &priv->scan_event, 0); + mod_delayed_work(system_percpu_wq, &priv->scan_event, 0); } } =20 @@ -4252,7 +4252,7 @@ static int ipw_radio_kill_sw(struct ipw2100_priv *pri= v, int disable_radio) "disabled by HW switch\n"); /* Make sure the RF_KILL check timer is running */ priv->stop_rf_kill =3D 0; - mod_delayed_work(system_wq, &priv->rf_kill, + mod_delayed_work(system_percpu_wq, &priv->rf_kill, round_jiffies_relative(HZ)); } else schedule_reset(priv); diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2200.c b/drivers/net/wir= eless/intel/ipw2x00/ipw2200.c index 24a5624ef207..09035a77e775 100644 --- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c @@ -4415,7 +4415,7 @@ static void handle_scan_event(struct ipw_priv *priv) round_jiffies_relative(msecs_to_jiffies(4000))); } else { priv->user_requested_scan =3D 0; - mod_delayed_work(system_wq, &priv->scan_event, 0); + mod_delayed_work(system_percpu_wq, &priv->scan_event, 0); } } =20 diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c b/drivers/net/wi= reless/intel/iwlwifi/mvm/tdls.c index 36379b738de1..0df31639fa5e 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c @@ -234,7 +234,7 @@ void iwl_mvm_rx_tdls_notif(struct iwl_mvm *mvm, struct = iwl_rx_cmd_buffer *rxb) * Also convert TU to msec. */ delay =3D TU_TO_MS(vif->bss_conf.dtim_period * vif->bss_conf.beacon_int); - mod_delayed_work(system_wq, &mvm->tdls_cs.dwork, + mod_delayed_work(system_percpu_wq, &mvm->tdls_cs.dwork, msecs_to_jiffies(delay)); =20 iwl_mvm_tdls_update_cs_state(mvm, IWL_MVM_TDLS_SW_ACTIVE); @@ -548,7 +548,7 @@ iwl_mvm_tdls_channel_switch(struct ieee80211_hw *hw, */ delay =3D 2 * TU_TO_MS(vif->bss_conf.dtim_period * vif->bss_conf.beacon_int); - mod_delayed_work(system_wq, &mvm->tdls_cs.dwork, + mod_delayed_work(system_percpu_wq, &mvm->tdls_cs.dwork, msecs_to_jiffies(delay)); return 0; } @@ -659,6 +659,6 @@ iwl_mvm_tdls_recv_channel_switch(struct ieee80211_hw *h= w, /* register a timeout in case we don't succeed in switching */ delay =3D vif->bss_conf.dtim_period * vif->bss_conf.beacon_int * 1024 / 1000; - mod_delayed_work(system_wq, &mvm->tdls_cs.dwork, + mod_delayed_work(system_percpu_wq, &mvm->tdls_cs.dwork, msecs_to_jiffies(delay)); } diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net= /wireless/mediatek/mt76/mt7921/init.c index 14e17dc90256..cb97f69a9149 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c @@ -341,7 +341,7 @@ int mt7921_register_device(struct mt792x_dev *dev) dev->mphy.hw->wiphy->available_antennas_rx =3D dev->mphy.chainmask; dev->mphy.hw->wiphy->available_antennas_tx =3D dev->mphy.chainmask; =20 - queue_work(system_wq, &dev->init_work); + queue_work(system_percpu_wq, &dev->init_work); =20 return 0; } diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/init.c b/drivers/net= /wireless/mediatek/mt76/mt7925/init.c index 63cb08f4d87c..090ecd1f2a0a 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/init.c @@ -410,7 +410,7 @@ int mt7925_register_device(struct mt792x_dev *dev) dev->mphy.hw->wiphy->available_antennas_rx =3D dev->mphy.chainmask; dev->mphy.hw->wiphy->available_antennas_tx =3D dev->mphy.chainmask; =20 - queue_work(system_wq, &dev->init_work); + queue_work(system_percpu_wq, &dev->init_work); =20 return 0; } diff --git a/net/bridge/br_cfm.c b/net/bridge/br_cfm.c index a3c755d0a09d..c2c1c7d44c61 100644 --- a/net/bridge/br_cfm.c +++ b/net/bridge/br_cfm.c @@ -134,7 +134,7 @@ static void ccm_rx_timer_start(struct br_cfm_peer_mep *= peer_mep) * of the configured CC 'expected_interval' * in order to detect CCM defect after 3.25 interval. */ - queue_delayed_work(system_wq, &peer_mep->ccm_rx_dwork, + queue_delayed_work(system_percpu_wq, &peer_mep->ccm_rx_dwork, usecs_to_jiffies(interval_us / 4)); } =20 @@ -285,7 +285,7 @@ static void ccm_tx_work_expired(struct work_struct *wor= k) ccm_frame_tx(skb); =20 interval_us =3D interval_to_us(mep->cc_config.exp_interval); - queue_delayed_work(system_wq, &mep->ccm_tx_dwork, + queue_delayed_work(system_percpu_wq, &mep->ccm_tx_dwork, usecs_to_jiffies(interval_us)); } =20 @@ -809,7 +809,7 @@ int br_cfm_cc_ccm_tx(struct net_bridge *br, const u32 i= nstance, * to send first frame immediately */ mep->ccm_tx_end =3D jiffies + usecs_to_jiffies(tx_info->period * 1000000); - queue_delayed_work(system_wq, &mep->ccm_tx_dwork, 0); + queue_delayed_work(system_percpu_wq, &mep->ccm_tx_dwork, 0); =20 save: mep->cc_ccm_tx_info =3D *tx_info; diff --git a/net/bridge/br_mrp.c b/net/bridge/br_mrp.c index fd2de35ffb3c..3c36fa24bc05 100644 --- a/net/bridge/br_mrp.c +++ b/net/bridge/br_mrp.c @@ -341,7 +341,7 @@ static void br_mrp_test_work_expired(struct work_struct= *work) out: rcu_read_unlock(); =20 - queue_delayed_work(system_wq, &mrp->test_work, + queue_delayed_work(system_percpu_wq, &mrp->test_work, usecs_to_jiffies(mrp->test_interval)); } =20 @@ -418,7 +418,7 @@ static void br_mrp_in_test_work_expired(struct work_str= uct *work) out: rcu_read_unlock(); =20 - queue_delayed_work(system_wq, &mrp->in_test_work, + queue_delayed_work(system_percpu_wq, &mrp->in_test_work, usecs_to_jiffies(mrp->in_test_interval)); } =20 @@ -725,7 +725,7 @@ int br_mrp_start_test(struct net_bridge *br, mrp->test_max_miss =3D test->max_miss; mrp->test_monitor =3D test->monitor; mrp->test_count_miss =3D 0; - queue_delayed_work(system_wq, &mrp->test_work, + queue_delayed_work(system_percpu_wq, &mrp->test_work, usecs_to_jiffies(test->interval)); =20 return 0; @@ -865,7 +865,7 @@ int br_mrp_start_in_test(struct net_bridge *br, mrp->in_test_end =3D jiffies + usecs_to_jiffies(in_test->period); mrp->in_test_max_miss =3D in_test->max_miss; mrp->in_test_count_miss =3D 0; - queue_delayed_work(system_wq, &mrp->in_test_work, + queue_delayed_work(system_percpu_wq, &mrp->in_test_work, usecs_to_jiffies(in_test->interval)); =20 return 0; diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index ab66b599ac47..c227ececa925 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c @@ -314,7 +314,7 @@ static void __schedule_delayed(struct ceph_mon_client *= monc) delay =3D CEPH_MONC_PING_INTERVAL; =20 dout("__schedule_delayed after %lu\n", delay); - mod_delayed_work(system_wq, &monc->delayed_work, + mod_delayed_work(system_percpu_wq, &monc->delayed_work, round_jiffies_relative(delay)); } =20 diff --git a/net/core/skmsg.c b/net/core/skmsg.c index 0ddc4c718833..83fc433f5461 100644 --- a/net/core/skmsg.c +++ b/net/core/skmsg.c @@ -855,7 +855,7 @@ void sk_psock_drop(struct sock *sk, struct sk_psock *ps= ock) sk_psock_stop(psock); =20 INIT_RCU_WORK(&psock->rwork, sk_psock_destroy); - queue_rcu_work(system_wq, &psock->rwork); + queue_rcu_work(system_percpu_wq, &psock->rwork); } EXPORT_SYMBOL_GPL(sk_psock_drop); =20 diff --git a/net/devlink/core.c b/net/devlink/core.c index 7203c39532fc..58093f49c090 100644 --- a/net/devlink/core.c +++ b/net/devlink/core.c @@ -320,7 +320,7 @@ static void devlink_release(struct work_struct *work) void devlink_put(struct devlink *devlink) { if (refcount_dec_and_test(&devlink->refcount)) - queue_rcu_work(system_wq, &devlink->rwork); + queue_rcu_work(system_percpu_wq, &devlink->rwork); } =20 struct devlink *devlinks_xa_find_get(struct net *net, unsigned long *index= p) diff --git a/net/ipv4/inet_fragment.c b/net/ipv4/inet_fragment.c index 470ab17ceb51..025895eb6ec5 100644 --- a/net/ipv4/inet_fragment.c +++ b/net/ipv4/inet_fragment.c @@ -183,7 +183,7 @@ static void fqdir_work_fn(struct work_struct *work) rhashtable_free_and_destroy(&fqdir->rhashtable, inet_frags_free_cb, NULL); =20 if (llist_add(&fqdir->free_list, &fqdir_free_list)) - queue_delayed_work(system_wq, &fqdir_free_work, HZ); + queue_delayed_work(system_percpu_wq, &fqdir_free_work, HZ); } =20 int fqdir_init(struct fqdir **fqdirp, struct inet_frags *f, struct net *ne= t) diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntra= ck_ecache.c index af68c64acaab..81baf2082604 100644 --- a/net/netfilter/nf_conntrack_ecache.c +++ b/net/netfilter/nf_conntrack_ecache.c @@ -301,7 +301,7 @@ void nf_conntrack_ecache_work(struct net *net, enum nf_= ct_ecache_state state) net->ct.ecache_dwork_pending =3D true; } else if (state =3D=3D NFCT_ECACHE_DESTROY_SENT) { if (!hlist_nulls_empty(&cnet->ecache.dying_list)) - mod_delayed_work(system_wq, &cnet->ecache.dwork, 0); + mod_delayed_work(system_percpu_wq, &cnet->ecache.dwork, 0); else net->ct.ecache_dwork_pending =3D false; } diff --git a/net/openvswitch/dp_notify.c b/net/openvswitch/dp_notify.c index 7af0cde8b293..a2af90ee99af 100644 --- a/net/openvswitch/dp_notify.c +++ b/net/openvswitch/dp_notify.c @@ -75,7 +75,7 @@ static int dp_device_event(struct notifier_block *unused,= unsigned long event, =20 /* schedule vport destroy, dev_put and genl notification */ ovs_net =3D net_generic(dev_net(dev), ovs_net_id); - queue_work(system_wq, &ovs_net->dp_notify_work); + queue_work(system_percpu_wq, &ovs_net->dp_notify_work); } =20 return NOTIFY_DONE; diff --git a/net/rfkill/input.c b/net/rfkill/input.c index 598d0a61bda7..53d286b10843 100644 --- a/net/rfkill/input.c +++ b/net/rfkill/input.c @@ -159,7 +159,7 @@ static void rfkill_schedule_global_op(enum rfkill_sched= _op op) rfkill_op_pending =3D true; if (op =3D=3D RFKILL_GLOBAL_OP_EPO && !rfkill_is_epo_lock_active()) { /* bypass the limiter for EPO */ - mod_delayed_work(system_wq, &rfkill_op_work, 0); + mod_delayed_work(system_percpu_wq, &rfkill_op_work, 0); rfkill_last_scheduled =3D jiffies; } else rfkill_schedule_ratelimited(); diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c index ac07b963aede..ab870109f916 100644 --- a/net/smc/smc_core.c +++ b/net/smc/smc_core.c @@ -85,7 +85,7 @@ static void smc_lgr_schedule_free_work(struct smc_link_gr= oup *lgr) * otherwise there is a risk of out-of-sync link groups. */ if (!lgr->freeing) { - mod_delayed_work(system_wq, &lgr->free_work, + mod_delayed_work(system_percpu_wq, &lgr->free_work, (!lgr->is_smcd && lgr->role =3D=3D SMC_CLNT) ? SMC_LGR_FREE_DELAY_CLNT : SMC_LGR_FREE_DELAY_SERV); diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index fc6afbc8d680..f8798d7b5de7 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1569,7 +1569,7 @@ static int vsock_connect(struct socket *sock, struct = sockaddr *addr, * reschedule it, then ungrab the socket refcount to * keep it balanced. */ - if (mod_delayed_work(system_wq, &vsk->connect_work, + if (mod_delayed_work(system_percpu_wq, &vsk->connect_work, timeout)) sock_put(sk); =20 --=20 2.51.0 From nobody Tue Sep 9 21:32:28 2025 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (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 130863090C2 for ; Fri, 5 Sep 2025 09:05:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757063121; cv=none; b=pg1P0SEoLhl+XmoAy7GWKg2brc6iHw+a5De/UlF7eSV7mRQcdVFSBtyfOl2te/w1aHzNGH4iSYUY7s+7Vj3n6KjvysujrV3hLAxz+1hRMMDKEPpI1PrfYVx88rA0XC0wRjSAscYa9Is6pCSFaZ2RGYsJa/rliomx+ox+0iKQp2I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757063121; c=relaxed/simple; bh=Eg4vUz0AEB2ThcG9sDbzBoDB58WwT1OV2/v2U7m7WbI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cjF5t0ojs4Hx0d/xd0DDogm9BS2SmkOlTvXeZELRQAff9wznrY57yjNPjPSPW1d1A+87iHzpgIUGFmvOFLXKX/gW/l/6Qt7etsFuDIj+l9kWw0mZ3/nf7uq3hq80gjwS8kowYb+unnN6LsdEXKh8dbz5LC/ynSAwP82DtQ/eGfI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=PqTYduvE; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="PqTYduvE" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-3db9641b725so1801446f8f.2 for ; Fri, 05 Sep 2025 02:05:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1757063116; x=1757667916; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xE89YPIL59Df61LriY9rimmOpYAGqRHRHwVw8wDJUrA=; b=PqTYduvEPSE3VdDgnPfUKKSvmYGYhKpom2cxIltT5L05vPDUED4FyCKAwEcv54bL6Z wJVx6vFVCpUWmWmecCtwGuBKQi+YF6lK8xPLOv3rAVPLXrTVxPiG4hG3McdEIVvdHdoM wOdSJcJ/FZlPM7jRsSmt/gUVHJ4bAk8fNV2hQHQGt2SFPRLsQBn1vNVSyXcK8TBi9JEW Ugva28EAPnfTA4QkhUI4JOabsSA/dLN/EKPQwcuULh8tnWoe7AHT/gsawTCdqt9mwpO3 EjqJ1BX204+XdR7Oz7KL/yl4MqxijhB3w3LP6F0iYYwZ3CcHWFVb18TORHCLqxR4KDO/ QJmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757063116; x=1757667916; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xE89YPIL59Df61LriY9rimmOpYAGqRHRHwVw8wDJUrA=; b=PqWlsFgQBZAjkaN2n791KlXkss3ss3oD0dSAWHakuKDiyWsek3ahNHZ6QuZpzWh7l/ sTIv/Es+OsyTvUCXUnGVNd/wccmjd4qo/XP9jqeOJ9HZsenxOr3JWHnFGsTmG1foD1+M 9AHMTWeAs7n7Nyz0pgANpqJFM02/2T7qFumpFAVEm8Hdr3r47Bc0H4etntGYRega9xwe i1+EiUBglkoCbtopatMynPRFetynTnhei3DrahV5sVSu/QLZbd+3bVVvqWjaHfOUwi2o s/AaAmaYoDg839j8rx6HkrSQm5uoFVK3C5ARP4D8fR6tTjS3K4qHTWMcvhT+0Fx7uEvU AFQg== X-Gm-Message-State: AOJu0Yz19KGJFxOzNcOTbttAoKI3TvpD4w/e9fROR0mGWeRMBTpibN/x D8s1dwyn5yTKy4rGhNSzsIkAD3zeXvMG5h3XueoHDfE9lkpLppjnQyL4s0MLgByYtGqXoZTIx/6 whi0c X-Gm-Gg: ASbGncs9/hmQykCPVFC6szTwer7mu/AutaVAEt69RWNBEkDshZroiOS07SKFEUdwNE2 uh4yl05lCdLMB9dZErBrKeF3QUOuoT9QdLFiIEyITm95dMBnr9IcUEjHU8NORwcm4dNPgTbYkz9 TLCotIAXTKQT/YgZZa7dsGW9A1yis7kdaud3k3R111Qtnwujq2JBJpUta2nlJK7EkFbpCYIWgTL vvSI6vlMY0RCmEKv0B1mT7ZJqc9lGlv7rOh7XNusBvkG/8zC6rsJn+6wgXn22aggS5B9X5r3jxP yDr8owj+/pXOPB/B6XQOjED7r+Ukz/KK2oStCYqirrimWnoWp6AM7Aj/mtKS5R+7ZJaOuKOjP6e 9Iz/WsZ0Cy37QCOMRlgX+99FJTgTZcNwN2tNqE6J16yOObic= X-Google-Smtp-Source: AGHT+IFeAJHgY/j+Fez17CQfHLYhf0FQG7BF961z8l1+YAbJSr7p5+xWCv2D/EY5UKln3h660s1nqg== X-Received: by 2002:a05:6000:288a:b0:3e3:5166:e098 with SMTP id ffacd0b85a97d-3e35166e4e7mr1043659f8f.17.1757063115711; Fri, 05 Sep 2025 02:05:15 -0700 (PDT) Received: from localhost.localdomain ([2a00:6d43:105:c401:e307:1a37:2e76:ce91]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45dd07480d5sm34118215e9.8.2025.09.05.02.05.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Sep 2025 02:05:15 -0700 (PDT) From: Marco Crivellari To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org Cc: Tejun Heo , Lai Jiangshan , Frederic Weisbecker , Sebastian Andrzej Siewior , Marco Crivellari , Michal Hocko , "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Subject: [PATCH net-next 3/3] net: WQ_PERCPU added to alloc_workqueue users Date: Fri, 5 Sep 2025 11:05:05 +0200 Message-ID: <20250905090505.104882-4-marco.crivellari@suse.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250905090505.104882-1-marco.crivellari@suse.com> References: <20250905090505.104882-1-marco.crivellari@suse.com> 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 Currently if a user enqueue a work item using schedule_delayed_work() the used wq is "system_wq" (per-cpu wq) while queue_delayed_work() use WORK_CPU_UNBOUND (used when a cpu is not specified). The same applies to schedule_work() that is using system_wq and queue_work(), that makes use again of WORK_CPU_UNBOUND. This lack of consistentcy cannot be addressed without refactoring the API. alloc_workqueue() treats all queues as per-CPU by default, while unbound workqueues must opt-in via WQ_UNBOUND. This default is suboptimal: most workloads benefit from unbound queues, allowing the scheduler to place worker threads where they=E2=80=99re needed= and reducing noise when CPUs are isolated. This patch adds a new WQ_PERCPU flag at the network subsystem, to explicitly request the use of the per-CPU behavior. Both flags coexist for one release cycle to allow callers to transition their calls. Once migration is complete, WQ_UNBOUND can be removed and unbound will become the implicit default. With the introduction of the WQ_PERCPU flag (equivalent to !WQ_UNBOUND), any alloc_workqueue() caller that doesn=E2=80=99t explicitly specify WQ_UNB= OUND must now use WQ_PERCPU. All existing users have been updated accordingly. Suggested-by: Tejun Heo Signed-off-by: Marco Crivellari Reviewed-by: Bobby Eshleman --- drivers/net/can/spi/hi311x.c | 3 ++- drivers/net/can/spi/mcp251x.c | 3 ++- drivers/net/ethernet/cavium/liquidio/lio_core.c | 2 +- drivers/net/ethernet/cavium/liquidio/lio_main.c | 8 +++++--- drivers/net/ethernet/cavium/liquidio/lio_vf_main.c | 3 ++- drivers/net/ethernet/cavium/liquidio/request_manager.c | 2 +- drivers/net/ethernet/cavium/liquidio/response_manager.c | 3 ++- drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 2 +- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 3 ++- drivers/net/ethernet/intel/fm10k/fm10k_main.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- drivers/net/ethernet/marvell/octeontx2/af/cgx.c | 2 +- drivers/net/ethernet/marvell/octeontx2/af/mcs_rvu_if.c | 2 +- drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c | 2 +- drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c | 2 +- drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c | 3 ++- drivers/net/ethernet/marvell/prestera/prestera_main.c | 2 +- drivers/net/ethernet/marvell/prestera/prestera_pci.c | 2 +- drivers/net/ethernet/mellanox/mlxsw/core.c | 4 ++-- drivers/net/ethernet/netronome/nfp/nfp_main.c | 2 +- drivers/net/ethernet/qlogic/qed/qed_main.c | 3 ++- drivers/net/ethernet/wiznet/w5100.c | 2 +- drivers/net/fjes/fjes_main.c | 5 +++-- drivers/net/wireguard/device.c | 6 ++++-- drivers/net/wireless/ath/ath6kl/usb.c | 2 +- drivers/net/wireless/marvell/libertas/if_sdio.c | 3 ++- drivers/net/wireless/marvell/libertas/if_spi.c | 3 ++- drivers/net/wireless/marvell/libertas_tf/main.c | 2 +- drivers/net/wireless/quantenna/qtnfmac/core.c | 3 ++- drivers/net/wireless/realtek/rtlwifi/base.c | 2 +- drivers/net/wireless/realtek/rtw88/usb.c | 3 ++- drivers/net/wireless/silabs/wfx/main.c | 2 +- drivers/net/wireless/st/cw1200/bh.c | 4 ++-- drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c | 3 ++- drivers/net/wwan/wwan_hwsim.c | 2 +- net/ceph/messenger.c | 3 ++- net/core/sock_diag.c | 2 +- net/rds/ib_rdma.c | 3 ++- net/rxrpc/rxperf.c | 2 +- net/smc/af_smc.c | 6 +++--- net/smc/smc_core.c | 2 +- net/tls/tls_device.c | 2 +- net/vmw_vsock/virtio_transport.c | 2 +- net/vmw_vsock/vsock_loopback.c | 2 +- 44 files changed, 71 insertions(+), 52 deletions(-) diff --git a/drivers/net/can/spi/hi311x.c b/drivers/net/can/spi/hi311x.c index 09ae218315d7..96f23311b4ee 100644 --- a/drivers/net/can/spi/hi311x.c +++ b/drivers/net/can/spi/hi311x.c @@ -770,7 +770,8 @@ static int hi3110_open(struct net_device *net) goto out_close; } =20 - priv->wq =3D alloc_workqueue("hi3110_wq", WQ_FREEZABLE | WQ_MEM_RECLAIM, + priv->wq =3D alloc_workqueue("hi3110_wq", + WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!priv->wq) { ret =3D -ENOMEM; diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c index ec5c64006a16..ec8c9193c4e4 100644 --- a/drivers/net/can/spi/mcp251x.c +++ b/drivers/net/can/spi/mcp251x.c @@ -1365,7 +1365,8 @@ static int mcp251x_can_probe(struct spi_device *spi) if (ret) goto out_clk; =20 - priv->wq =3D alloc_workqueue("mcp251x_wq", WQ_FREEZABLE | WQ_MEM_RECLAIM, + priv->wq =3D alloc_workqueue("mcp251x_wq", + WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!priv->wq) { ret =3D -ENOMEM; diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/= ethernet/cavium/liquidio/lio_core.c index 674c54831875..215dac201b4a 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -472,7 +472,7 @@ int setup_rx_oom_poll_fn(struct net_device *netdev) q_no =3D lio->linfo.rxpciq[q].s.q_no; wq =3D &lio->rxq_status_wq[q_no]; wq->wq =3D alloc_workqueue("rxq-oom-status", - WQ_MEM_RECLAIM, 0); + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!wq->wq) { dev_err(&oct->pci_dev->dev, "unable to create cavium rxq oom status wq\= n"); return -ENOMEM; diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/= ethernet/cavium/liquidio/lio_main.c index 1d79f6eaa41f..8e2fcec26ea1 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c @@ -526,7 +526,8 @@ static inline int setup_link_status_change_wq(struct ne= t_device *netdev) struct octeon_device *oct =3D lio->oct_dev; =20 lio->link_status_wq.wq =3D alloc_workqueue("link-status", - WQ_MEM_RECLAIM, 0); + WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!lio->link_status_wq.wq) { dev_err(&oct->pci_dev->dev, "unable to create cavium link status wq\n"); return -1; @@ -659,7 +660,8 @@ static inline int setup_sync_octeon_time_wq(struct net_= device *netdev) struct octeon_device *oct =3D lio->oct_dev; =20 lio->sync_octeon_time_wq.wq =3D - alloc_workqueue("update-octeon-time", WQ_MEM_RECLAIM, 0); + alloc_workqueue("update-octeon-time", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!lio->sync_octeon_time_wq.wq) { dev_err(&oct->pci_dev->dev, "Unable to create wq to update octeon time\n= "); return -1; @@ -1734,7 +1736,7 @@ static inline int setup_tx_poll_fn(struct net_device = *netdev) struct octeon_device *oct =3D lio->oct_dev; =20 lio->txq_status_wq.wq =3D alloc_workqueue("txq-status", - WQ_MEM_RECLAIM, 0); + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!lio->txq_status_wq.wq) { dev_err(&oct->pci_dev->dev, "unable to create cavium txq status wq\n"); return -1; diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/n= et/ethernet/cavium/liquidio/lio_vf_main.c index 62c2eadc33e3..3230dff5ba05 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c @@ -304,7 +304,8 @@ static int setup_link_status_change_wq(struct net_devic= e *netdev) struct octeon_device *oct =3D lio->oct_dev; =20 lio->link_status_wq.wq =3D alloc_workqueue("link-status", - WQ_MEM_RECLAIM, 0); + WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!lio->link_status_wq.wq) { dev_err(&oct->pci_dev->dev, "unable to create cavium link status wq\n"); return -1; diff --git a/drivers/net/ethernet/cavium/liquidio/request_manager.c b/drive= rs/net/ethernet/cavium/liquidio/request_manager.c index de8a6ce86ad7..8b8e9953c4ee 100644 --- a/drivers/net/ethernet/cavium/liquidio/request_manager.c +++ b/drivers/net/ethernet/cavium/liquidio/request_manager.c @@ -132,7 +132,7 @@ int octeon_init_instr_queue(struct octeon_device *oct, oct->fn_list.setup_iq_regs(oct, iq_no); =20 oct->check_db_wq[iq_no].wq =3D alloc_workqueue("check_iq_db", - WQ_MEM_RECLAIM, + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!oct->check_db_wq[iq_no].wq) { vfree(iq->request_list); diff --git a/drivers/net/ethernet/cavium/liquidio/response_manager.c b/driv= ers/net/ethernet/cavium/liquidio/response_manager.c index 861050966e18..de1a8335b545 100644 --- a/drivers/net/ethernet/cavium/liquidio/response_manager.c +++ b/drivers/net/ethernet/cavium/liquidio/response_manager.c @@ -39,7 +39,8 @@ int octeon_setup_response_list(struct octeon_device *oct) } spin_lock_init(&oct->cmd_resp_wqlock); =20 - oct->dma_comp_wq.wq =3D alloc_workqueue("dma-comp", WQ_MEM_RECLAIM, 0); + oct->dma_comp_wq.wq =3D alloc_workqueue("dma-comp", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!oct->dma_comp_wq.wq) { dev_err(&oct->pci_dev->dev, "failed to create wq thread\n"); return -ENOMEM; diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net= /ethernet/freescale/dpaa2/dpaa2-eth.c index 29886a8ba73f..c689993a3cb0 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -4844,7 +4844,7 @@ static int dpaa2_eth_probe(struct fsl_mc_device *dpni= _dev) priv->tx_tstamp_type =3D HWTSTAMP_TX_OFF; priv->rx_tstamp =3D false; =20 - priv->dpaa2_ptp_wq =3D alloc_workqueue("dpaa2_ptp_wq", 0, 0); + priv->dpaa2_ptp_wq =3D alloc_workqueue("dpaa2_ptp_wq", WQ_PERCPU, 0); if (!priv->dpaa2_ptp_wq) { err =3D -ENOMEM; goto err_wq_alloc; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/driv= ers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 3e28a08934ab..b3c06bb3d6be 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -12906,7 +12906,8 @@ static int __init hclge_init(void) { pr_info("%s is initializing\n", HCLGE_NAME); =20 - hclge_wq =3D alloc_workqueue("%s", WQ_UNBOUND, 0, HCLGE_NAME); + hclge_wq =3D alloc_workqueue("%s", WQ_UNBOUND, 0, + HCLGE_NAME); if (!hclge_wq) { pr_err("%s: failed to create workqueue\n", HCLGE_NAME); return -ENOMEM; diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/et= hernet/intel/fm10k/fm10k_main.c index 142f07ca8bc0..b8c15b837fda 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c @@ -37,7 +37,7 @@ static int __init fm10k_init_module(void) pr_info("%s\n", fm10k_copyright); =20 /* create driver workqueue */ - fm10k_workqueue =3D alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, + fm10k_workqueue =3D alloc_workqueue("%s", WQ_MEM_RECLAIM | WQ_PERCPU, 0, fm10k_driver_name); if (!fm10k_workqueue) return -ENOMEM; diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethe= rnet/intel/i40e/i40e_main.c index 120d68654e3f..73d9416803f7 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -16690,7 +16690,7 @@ static int __init i40e_init_module(void) * since we need to be able to guarantee forward progress even under * memory pressure. */ - i40e_wq =3D alloc_workqueue("%s", 0, 0, i40e_driver_name); + i40e_wq =3D alloc_workqueue("%s", WQ_PERCPU, 0, i40e_driver_name); if (!i40e_wq) { pr_err("%s: Failed to create workqueue\n", i40e_driver_name); return -ENOMEM; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/= ethernet/marvell/octeontx2/af/cgx.c index 0b27a695008b..524ff869a91b 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c @@ -1955,7 +1955,7 @@ static int cgx_probe(struct pci_dev *pdev, const stru= ct pci_device_id *id) =20 /* init wq for processing linkup requests */ INIT_WORK(&cgx->cgx_cmd_work, cgx_lmac_linkup_work); - cgx->cgx_cmd_workq =3D alloc_workqueue("cgx_cmd_workq", 0, 0); + cgx->cgx_cmd_workq =3D alloc_workqueue("cgx_cmd_workq", WQ_PERCPU, 0); if (!cgx->cgx_cmd_workq) { dev_err(dev, "alloc workqueue failed for cgx cmd"); err =3D -ENOMEM; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/mcs_rvu_if.c b/drive= rs/net/ethernet/marvell/octeontx2/af/mcs_rvu_if.c index 655dd4726d36..2b0cf25ba517 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/mcs_rvu_if.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/mcs_rvu_if.c @@ -911,7 +911,7 @@ int rvu_mcs_init(struct rvu *rvu) /* Initialize the wq for handling mcs interrupts */ INIT_LIST_HEAD(&rvu->mcs_intrq_head); INIT_WORK(&rvu->mcs_intr_work, mcs_intr_handler_task); - rvu->mcs_intr_wq =3D alloc_workqueue("mcs_intr_wq", 0, 0); + rvu->mcs_intr_wq =3D alloc_workqueue("mcs_intr_wq", WQ_PERCPU, 0); if (!rvu->mcs_intr_wq) { dev_err(rvu->dev, "mcs alloc workqueue failed\n"); return -ENOMEM; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c b/drivers/= net/ethernet/marvell/octeontx2/af/rvu_cgx.c index 992fa0b82e8d..ddae82ee8ccc 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c @@ -313,7 +313,7 @@ static int cgx_lmac_event_handler_init(struct rvu *rvu) spin_lock_init(&rvu->cgx_evq_lock); INIT_LIST_HEAD(&rvu->cgx_evq_head); INIT_WORK(&rvu->cgx_evh_work, cgx_evhandler_task); - rvu->cgx_evh_wq =3D alloc_workqueue("rvu_evh_wq", 0, 0); + rvu->cgx_evh_wq =3D alloc_workqueue("rvu_evh_wq", WQ_PERCPU, 0); if (!rvu->cgx_evh_wq) { dev_err(rvu->dev, "alloc workqueue failed"); return -ENOMEM; diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c b/drivers/= net/ethernet/marvell/octeontx2/af/rvu_rep.c index 052ae5923e3a..258557978ab2 100644 --- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c +++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c @@ -375,7 +375,7 @@ int rvu_rep_install_mcam_rules(struct rvu *rvu) spin_lock_init(&rvu->rep_evtq_lock); INIT_LIST_HEAD(&rvu->rep_evtq_head); INIT_WORK(&rvu->rep_evt_work, rvu_rep_wq_handler); - rvu->rep_evt_wq =3D alloc_workqueue("rep_evt_wq", 0, 0); + rvu->rep_evt_wq =3D alloc_workqueue("rep_evt_wq", WQ_PERCPU, 0); if (!rvu->rep_evt_wq) { dev_err(rvu->dev, "REP workqueue allocation failed\n"); return -ENOMEM; diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c b/dri= vers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c index fc59e50bafce..0fdc12b345be 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/cn10k_ipsec.c @@ -798,7 +798,8 @@ int cn10k_ipsec_init(struct net_device *netdev) pf->ipsec.sa_size =3D sa_size; =20 INIT_WORK(&pf->ipsec.sa_work, cn10k_ipsec_sa_wq_handler); - pf->ipsec.sa_workq =3D alloc_workqueue("cn10k_ipsec_sa_workq", 0, 0); + pf->ipsec.sa_workq =3D alloc_workqueue("cn10k_ipsec_sa_workq", + WQ_PERCPU, 0); if (!pf->ipsec.sa_workq) { netdev_err(pf->netdev, "SA alloc workqueue failed\n"); return -ENOMEM; diff --git a/drivers/net/ethernet/marvell/prestera/prestera_main.c b/driver= s/net/ethernet/marvell/prestera/prestera_main.c index 71ffb55d1fc4..65e7ef033bde 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_main.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_main.c @@ -1500,7 +1500,7 @@ EXPORT_SYMBOL(prestera_device_unregister); =20 static int __init prestera_module_init(void) { - prestera_wq =3D alloc_workqueue("prestera", 0, 0); + prestera_wq =3D alloc_workqueue("prestera", WQ_PERCPU, 0); if (!prestera_wq) return -ENOMEM; =20 diff --git a/drivers/net/ethernet/marvell/prestera/prestera_pci.c b/drivers= /net/ethernet/marvell/prestera/prestera_pci.c index 35857dc19542..982a477ebb7f 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_pci.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_pci.c @@ -898,7 +898,7 @@ static int prestera_pci_probe(struct pci_dev *pdev, =20 dev_info(fw->dev.dev, "Prestera FW is ready\n"); =20 - fw->wq =3D alloc_workqueue("prestera_fw_wq", WQ_HIGHPRI, 1); + fw->wq =3D alloc_workqueue("prestera_fw_wq", WQ_HIGHPRI | WQ_PERCPU, 1); if (!fw->wq) { err =3D -ENOMEM; goto err_wq_alloc; diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ether= net/mellanox/mlxsw/core.c index 2bb2b77351bd..8a5d47a846c6 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c @@ -886,7 +886,7 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_cor= e) if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX)) return 0; =20 - emad_wq =3D alloc_workqueue("mlxsw_core_emad", 0, 0); + emad_wq =3D alloc_workqueue("mlxsw_core_emad", WQ_PERCPU, 0); if (!emad_wq) return -ENOMEM; mlxsw_core->emad_wq =3D emad_wq; @@ -3381,7 +3381,7 @@ static int __init mlxsw_core_module_init(void) if (err) return err; =20 - mlxsw_wq =3D alloc_workqueue(mlxsw_core_driver_name, 0, 0); + mlxsw_wq =3D alloc_workqueue(mlxsw_core_driver_name, WQ_PERCPU, 0); if (!mlxsw_wq) { err =3D -ENOMEM; goto err_alloc_workqueue; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/et= hernet/netronome/nfp/nfp_main.c index 71301dbd8fb5..48390b2fd44d 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_main.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c @@ -797,7 +797,7 @@ static int nfp_pci_probe(struct pci_dev *pdev, pf->pdev =3D pdev; pf->dev_info =3D dev_info; =20 - pf->wq =3D alloc_workqueue("nfp-%s", 0, 2, pci_name(pdev)); + pf->wq =3D alloc_workqueue("nfp-%s", WQ_PERCPU, 2, pci_name(pdev)); if (!pf->wq) { err =3D -ENOMEM; goto err_pci_priv_unset; diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ether= net/qlogic/qed/qed_main.c index 886061d7351a..d4685ad4b169 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c @@ -1214,7 +1214,8 @@ static int qed_slowpath_wq_start(struct qed_dev *cdev) hwfn =3D &cdev->hwfns[i]; =20 hwfn->slowpath_wq =3D alloc_workqueue("slowpath-%02x:%02x.%02x", - 0, 0, cdev->pdev->bus->number, + WQ_PERCPU, 0, + cdev->pdev->bus->number, PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id); =20 diff --git a/drivers/net/ethernet/wiznet/w5100.c b/drivers/net/ethernet/wiz= net/w5100.c index b77f096eaf99..c5424d882135 100644 --- a/drivers/net/ethernet/wiznet/w5100.c +++ b/drivers/net/ethernet/wiznet/w5100.c @@ -1142,7 +1142,7 @@ int w5100_probe(struct device *dev, const struct w510= 0_ops *ops, if (err < 0) goto err_register; =20 - priv->xfer_wq =3D alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, + priv->xfer_wq =3D alloc_workqueue("%s", WQ_MEM_RECLAIM | WQ_PERCPU, 0, netdev_name(ndev)); if (!priv->xfer_wq) { err =3D -ENOMEM; diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c index 4a4ed2ccf72f..b63965d9a1ba 100644 --- a/drivers/net/fjes/fjes_main.c +++ b/drivers/net/fjes/fjes_main.c @@ -1364,14 +1364,15 @@ static int fjes_probe(struct platform_device *plat_= dev) adapter->force_reset =3D false; adapter->open_guard =3D false; =20 - adapter->txrx_wq =3D alloc_workqueue(DRV_NAME "/txrx", WQ_MEM_RECLAIM, 0); + adapter->txrx_wq =3D alloc_workqueue(DRV_NAME "/txrx", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (unlikely(!adapter->txrx_wq)) { err =3D -ENOMEM; goto err_free_netdev; } =20 adapter->control_wq =3D alloc_workqueue(DRV_NAME "/control", - WQ_MEM_RECLAIM, 0); + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (unlikely(!adapter->control_wq)) { err =3D -ENOMEM; goto err_free_txrx_wq; diff --git a/drivers/net/wireguard/device.c b/drivers/net/wireguard/device.c index 3ffeeba5dccf..f6cc68e433ee 100644 --- a/drivers/net/wireguard/device.c +++ b/drivers/net/wireguard/device.c @@ -333,7 +333,8 @@ static int wg_newlink(struct net_device *dev, goto err_free_peer_hashtable; =20 wg->handshake_receive_wq =3D alloc_workqueue("wg-kex-%s", - WQ_CPU_INTENSIVE | WQ_FREEZABLE, 0, dev->name); + WQ_CPU_INTENSIVE | WQ_FREEZABLE | WQ_PERCPU, 0, + dev->name); if (!wg->handshake_receive_wq) goto err_free_index_hashtable; =20 @@ -343,7 +344,8 @@ static int wg_newlink(struct net_device *dev, goto err_destroy_handshake_receive; =20 wg->packet_crypt_wq =3D alloc_workqueue("wg-crypt-%s", - WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM, 0, dev->name); + WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM | WQ_PERCPU, 0, + dev->name); if (!wg->packet_crypt_wq) goto err_destroy_handshake_send; =20 diff --git a/drivers/net/wireless/ath/ath6kl/usb.c b/drivers/net/wireless/a= th/ath6kl/usb.c index 5220809841a6..e281bfe40fa7 100644 --- a/drivers/net/wireless/ath/ath6kl/usb.c +++ b/drivers/net/wireless/ath/ath6kl/usb.c @@ -637,7 +637,7 @@ static struct ath6kl_usb *ath6kl_usb_create(struct usb_= interface *interface) ar_usb =3D kzalloc(sizeof(struct ath6kl_usb), GFP_KERNEL); if (ar_usb =3D=3D NULL) return NULL; - ar_usb->wq =3D alloc_workqueue("ath6kl_wq", 0, 0); + ar_usb->wq =3D alloc_workqueue("ath6kl_wq", WQ_PERCPU, 0); if (!ar_usb->wq) { kfree(ar_usb); return NULL; diff --git a/drivers/net/wireless/marvell/libertas/if_sdio.c b/drivers/net/= wireless/marvell/libertas/if_sdio.c index 524034699972..1e29e80cad61 100644 --- a/drivers/net/wireless/marvell/libertas/if_sdio.c +++ b/drivers/net/wireless/marvell/libertas/if_sdio.c @@ -1181,7 +1181,8 @@ static int if_sdio_probe(struct sdio_func *func, spin_lock_init(&card->lock); INIT_LIST_HEAD(&card->packets); =20 - card->workqueue =3D alloc_workqueue("libertas_sdio", WQ_MEM_RECLAIM, 0); + card->workqueue =3D alloc_workqueue("libertas_sdio", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (unlikely(!card->workqueue)) { ret =3D -ENOMEM; goto err_queue; diff --git a/drivers/net/wireless/marvell/libertas/if_spi.c b/drivers/net/w= ireless/marvell/libertas/if_spi.c index b722a6587fd3..699bae8971f8 100644 --- a/drivers/net/wireless/marvell/libertas/if_spi.c +++ b/drivers/net/wireless/marvell/libertas/if_spi.c @@ -1153,7 +1153,8 @@ static int if_spi_probe(struct spi_device *spi) priv->fw_ready =3D 1; =20 /* Initialize interrupt handling stuff. */ - card->workqueue =3D alloc_workqueue("libertas_spi", WQ_MEM_RECLAIM, 0); + card->workqueue =3D alloc_workqueue("libertas_spi", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!card->workqueue) { err =3D -ENOMEM; goto remove_card; diff --git a/drivers/net/wireless/marvell/libertas_tf/main.c b/drivers/net/= wireless/marvell/libertas_tf/main.c index a57a11be57d8..1fc4b8c6e079 100644 --- a/drivers/net/wireless/marvell/libertas_tf/main.c +++ b/drivers/net/wireless/marvell/libertas_tf/main.c @@ -708,7 +708,7 @@ EXPORT_SYMBOL_GPL(lbtf_bcn_sent); static int __init lbtf_init_module(void) { lbtf_deb_enter(LBTF_DEB_MAIN); - lbtf_wq =3D alloc_workqueue("libertastf", WQ_MEM_RECLAIM, 0); + lbtf_wq =3D alloc_workqueue("libertastf", WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (lbtf_wq =3D=3D NULL) { printk(KERN_ERR "libertastf: couldn't create workqueue\n"); return -ENOMEM; diff --git a/drivers/net/wireless/quantenna/qtnfmac/core.c b/drivers/net/wi= reless/quantenna/qtnfmac/core.c index 825b05dd3271..38af6cdc2843 100644 --- a/drivers/net/wireless/quantenna/qtnfmac/core.c +++ b/drivers/net/wireless/quantenna/qtnfmac/core.c @@ -714,7 +714,8 @@ int qtnf_core_attach(struct qtnf_bus *bus) goto error; } =20 - bus->hprio_workqueue =3D alloc_workqueue("QTNF_HPRI", WQ_HIGHPRI, 0); + bus->hprio_workqueue =3D alloc_workqueue("QTNF_HPRI", + WQ_HIGHPRI | WQ_PERCPU, 0); if (!bus->hprio_workqueue) { pr_err("failed to alloc high prio workqueue\n"); ret =3D -ENOMEM; diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wire= less/realtek/rtlwifi/base.c index 6189edc1d8d7..30d295f65602 100644 --- a/drivers/net/wireless/realtek/rtlwifi/base.c +++ b/drivers/net/wireless/realtek/rtlwifi/base.c @@ -445,7 +445,7 @@ static int _rtl_init_deferred_work(struct ieee80211_hw = *hw) struct rtl_priv *rtlpriv =3D rtl_priv(hw); struct workqueue_struct *wq; =20 - wq =3D alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name); + wq =3D alloc_workqueue("%s", WQ_PERCPU, 0, rtlpriv->cfg->name); if (!wq) return -ENOMEM; =20 diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireles= s/realtek/rtw88/usb.c index c8092fa0d9f1..8338bfa0522e 100644 --- a/drivers/net/wireless/realtek/rtw88/usb.c +++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -909,7 +909,8 @@ static int rtw_usb_init_rx(struct rtw_dev *rtwdev) struct sk_buff *rx_skb; int i; =20 - rtwusb->rxwq =3D alloc_workqueue("rtw88_usb: rx wq", WQ_BH, 0); + rtwusb->rxwq =3D alloc_workqueue("rtw88_usb: rx wq", WQ_BH | WQ_PERCPU, + 0); if (!rtwusb->rxwq) { rtw_err(rtwdev, "failed to create RX work queue\n"); return -ENOMEM; diff --git a/drivers/net/wireless/silabs/wfx/main.c b/drivers/net/wireless/= silabs/wfx/main.c index a61128debbad..dda36e41eed1 100644 --- a/drivers/net/wireless/silabs/wfx/main.c +++ b/drivers/net/wireless/silabs/wfx/main.c @@ -364,7 +364,7 @@ int wfx_probe(struct wfx_dev *wdev) wdev->pdata.gpio_wakeup =3D NULL; wdev->poll_irq =3D true; =20 - wdev->bh_wq =3D alloc_workqueue("wfx_bh_wq", WQ_HIGHPRI, 0); + wdev->bh_wq =3D alloc_workqueue("wfx_bh_wq", WQ_HIGHPRI | WQ_PERCPU, 0); if (!wdev->bh_wq) return -ENOMEM; =20 diff --git a/drivers/net/wireless/st/cw1200/bh.c b/drivers/net/wireless/st/= cw1200/bh.c index 3b4ded2ac801..3f07f4e1deee 100644 --- a/drivers/net/wireless/st/cw1200/bh.c +++ b/drivers/net/wireless/st/cw1200/bh.c @@ -54,8 +54,8 @@ int cw1200_register_bh(struct cw1200_common *priv) int err =3D 0; /* Realtime workqueue */ priv->bh_workqueue =3D alloc_workqueue("cw1200_bh", - WQ_MEM_RECLAIM | WQ_HIGHPRI - | WQ_CPU_INTENSIVE, 1); + WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_CPU_INTENSIVE | WQ_PERCPU, + 1); =20 if (!priv->bh_workqueue) return -ENOMEM; diff --git a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c b/drivers/net/wwan/= t7xx/t7xx_hif_dpmaif_rx.c index 6a7a26085fc7..2310493203d3 100644 --- a/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c +++ b/drivers/net/wwan/t7xx/t7xx_hif_dpmaif_rx.c @@ -1085,7 +1085,8 @@ static void t7xx_dpmaif_bat_release_work(struct work_= struct *work) int t7xx_dpmaif_bat_rel_wq_alloc(struct dpmaif_ctrl *dpmaif_ctrl) { dpmaif_ctrl->bat_release_wq =3D alloc_workqueue("dpmaif_bat_release_work_= queue", - WQ_MEM_RECLAIM, 1); + WQ_MEM_RECLAIM | WQ_PERCPU, + 1); if (!dpmaif_ctrl->bat_release_wq) return -ENOMEM; =20 diff --git a/drivers/net/wwan/wwan_hwsim.c b/drivers/net/wwan/wwan_hwsim.c index b02befd1b6fb..733688cd4607 100644 --- a/drivers/net/wwan/wwan_hwsim.c +++ b/drivers/net/wwan/wwan_hwsim.c @@ -509,7 +509,7 @@ static int __init wwan_hwsim_init(void) if (wwan_hwsim_devsnum < 0 || wwan_hwsim_devsnum > 128) return -EINVAL; =20 - wwan_wq =3D alloc_workqueue("wwan_wq", 0, 0); + wwan_wq =3D alloc_workqueue("wwan_wq", WQ_PERCPU, 0); if (!wwan_wq) return -ENOMEM; =20 diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index d1b5705dc0c6..183c1e0b405a 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -252,7 +252,8 @@ int __init ceph_msgr_init(void) * The number of active work items is limited by the number of * connections, so leave @max_active at default. */ - ceph_msgr_wq =3D alloc_workqueue("ceph-msgr", WQ_MEM_RECLAIM, 0); + ceph_msgr_wq =3D alloc_workqueue("ceph-msgr", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (ceph_msgr_wq) return 0; =20 diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c index a08eed9b9142..dcd7e8c02169 100644 --- a/net/core/sock_diag.c +++ b/net/core/sock_diag.c @@ -350,7 +350,7 @@ static struct pernet_operations diag_net_ops =3D { =20 static int __init sock_diag_init(void) { - broadcast_wq =3D alloc_workqueue("sock_diag_events", 0, 0); + broadcast_wq =3D alloc_workqueue("sock_diag_events", WQ_PERCPU, 0); BUG_ON(!broadcast_wq); return register_pernet_subsys(&diag_net_ops); } diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c index d1cfceeff133..6585164c7059 100644 --- a/net/rds/ib_rdma.c +++ b/net/rds/ib_rdma.c @@ -672,7 +672,8 @@ struct rds_ib_mr_pool *rds_ib_create_mr_pool(struct rds= _ib_device *rds_ibdev, =20 int rds_ib_mr_init(void) { - rds_ib_mr_wq =3D alloc_workqueue("rds_mr_flushd", WQ_MEM_RECLAIM, 0); + rds_ib_mr_wq =3D alloc_workqueue("rds_mr_flushd", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!rds_ib_mr_wq) return -ENOMEM; return 0; diff --git a/net/rxrpc/rxperf.c b/net/rxrpc/rxperf.c index e848a4777b8c..a92a2b05c19a 100644 --- a/net/rxrpc/rxperf.c +++ b/net/rxrpc/rxperf.c @@ -584,7 +584,7 @@ static int __init rxperf_init(void) =20 pr_info("Server registering\n"); =20 - rxperf_workqueue =3D alloc_workqueue("rxperf", 0, 0); + rxperf_workqueue =3D alloc_workqueue("rxperf", WQ_PERCPU, 0); if (!rxperf_workqueue) goto error_workqueue; =20 diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 3e6cb35baf25..f69d5657438b 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -3518,15 +3518,15 @@ static int __init smc_init(void) =20 rc =3D -ENOMEM; =20 - smc_tcp_ls_wq =3D alloc_workqueue("smc_tcp_ls_wq", 0, 0); + smc_tcp_ls_wq =3D alloc_workqueue("smc_tcp_ls_wq", WQ_PERCPU, 0); if (!smc_tcp_ls_wq) goto out_pnet; =20 - smc_hs_wq =3D alloc_workqueue("smc_hs_wq", 0, 0); + smc_hs_wq =3D alloc_workqueue("smc_hs_wq", WQ_PERCPU, 0); if (!smc_hs_wq) goto out_alloc_tcp_ls_wq; =20 - smc_close_wq =3D alloc_workqueue("smc_close_wq", 0, 0); + smc_close_wq =3D alloc_workqueue("smc_close_wq", WQ_PERCPU, 0); if (!smc_close_wq) goto out_alloc_hs_wq; =20 diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c index ab870109f916..9d9a703e884e 100644 --- a/net/smc/smc_core.c +++ b/net/smc/smc_core.c @@ -896,7 +896,7 @@ static int smc_lgr_create(struct smc_sock *smc, struct = smc_init_info *ini) rc =3D SMC_CLC_DECL_MEM; goto ism_put_vlan; } - lgr->tx_wq =3D alloc_workqueue("smc_tx_wq-%*phN", 0, 0, + lgr->tx_wq =3D alloc_workqueue("smc_tx_wq-%*phN", WQ_PERCPU, 0, SMC_LGR_ID_SIZE, &lgr->id); if (!lgr->tx_wq) { rc =3D -ENOMEM; diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c index f672a62a9a52..939466316761 100644 --- a/net/tls/tls_device.c +++ b/net/tls/tls_device.c @@ -1410,7 +1410,7 @@ int __init tls_device_init(void) if (!dummy_page) return -ENOMEM; =20 - destruct_wq =3D alloc_workqueue("ktls_device_destruct", 0, 0); + destruct_wq =3D alloc_workqueue("ktls_device_destruct", WQ_PERCPU, 0); if (!destruct_wq) { err =3D -ENOMEM; goto err_free_dummy; diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transp= ort.c index f0e48e6911fc..b3e960108e6b 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c @@ -916,7 +916,7 @@ static int __init virtio_vsock_init(void) { int ret; =20 - virtio_vsock_workqueue =3D alloc_workqueue("virtio_vsock", 0, 0); + virtio_vsock_workqueue =3D alloc_workqueue("virtio_vsock", WQ_PERCPU, 0); if (!virtio_vsock_workqueue) return -ENOMEM; =20 diff --git a/net/vmw_vsock/vsock_loopback.c b/net/vmw_vsock/vsock_loopback.c index 6e78927a598e..bc2ff918b315 100644 --- a/net/vmw_vsock/vsock_loopback.c +++ b/net/vmw_vsock/vsock_loopback.c @@ -139,7 +139,7 @@ static int __init vsock_loopback_init(void) struct vsock_loopback *vsock =3D &the_vsock_loopback; int ret; =20 - vsock->workqueue =3D alloc_workqueue("vsock-loopback", 0, 0); + vsock->workqueue =3D alloc_workqueue("vsock-loopback", WQ_PERCPU, 0); if (!vsock->workqueue) return -ENOMEM; =20 --=20 2.51.0