From nobody Tue Sep 9 21:32:23 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 63BF627F727 for ; Fri, 5 Sep 2025 09:02:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757062951; cv=none; b=QLnUt7VLMMeeEMlq7FhD6Rk5e5sB4xq+eBH1DJTF4eH7b+1wPXPv3dYLhHMiD2df67yjbuhXHuSHYgVWrelvUEGIWFiHsvjC3VJ84BnFQYcwn1nLW3Th6E4h0hJrHu5gIgfB2Yn6WWTwkR6wLdFn6sUFfcLj3B2KIqvplCZwqoQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757062951; c=relaxed/simple; bh=UQcbGKc3PcWIuxAr5YFqM3VR2i3hOODc5K8LZ8GXK+Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g44Lp4pMuC/KA2jbGFcgSCz1GVI4YOUAeteKdq+XD4oV50UbD9yREod2c8Lu9nFcjPNRUmxwlIUEoTfs/uP4V5d/1g1l/do5BpYbfUmQMLcUTKBpc1wwnHjuLMBClK9FUZGOa35YLByeQDQY+bixrW28wE9gdZEnVLeb+ohY0HA= 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=Sa273jt7; arc=none smtp.client-ip=209.85.128.48 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="Sa273jt7" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-45b8b02dd14so13593105e9.1 for ; Fri, 05 Sep 2025 02:02:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1757062947; x=1757667747; 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=so/ei/Zwf4uiYOD9SARxwrfwJo9mF5tdxWABKFHMvPE=; b=Sa273jt7Wp8QURf5JUMEu4+htmGbEQdUx3rhe5UplxJb5XBFpkqKC3A/sLIMiVAy52 HSG6Zl7AWAS72n/SUmm4tJwbFkL+C0wuvpoDi9VT0u6eMBPCjWl4dcNIwJFvJJ7lbZhN 7aLNrrElC7MkiOxc8c1cs8l6RfnoEGm4Yml+ddQFuHQ3xddXFTOK/KHci2Xa7K5wyiFD BJp5MNTUM1bzZ5rNHXNMXVx9uAJ/HjmXSWsAXLkOyJ4AveHwBY1b47AjCzG287KTRzqX Pc70oPFFQGuiMLXjfljeBiOWK/lbvt1spd8WC/RdAYi+z6M+cn3Vcg2TG8XZSL1uDSVO Im2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757062947; x=1757667747; 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=so/ei/Zwf4uiYOD9SARxwrfwJo9mF5tdxWABKFHMvPE=; b=TghytJ+QgP+XZqYjAU18xLKgUatJC5vHiC8sBxxwbVmMwuWLOp0qqmWu1kfNe21KCv GDJKo3T/qJW/Uwj06WFhbsNzcJTXWPYR2pHKVCkSBj7DIx8VW4VQGfdL9ojbexmXfW47 AF4BVmg1dzLYSnRuGkp7G7wXgAg3vfT6WKAzxrH3pxXQUpyC9qXBFkjt3QXM+QiKN2d1 SIDQB7mDR2g63je1l1Cev+aVUGjrS/zHIYIClrUCqShnhy46QX0jN7W8LbO+in1stnvu MzEPJd6H+ptZ4MTHXg4e0QcoOrSCUegzwLypGPebGwDjp5bq5Fa3VfTHQAgNNZXPrE5R SAGA== X-Gm-Message-State: AOJu0YzPaZFCx8oowg3U8E6SATsj2iHgR/IB0TGUDNggs3cRpQM2LhBX 27rSbFPAmFjGKDOTsX/9UfWZ1diShcMN4I7cITcuVp7cz+pLBGd8TUu/j1PyjARhY2f+5jqopaN HKVfn X-Gm-Gg: ASbGncsvPqpTui3BEU612HyJOF4i9IntnqiKvrxSmLBmhAXUHTQLGl+80gSjECASP/7 sDmCeDjU+9zlLmmTWGQsM0qXfTAS/s4DOijwAclu3U7mYfq8R6GNd+9xc670Rps0J+uNygn+ko7 W7Q7YzqCCf2KgojGJxfWtHpfISPIxpo2QLirOCwb5M5m9S+22S+O9wNWBXXA+XNPr6oGTyeo6z5 sKBv1WTcEyz6wbopaTdWr34eUaDUvXdhZit6FhUbSXg0KLOmg4fzKFwy6JhQuaiNOEbqZ+gNt4L Wzk/wWDQTfTt9070XLMLR6w2YM9wVPXE+2u4Cbxe+ESGE+2Ib9rlQ/3/20AIaQpHhMNaA+seOuj KqQWBSWFry94+5K9U5H8pxBtY8vHxNHacLH1Bel3s8vpSmJM= X-Google-Smtp-Source: AGHT+IGRHRMGSvM+wo1T01vbYlD+RFgUW7bFF5vWopmhgt8kELX5Ze7cGpuSkPQ4KMXV8c1lzb9vgQ== X-Received: by 2002:a05:600c:3b8c:b0:45c:b53e:331e with SMTP id 5b1f17b1804b1-45cb53e3394mr79627345e9.7.1757062947127; Fri, 05 Sep 2025 02:02:27 -0700 (PDT) Received: from localhost.localdomain ([2a00:6d43:105:c401:e307:1a37:2e76:ce91]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45dcfd000dasm35324565e9.5.2025.09.05.02.02.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Sep 2025 02:02:26 -0700 (PDT) From: Marco Crivellari To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: Tejun Heo , Lai Jiangshan , Frederic Weisbecker , Sebastian Andrzej Siewior , Marco Crivellari , Michal Hocko , Alexander Viro , Christian Brauner Subject: [PATCH 1/3] fs: replace use of system_unbound_wq with system_dfl_wq Date: Fri, 5 Sep 2025 11:02:12 +0200 Message-ID: <20250905090214.102375-2-marco.crivellari@suse.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250905090214.102375-1-marco.crivellari@suse.com> References: <20250905090214.102375-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 --- fs/afs/callback.c | 4 ++-- fs/afs/write.c | 2 +- fs/bcachefs/btree_write_buffer.c | 2 +- fs/bcachefs/io_read.c | 12 ++++++------ fs/bcachefs/journal_io.c | 2 +- fs/btrfs/block-group.c | 2 +- fs/btrfs/extent_map.c | 2 +- fs/btrfs/space-info.c | 4 ++-- fs/btrfs/zoned.c | 2 +- fs/ext4/mballoc.c | 2 +- fs/netfs/objects.c | 2 +- fs/netfs/read_collect.c | 2 +- fs/netfs/write_collect.c | 2 +- fs/nfsd/filecache.c | 2 +- fs/notify/mark.c | 4 ++-- fs/quota/dquot.c | 2 +- 16 files changed, 24 insertions(+), 24 deletions(-) diff --git a/fs/afs/callback.c b/fs/afs/callback.c index 69e1dd55b160..894d2bad6b6c 100644 --- a/fs/afs/callback.c +++ b/fs/afs/callback.c @@ -42,7 +42,7 @@ static void afs_volume_init_callback(struct afs_volume *v= olume) list_for_each_entry(vnode, &volume->open_mmaps, cb_mmap_link) { if (vnode->cb_v_check !=3D atomic_read(&volume->cb_v_break)) { afs_clear_cb_promise(vnode, afs_cb_promise_clear_vol_init_cb); - queue_work(system_unbound_wq, &vnode->cb_work); + queue_work(system_dfl_wq, &vnode->cb_work); } } =20 @@ -90,7 +90,7 @@ void __afs_break_callback(struct afs_vnode *vnode, enum a= fs_cb_break_reason reas if (reason !=3D afs_cb_break_for_deleted && vnode->status.type =3D=3D AFS_FTYPE_FILE && atomic_read(&vnode->cb_nr_mmap)) - queue_work(system_unbound_wq, &vnode->cb_work); + queue_work(system_dfl_wq, &vnode->cb_work); =20 trace_afs_cb_break(&vnode->fid, vnode->cb_break, reason, true); } else { diff --git a/fs/afs/write.c b/fs/afs/write.c index 18b0a9f1615e..fe3421435e05 100644 --- a/fs/afs/write.c +++ b/fs/afs/write.c @@ -172,7 +172,7 @@ static void afs_issue_write_worker(struct work_struct *= work) void afs_issue_write(struct netfs_io_subrequest *subreq) { subreq->work.func =3D afs_issue_write_worker; - if (!queue_work(system_unbound_wq, &subreq->work)) + if (!queue_work(system_dfl_wq, &subreq->work)) WARN_ON_ONCE(1); } =20 diff --git a/fs/bcachefs/btree_write_buffer.c b/fs/bcachefs/btree_write_buf= fer.c index adbe576ec77e..8b9cd4cfd488 100644 --- a/fs/bcachefs/btree_write_buffer.c +++ b/fs/bcachefs/btree_write_buffer.c @@ -822,7 +822,7 @@ int bch2_journal_keys_to_write_buffer_end(struct bch_fs= *c, struct journal_keys_ =20 if (bch2_btree_write_buffer_should_flush(c) && __bch2_write_ref_tryget(c, BCH_WRITE_REF_btree_write_buffer) && - !queue_work(system_unbound_wq, &c->btree_write_buffer.flush_work)) + !queue_work(system_dfl_wq, &c->btree_write_buffer.flush_work)) bch2_write_ref_put(c, BCH_WRITE_REF_btree_write_buffer); =20 if (dst->wb =3D=3D &wb->flushing) diff --git a/fs/bcachefs/io_read.c b/fs/bcachefs/io_read.c index 417bb0c7bbfa..1b05ad45220c 100644 --- a/fs/bcachefs/io_read.c +++ b/fs/bcachefs/io_read.c @@ -553,7 +553,7 @@ static void bch2_rbio_error(struct bch_read_bio *rbio, =20 if (bch2_err_matches(ret, BCH_ERR_data_read_retry)) { bch2_rbio_punt(rbio, bch2_rbio_retry, - RBIO_CONTEXT_UNBOUND, system_unbound_wq); + RBIO_CONTEXT_UNBOUND, system_dfl_wq); } else { rbio =3D bch2_rbio_free(rbio); =20 @@ -833,13 +833,13 @@ static void __bch2_read_endio(struct work_struct *wor= k) memalloc_nofs_restore(nofs_flags); return; csum_err: - bch2_rbio_punt(rbio, bch2_read_csum_err, RBIO_CONTEXT_UNBOUND, system_unb= ound_wq); + bch2_rbio_punt(rbio, bch2_read_csum_err, RBIO_CONTEXT_UNBOUND, system_dfl= _wq); goto out; decompression_err: - bch2_rbio_punt(rbio, bch2_read_decompress_err, RBIO_CONTEXT_UNBOUND, syst= em_unbound_wq); + bch2_rbio_punt(rbio, bch2_read_decompress_err, RBIO_CONTEXT_UNBOUND, syst= em_dfl_wq); goto out; decrypt_err: - bch2_rbio_punt(rbio, bch2_read_decrypt_err, RBIO_CONTEXT_UNBOUND, system_= unbound_wq); + bch2_rbio_punt(rbio, bch2_read_decrypt_err, RBIO_CONTEXT_UNBOUND, system_= dfl_wq); goto out; } =20 @@ -859,7 +859,7 @@ static void bch2_read_endio(struct bio *bio) rbio->bio.bi_end_io =3D rbio->end_io; =20 if (unlikely(bio->bi_status)) { - bch2_rbio_punt(rbio, bch2_read_io_err, RBIO_CONTEXT_UNBOUND, system_unbo= und_wq); + bch2_rbio_punt(rbio, bch2_read_io_err, RBIO_CONTEXT_UNBOUND, system_dfl_= wq); return; } =20 @@ -878,7 +878,7 @@ static void bch2_read_endio(struct bio *bio) rbio->promote || crc_is_compressed(rbio->pick.crc) || bch2_csum_type_is_encryption(rbio->pick.crc.csum_type)) - context =3D RBIO_CONTEXT_UNBOUND, wq =3D system_unbound_wq; + context =3D RBIO_CONTEXT_UNBOUND, wq =3D system_dfl_wq; else if (rbio->pick.crc.csum_type) context =3D RBIO_CONTEXT_HIGHPRI, wq =3D system_highpri_wq; =20 diff --git a/fs/bcachefs/journal_io.c b/fs/bcachefs/journal_io.c index 1b7961f4f609..298be7748e99 100644 --- a/fs/bcachefs/journal_io.c +++ b/fs/bcachefs/journal_io.c @@ -1256,7 +1256,7 @@ int bch2_journal_read(struct bch_fs *c, percpu_ref_tryget(&ca->io_ref[READ])) closure_call(&ca->journal.read, bch2_journal_read_device, - system_unbound_wq, + system_dfl_wq, &jlist.cl); else degraded =3D true; diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index a8129f1ce78c..eb25a4acd54d 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -2026,7 +2026,7 @@ void btrfs_reclaim_bgs(struct btrfs_fs_info *fs_info) btrfs_reclaim_sweep(fs_info); spin_lock(&fs_info->unused_bgs_lock); if (!list_empty(&fs_info->reclaim_bgs)) - queue_work(system_unbound_wq, &fs_info->reclaim_bgs_work); + queue_work(system_dfl_wq, &fs_info->reclaim_bgs_work); spin_unlock(&fs_info->unused_bgs_lock); } =20 diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index 7f46abbd6311..812823b93b66 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -1373,7 +1373,7 @@ void btrfs_free_extent_maps(struct btrfs_fs_info *fs_= info, long nr_to_scan) if (atomic64_cmpxchg(&fs_info->em_shrinker_nr_to_scan, 0, nr_to_scan) != =3D 0) return; =20 - queue_work(system_unbound_wq, &fs_info->em_shrinker_work); + queue_work(system_dfl_wq, &fs_info->em_shrinker_work); } =20 void btrfs_init_extent_map_shrinker_work(struct btrfs_fs_info *fs_info) diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c index ff089e3e4103..719d8d13d63e 100644 --- a/fs/btrfs/space-info.c +++ b/fs/btrfs/space-info.c @@ -1764,7 +1764,7 @@ static int __reserve_bytes(struct btrfs_fs_info *fs_i= nfo, space_info->flags, orig_bytes, flush, "enospc"); - queue_work(system_unbound_wq, async_work); + queue_work(system_dfl_wq, async_work); } } else { list_add_tail(&ticket.list, @@ -1781,7 +1781,7 @@ static int __reserve_bytes(struct btrfs_fs_info *fs_i= nfo, need_preemptive_reclaim(fs_info, space_info)) { trace_btrfs_trigger_flush(fs_info, space_info->flags, orig_bytes, flush, "preempt"); - queue_work(system_unbound_wq, + queue_work(system_dfl_wq, &fs_info->preempt_reclaim_work); } } diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c index fb8b8b29c169..7ab51a1e857e 100644 --- a/fs/btrfs/zoned.c +++ b/fs/btrfs/zoned.c @@ -2429,7 +2429,7 @@ void btrfs_schedule_zone_finish_bg(struct btrfs_block= _group *bg, atomic_inc(&eb->refs); bg->last_eb =3D eb; INIT_WORK(&bg->zone_finish_work, btrfs_zone_finish_endio_workfn); - queue_work(system_unbound_wq, &bg->zone_finish_work); + queue_work(system_dfl_wq, &bg->zone_finish_work); } =20 void btrfs_clear_data_reloc_bg(struct btrfs_block_group *bg) diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 0d523e9fb3d5..689950520e28 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -3927,7 +3927,7 @@ void ext4_process_freed_data(struct super_block *sb, = tid_t commit_tid) list_splice_tail(&freed_data_list, &sbi->s_discard_list); spin_unlock(&sbi->s_md_lock); if (wake) - queue_work(system_unbound_wq, &sbi->s_discard_work); + queue_work(system_dfl_wq, &sbi->s_discard_work); } else { list_for_each_entry_safe(entry, tmp, &freed_data_list, efd_list) kmem_cache_free(ext4_free_data_cachep, entry); diff --git a/fs/netfs/objects.c b/fs/netfs/objects.c index dc6b41ef18b0..da9cf4747728 100644 --- a/fs/netfs/objects.c +++ b/fs/netfs/objects.c @@ -159,7 +159,7 @@ void netfs_put_request(struct netfs_io_request *rreq, b= ool was_async, if (dead) { if (was_async) { rreq->work.func =3D netfs_free_request; - if (!queue_work(system_unbound_wq, &rreq->work)) + if (!queue_work(system_dfl_wq, &rreq->work)) WARN_ON(1); } else { netfs_free_request(&rreq->work); diff --git a/fs/netfs/read_collect.c b/fs/netfs/read_collect.c index 23c75755ad4e..3f64a9f6c688 100644 --- a/fs/netfs/read_collect.c +++ b/fs/netfs/read_collect.c @@ -474,7 +474,7 @@ void netfs_wake_read_collector(struct netfs_io_request = *rreq) !test_bit(NETFS_RREQ_RETRYING, &rreq->flags)) { if (!work_pending(&rreq->work)) { netfs_get_request(rreq, netfs_rreq_trace_get_work); - if (!queue_work(system_unbound_wq, &rreq->work)) + if (!queue_work(system_dfl_wq, &rreq->work)) netfs_put_request(rreq, true, netfs_rreq_trace_put_work_nq); } } else { diff --git a/fs/netfs/write_collect.c b/fs/netfs/write_collect.c index 3fca59e6475d..7ef3859e36d0 100644 --- a/fs/netfs/write_collect.c +++ b/fs/netfs/write_collect.c @@ -451,7 +451,7 @@ void netfs_wake_write_collector(struct netfs_io_request= *wreq, bool was_async) { if (!work_pending(&wreq->work)) { netfs_get_request(wreq, netfs_rreq_trace_get_work); - if (!queue_work(system_unbound_wq, &wreq->work)) + if (!queue_work(system_dfl_wq, &wreq->work)) netfs_put_request(wreq, was_async, netfs_rreq_trace_put_work_nq); } } diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c index ab85e6a2454f..910fde3240a9 100644 --- a/fs/nfsd/filecache.c +++ b/fs/nfsd/filecache.c @@ -113,7 +113,7 @@ static void nfsd_file_schedule_laundrette(void) { if (test_bit(NFSD_FILE_CACHE_UP, &nfsd_file_flags)) - queue_delayed_work(system_unbound_wq, &nfsd_filecache_laundrette, + queue_delayed_work(system_dfl_wq, &nfsd_filecache_laundrette, NFSD_LAUNDRETTE_DELAY); } =20 diff --git a/fs/notify/mark.c b/fs/notify/mark.c index 798340db69d7..55a03bb05aa1 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c @@ -428,7 +428,7 @@ void fsnotify_put_mark(struct fsnotify_mark *mark) conn->destroy_next =3D connector_destroy_list; connector_destroy_list =3D conn; spin_unlock(&destroy_lock); - queue_work(system_unbound_wq, &connector_reaper_work); + queue_work(system_dfl_wq, &connector_reaper_work); } /* * Note that we didn't update flags telling whether inode cares about @@ -439,7 +439,7 @@ void fsnotify_put_mark(struct fsnotify_mark *mark) spin_lock(&destroy_lock); list_add(&mark->g_list, &destroy_list); spin_unlock(&destroy_lock); - queue_delayed_work(system_unbound_wq, &reaper_work, + queue_delayed_work(system_dfl_wq, &reaper_work, FSNOTIFY_REAPER_DELAY); } EXPORT_SYMBOL_GPL(fsnotify_put_mark); diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 825c5c2e0962..39d9756a9cef 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -881,7 +881,7 @@ void dqput(struct dquot *dquot) put_releasing_dquots(dquot); atomic_dec(&dquot->dq_count); spin_unlock(&dq_list_lock); - queue_delayed_work(system_unbound_wq, "a_release_work, 1); + queue_delayed_work(system_dfl_wq, "a_release_work, 1); } EXPORT_SYMBOL(dqput); =20 --=20 2.51.0 From nobody Tue Sep 9 21:32:23 2025 Received: from mail-wm1-f53.google.com (mail-wm1-f53.google.com [209.85.128.53]) (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 75BDE27FD68 for ; Fri, 5 Sep 2025 09:02:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757062952; cv=none; b=SqSY3/UiL46U5XdprVfugxuIHm037kEgQ3NijSBD+soctm/5nQGjleFTpZXKCEQTHqKw5ez6L9ET5o+1L81JUxLXJpRC0C3AtbaIN+piVkB16NhDX7UUP1U0jcudLOcY/nihA7K5LEe7fr8P5BKf3vI5HiaTJjXuSIzkSXCfJfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757062952; c=relaxed/simple; bh=HkVsUxd8i7iuNGh42viXIYRZPf8l9Ki5QLNRoUyrqhY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zw4ef+s+PV6iBDTrbSeF3lVBWFighfgi3wWJLYSovVsP+k51YX4eMgKj0cqwhe4Md41lMKJcJpmOJYLsKAwwyh6IppR6ffbEWSXmKzKLZxYkn9Ux0fBGj5qbVZyCWeeEBRACkqbrLMBlZgYFND3CA+w0xZu5b/4kvfq6223WvXc= 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=ZuCCrQDK; arc=none smtp.client-ip=209.85.128.53 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="ZuCCrQDK" Received: by mail-wm1-f53.google.com with SMTP id 5b1f17b1804b1-45b9853e630so17599565e9.0 for ; Fri, 05 Sep 2025 02:02:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1757062948; x=1757667748; 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=SmDIFRXAv1xZChIociSBZ0cJ3vqXOut7oWyeaUjJHUk=; b=ZuCCrQDK/zZA+BNDojzU1qHF1dD9yqL6T5gzSV61WY+G5sDevhtxhwXUCx9Dx4AgPw jMxtkDz0vAk365Ctid6JQTAXSHEwb/S9DgGBWfFlugCqpoaJxetZGlTnDkDOdDNLSzeJ MxHVp+AVy+LrNIGV865T8iB1stJeiyYDxynv7Ie6FLY7OpWtISjn1DGAGo1ontBy33wZ FmS+LK8NmEZxHmRN20DoeZ6J94SGYUPh7qEQzUryEvzb5NL/bpfDcdMifLvsrukd4fhH qqXc6Sv1uRT97cGNRJq5vsxb0EYthpR6JmuFlte2R/YdH+58vfuYxtB4FHcC6mQ7hdgj xoyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757062948; x=1757667748; 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=SmDIFRXAv1xZChIociSBZ0cJ3vqXOut7oWyeaUjJHUk=; b=FU50VRTTbGwCEyoMwQGk42/zFX67byelUzJCW887Dp+JhIaQj+Ah50lzZKG+YifdJh KFanM9wkf8QWpouMn7hRK+diSBoLboHonz//sSUiDBI28ZMxPqRF2B9WExW0C2562c37 eJlRQAqWX6sh8gwdKJXdThzSwjTvG0C+0m2xpTqWCMpmY6nMLEfjKC0sV8HJBDJ2AIbL /x85v2aSUpgx617SSFpTpFfVOeZPzf1kZbxyu8aZy7mp4yWLeel0fYejns5/boLLw8aB mDY8lXN8G7BCMaofvySeg+Mkly7/cYRgOQ4vhLbz7WnMLpYeK7xQwwvDIEV4kbdv3fTv V06A== X-Gm-Message-State: AOJu0YwEGtgAiJJZg3B7/iHp3iBYMutZOUdMphXoLgz9merQe/uVRdgw z0T4/W/nec2tSvMCp+rpEYh7Dlroo5noUghHMbH+LuQiX7/jaObJC9Igjgr3goq/WKUPD9FGfaI D+bSX X-Gm-Gg: ASbGncu0K8/fXovSMoVwiWmIR9ozIVepMKiTrzM7+A/vlMKQivgE8azvWin1H7Ey1y7 oaeVbjZgBn4yHt6l7hjaSLJnkNK1TvJxPpDTS2bnLsGP1lH3SgNjPC5k1A6b45dxM9whF9A371j H4uM5NuqRerXdK55vxxWt85w7e/m0X0i40AG5rOkt/OVIDD5/NM2aVqJ2d9wZkextcE4uez88SH 4ZnZJoOnHOpFCkvdYmXQ5jOYgdFF32qyJSYfV6qkCneqfGFx0FaNAnZWUezb2Xq/8tvvW2zkn3L eSjNSR49I68F3ilz7hP0GnKW88pYc78ueYbrPjcfUSXst3j1dVC+FrI9J4oxr3GVOQU1x5aDSNI 0uJWu4LeoEAVTp5HwvOfPLb0Hd1qo3BDtX5+nxjU7nZr1bhFDd5yNeS8bUw== X-Google-Smtp-Source: AGHT+IHqK9NaJpjvHLojOBdvStEYEORJxBDgmmtOnmc5YCVGkSBh2N6whpYmOsTcOykBgPN/mHJ4Gw== X-Received: by 2002:a05:600c:4f50:b0:45b:9c97:af85 with SMTP id 5b1f17b1804b1-45cb50689admr104022495e9.17.1757062948184; Fri, 05 Sep 2025 02:02:28 -0700 (PDT) Received: from localhost.localdomain ([2a00:6d43:105:c401:e307:1a37:2e76:ce91]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45dcfd000dasm35324565e9.5.2025.09.05.02.02.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Sep 2025 02:02:27 -0700 (PDT) From: Marco Crivellari To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: Tejun Heo , Lai Jiangshan , Frederic Weisbecker , Sebastian Andrzej Siewior , Marco Crivellari , Michal Hocko , Alexander Viro , Christian Brauner Subject: [PATCH 2/3] fs: replace use of system_wq with system_percpu_wq Date: Fri, 5 Sep 2025 11:02:13 +0200 Message-ID: <20250905090214.102375-3-marco.crivellari@suse.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250905090214.102375-1-marco.crivellari@suse.com> References: <20250905090214.102375-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_wq is a per-CPU worqueue, yet nothing in its name tells about that CPU affinity constraint, which is very often not required by users. Make it clear by adding a system_percpu_wq to all the fs subsystem. The old wq will be kept for a few release cylces. Suggested-by: Tejun Heo Signed-off-by: Marco Crivellari --- fs/aio.c | 2 +- fs/fs-writeback.c | 2 +- fs/fuse/dev.c | 2 +- fs/fuse/inode.c | 2 +- fs/nfs/namespace.c | 2 +- fs/nfs/nfs4renewd.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/aio.c b/fs/aio.c index 7b976b564cfc..747e9b5bba23 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -636,7 +636,7 @@ static void free_ioctx_reqs(struct percpu_ref *ref) =20 /* Synchronize against RCU protected table->table[] dereferences */ INIT_RCU_WORK(&ctx->free_rwork, free_ioctx); - queue_rcu_work(system_wq, &ctx->free_rwork); + queue_rcu_work(system_percpu_wq, &ctx->free_rwork); } =20 /* diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index cc57367fb641..cf51a265bf27 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -2442,7 +2442,7 @@ static int dirtytime_interval_handler(const struct ct= l_table *table, int write, =20 ret =3D proc_dointvec_minmax(table, write, buffer, lenp, ppos); if (ret =3D=3D 0 && write) - mod_delayed_work(system_wq, &dirtytime_work, 0); + mod_delayed_work(system_percpu_wq, &dirtytime_work, 0); return ret; } =20 diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 6dcbaa218b7a..64b623471a09 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -118,7 +118,7 @@ void fuse_check_timeout(struct work_struct *work) goto abort_conn; =20 out: - queue_delayed_work(system_wq, &fc->timeout.work, + queue_delayed_work(system_percpu_wq, &fc->timeout.work, fuse_timeout_timer_freq); return; =20 diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index fd48e8d37f2e..6a608ea77d09 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -1268,7 +1268,7 @@ static void set_request_timeout(struct fuse_conn *fc,= unsigned int timeout) { fc->timeout.req_timeout =3D secs_to_jiffies(timeout); INIT_DELAYED_WORK(&fc->timeout.work, fuse_check_timeout); - queue_delayed_work(system_wq, &fc->timeout.work, + queue_delayed_work(system_percpu_wq, &fc->timeout.work, fuse_timeout_timer_freq); } =20 diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index 973aed9cc5fe..0689369c8a63 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c @@ -336,7 +336,7 @@ static int param_set_nfs_timeout(const char *val, const= struct kernel_param *kp) num *=3D HZ; *((int *)kp->arg) =3D num; if (!list_empty(&nfs_automount_list)) - mod_delayed_work(system_wq, &nfs_automount_task, num); + mod_delayed_work(system_percpu_wq, &nfs_automount_task, num); } else { *((int *)kp->arg) =3D -1*HZ; cancel_delayed_work(&nfs_automount_task); diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c index db3811af0796..18ae614e5a6c 100644 --- a/fs/nfs/nfs4renewd.c +++ b/fs/nfs/nfs4renewd.c @@ -122,7 +122,7 @@ nfs4_schedule_state_renewal(struct nfs_client *clp) timeout =3D 5 * HZ; dprintk("%s: requeueing work. Lease period =3D %ld\n", __func__, (timeout + HZ - 1) / HZ); - mod_delayed_work(system_wq, &clp->cl_renewd, timeout); + mod_delayed_work(system_percpu_wq, &clp->cl_renewd, timeout); set_bit(NFS_CS_RENEWD, &clp->cl_res_state); spin_unlock(&clp->cl_lock); } --=20 2.51.0 From nobody Tue Sep 9 21:32:23 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 AA1B528468C for ; Fri, 5 Sep 2025 09:02:31 +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=1757062954; cv=none; b=azd+hZ6MZDgo5ehVKQTUC/XOqwQ9KoDZpWicFwDI+NjL807xYkwQrRFJTwEr03VVfMhq3yu3ooON3BiCbLF2blqB2SrfuuB81cnV1YAP3LRM339fe+bLEgank0L2jj43cFEsXXBqsHnxsEjoBodXlYImUjmm1gpnNNZtSqPvzzg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757062954; c=relaxed/simple; bh=JJjSmx5BhY/AJQUx4xsx3foinAt8ECFnWjoHNMkm8u0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=LE24hSoqeBWY9YthjgGIEMOtYCPwxL2FhKJRPSdn+FK6MGO6tNNzrY3oco4h1ERgrm4vfRtMiljObzXyXjy6nGZvqPo55dca+MnNyH3ag735ZnzoeQq55/M89vbW42MYcjqKh2CPmKa1Afg32/LGGcspt6LiGCWgGe6W8fGg758= 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=U/hVSbtP; 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="U/hVSbtP" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-45b79ec2fbeso13350325e9.3 for ; Fri, 05 Sep 2025 02:02:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1757062950; x=1757667750; 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=mxot5Hn8c7fljR2KmOgHwdgGmRvc38YiwNgTDVLdMd4=; b=U/hVSbtPuKlj0VoTwsr+XiInFe3hTFgtLk6TAove2qwdDNWZVfea8tTXzAnh0pFk2p 8WeU8JSI1aQzKMUd/0zwGuA4wuk1Avs8f8cGsoKkzfOZEYE3QuHDJKQ/52xaS7Av6nIS axhats03SrhXUG/flKjP3H5b6cQh+6lzwi7D4uF6wNV4wsDVHZ2EhwGZIxjBqPdcGxhM X9yhfAexklFhLmjfFxFuCYglZV1USQUo7A5RF8TI4MtZdgF+pk7dYquP5be+3Sg7Ygyy zSuOQATWJSJNxbKHutE5AOG42FabXXum5mmwYkNZxDwVv5FTqgZaTaitLU5e3tgQI+lQ 00Eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757062950; x=1757667750; 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=mxot5Hn8c7fljR2KmOgHwdgGmRvc38YiwNgTDVLdMd4=; b=EDNzbExARbn9Ab/93Ny7k8Y56a4aFcCW5YR6nM54PFW/LJuaYLMFkprH5tP8YSkw+2 bEm9oKReFPu/BbpRA0TJloKh3YFQF2/6tWH7DEYEFClaGD1DmYQpFSH5OowUIxolWKAJ GQpY9Y20MdUgRwvzLr7oc2fvYPPK8HazFR20ncwbBS9yRa3H52hs7b5G7pm9ORWWNMpU 1KSacg4LpWSjVU2tYGibEdcDecYWNKmKTzVgIwDUSEl8iDhtc16r692CigAWZy52307e lqlfgF6r+ZqTNpmaHvSikS8XYz67/eu4ZlQi94yUezkvReXSjyW8s5ELdWvtnaaoIjBX 6GDg== X-Gm-Message-State: AOJu0YxoeUIS90Mksmb+AU1EhzSGWycCaSKgryRsfq/9zqaHjNXHFZ7C ymvZ1I+6jJH4pyDLBEr9Zr+z/XFZUbmRPqzECcIiDvmHnTLz2L8ZkCcA4JdHmPboa1w9sMaGWL5 osZQQ X-Gm-Gg: ASbGncsLOCFdnC3e4eqiRtkT5tDbCcW23oaHyo7xADgRMLVIitAsiNvTAwvBZpFHo4j Nzbk97WyHcA0BJtE2wsQbglwUZx3M84xxvdLtyELyqWhyZn9Y+hGi+ykX6haXFegghVLmtSiIfS tnSe0TmbQbWOhScR4hOKpgfIBCAB+uyjI9IhliZSZ9z1CQ8KsPb8CR5uNvI9zyxAS1g5MCLIjhU aeq1WSxQ5eO6N8cB5WgrRHDqUMhB87xFhjSdfVQYhL6pSUmE8Ds7zHLg2ipIj3XTGhNZtUprN4w yMDJivTagmfAvSlfeWwruFquwJiViAu9HUEyG+jriuphrbx2jJrgvCZzQvdt8Fc7Dz/RfCYdh4G te+yVdeU/ZXZQ5pF44eoCCOxf5REv3Q3FbxJsX/Uq25wqlSF5ZjxLELC8wvvV798a0zwM X-Google-Smtp-Source: AGHT+IHoGJIGtfKKdjXYpqXcPfCoHuMuneaFgMfxugQ5lq/PwG+mc9kHBJoyyu920q/ao/OU5oED3A== X-Received: by 2002:a05:600c:3b05:b0:45d:d099:873 with SMTP id 5b1f17b1804b1-45dd09909d6mr50432925e9.6.1757062949372; Fri, 05 Sep 2025 02:02:29 -0700 (PDT) Received: from localhost.localdomain ([2a00:6d43:105:c401:e307:1a37:2e76:ce91]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45dcfd000dasm35324565e9.5.2025.09.05.02.02.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Sep 2025 02:02:28 -0700 (PDT) From: Marco Crivellari To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: Tejun Heo , Lai Jiangshan , Frederic Weisbecker , Sebastian Andrzej Siewior , Marco Crivellari , Michal Hocko , Alexander Viro , Christian Brauner Subject: [PATCH 3/3] fs: WQ_PERCPU added to alloc_workqueue users Date: Fri, 5 Sep 2025 11:02:14 +0200 Message-ID: <20250905090214.102375-4-marco.crivellari@suse.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250905090214.102375-1-marco.crivellari@suse.com> References: <20250905090214.102375-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 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 to all the fs subsystem users 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 --- fs/afs/main.c | 4 ++-- fs/bcachefs/super.c | 10 +++++----- fs/btrfs/async-thread.c | 3 +-- fs/btrfs/disk-io.c | 2 +- fs/ceph/super.c | 2 +- fs/dlm/lowcomms.c | 2 +- fs/dlm/main.c | 2 +- fs/fs-writeback.c | 2 +- fs/gfs2/main.c | 5 +++-- fs/gfs2/ops_fstype.c | 6 ++++-- fs/ocfs2/dlm/dlmdomain.c | 3 ++- fs/ocfs2/dlmfs/dlmfs.c | 3 ++- fs/smb/client/cifsfs.c | 16 +++++++++++----- fs/smb/server/ksmbd_work.c | 2 +- fs/smb/server/transport_rdma.c | 3 ++- fs/super.c | 3 ++- fs/verity/verify.c | 2 +- fs/xfs/xfs_log.c | 3 +-- fs/xfs/xfs_mru_cache.c | 3 ++- fs/xfs/xfs_super.c | 15 ++++++++------- 20 files changed, 52 insertions(+), 39 deletions(-) diff --git a/fs/afs/main.c b/fs/afs/main.c index c845c5daaeba..6b7aab6abd78 100644 --- a/fs/afs/main.c +++ b/fs/afs/main.c @@ -168,13 +168,13 @@ static int __init afs_init(void) =20 printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 registering.\n"); =20 - afs_wq =3D alloc_workqueue("afs", 0, 0); + afs_wq =3D alloc_workqueue("afs", WQ_PERCPU, 0); if (!afs_wq) goto error_afs_wq; afs_async_calls =3D alloc_workqueue("kafsd", WQ_MEM_RECLAIM | WQ_UNBOUND,= 0); if (!afs_async_calls) goto error_async; - afs_lock_manager =3D alloc_workqueue("kafs_lockd", WQ_MEM_RECLAIM, 0); + afs_lock_manager =3D alloc_workqueue("kafs_lockd", WQ_MEM_RECLAIM | WQ_PE= RCPU, 0); if (!afs_lock_manager) goto error_lockmgr; =20 diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c index a58edde43bee..8bba5347a36e 100644 --- a/fs/bcachefs/super.c +++ b/fs/bcachefs/super.c @@ -909,15 +909,15 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb= , struct bch_opts opts) if (!(c->btree_update_wq =3D alloc_workqueue("bcachefs", WQ_HIGHPRI|WQ_FREEZABLE|WQ_MEM_RECLAIM|WQ_UNBOUND, 512)) || !(c->btree_io_complete_wq =3D alloc_workqueue("bcachefs_btree_io", - WQ_HIGHPRI|WQ_FREEZABLE|WQ_MEM_RECLAIM, 1)) || + WQ_HIGHPRI | WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, 1)) || !(c->copygc_wq =3D alloc_workqueue("bcachefs_copygc", - WQ_HIGHPRI|WQ_FREEZABLE|WQ_MEM_RECLAIM|WQ_CPU_INTENSIVE, 1)) || + WQ_HIGHPRI | WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE | WQ_PER= CPU, 1)) || !(c->btree_read_complete_wq =3D alloc_workqueue("bcachefs_btree_read_= complete", - WQ_HIGHPRI|WQ_FREEZABLE|WQ_MEM_RECLAIM, 512)) || + WQ_HIGHPRI | WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, 512)) || !(c->btree_write_submit_wq =3D alloc_workqueue("bcachefs_btree_write_= sumit", - WQ_HIGHPRI|WQ_FREEZABLE|WQ_MEM_RECLAIM, 1)) || + WQ_HIGHPRI | WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, 1)) || !(c->write_ref_wq =3D alloc_workqueue("bcachefs_write_ref", - WQ_FREEZABLE, 0)) || + WQ_FREEZABLE | WQ_PERCPU, 0)) || #ifndef BCH_WRITE_REF_DEBUG percpu_ref_init(&c->writes, bch2_writes_disabled, PERCPU_REF_INIT_DEAD, GFP_KERNEL) || diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c index f3bffe08b290..0a84d86a942d 100644 --- a/fs/btrfs/async-thread.c +++ b/fs/btrfs/async-thread.c @@ -109,8 +109,7 @@ struct btrfs_workqueue *btrfs_alloc_workqueue(struct bt= rfs_fs_info *fs_info, ret->thresh =3D thresh; } =20 - ret->normal_wq =3D alloc_workqueue("btrfs-%s", flags, ret->current_active, - name); + ret->normal_wq =3D alloc_workqueue("btrfs-%s", flags, ret->current_active= , name); if (!ret->normal_wq) { kfree(ret); return NULL; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 3dd555db3d32..f817b29a43de 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1963,7 +1963,7 @@ static int btrfs_init_workqueues(struct btrfs_fs_info= *fs_info) { u32 max_active =3D fs_info->thread_pool_size; unsigned int flags =3D WQ_MEM_RECLAIM | WQ_FREEZABLE | WQ_UNBOUND; - unsigned int ordered_flags =3D WQ_MEM_RECLAIM | WQ_FREEZABLE; + unsigned int ordered_flags =3D WQ_MEM_RECLAIM | WQ_FREEZABLE | WQ_PERCPU; =20 fs_info->workers =3D btrfs_alloc_workqueue(fs_info, "worker", flags, max_active, 16); diff --git a/fs/ceph/super.c b/fs/ceph/super.c index f3951253e393..a0302a004157 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c @@ -862,7 +862,7 @@ static struct ceph_fs_client *create_fs_client(struct c= eph_mount_options *fsopt, fsc->inode_wq =3D alloc_workqueue("ceph-inode", WQ_UNBOUND, 0); if (!fsc->inode_wq) goto fail_client; - fsc->cap_wq =3D alloc_workqueue("ceph-cap", 0, 1); + fsc->cap_wq =3D alloc_workqueue("ceph-cap", WQ_PERCPU, 1); if (!fsc->cap_wq) goto fail_inode_wq; =20 diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 70abd4da17a6..6ced1fa90209 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c @@ -1702,7 +1702,7 @@ static int work_start(void) return -ENOMEM; } =20 - process_workqueue =3D alloc_workqueue("dlm_process", WQ_HIGHPRI | WQ_BH, = 0); + process_workqueue =3D alloc_workqueue("dlm_process", WQ_HIGHPRI | WQ_BH |= WQ_PERCPU, 0); if (!process_workqueue) { log_print("can't start dlm_process"); destroy_workqueue(io_workqueue); diff --git a/fs/dlm/main.c b/fs/dlm/main.c index 4887c8a05318..a44d16da7187 100644 --- a/fs/dlm/main.c +++ b/fs/dlm/main.c @@ -52,7 +52,7 @@ static int __init init_dlm(void) if (error) goto out_user; =20 - dlm_wq =3D alloc_workqueue("dlm_wq", 0, 0); + dlm_wq =3D alloc_workqueue("dlm_wq", WQ_PERCPU, 0); if (!dlm_wq) { error =3D -ENOMEM; goto out_plock; diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index cf51a265bf27..4b1a53a3266b 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1180,7 +1180,7 @@ void cgroup_writeback_umount(struct super_block *sb) =20 static int __init cgroup_writeback_init(void) { - isw_wq =3D alloc_workqueue("inode_switch_wbs", 0, 0); + isw_wq =3D alloc_workqueue("inode_switch_wbs", WQ_PERCPU, 0); if (!isw_wq) return -ENOMEM; return 0; diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c index 0727f60ad028..9d65719353fa 100644 --- a/fs/gfs2/main.c +++ b/fs/gfs2/main.c @@ -151,7 +151,8 @@ static int __init init_gfs2_fs(void) =20 error =3D -ENOMEM; gfs2_recovery_wq =3D alloc_workqueue("gfs2_recovery", - WQ_MEM_RECLAIM | WQ_FREEZABLE, 0); + WQ_MEM_RECLAIM | WQ_FREEZABLE | WQ_PERCPU, + 0); if (!gfs2_recovery_wq) goto fail_wq1; =20 @@ -160,7 +161,7 @@ static int __init init_gfs2_fs(void) if (!gfs2_control_wq) goto fail_wq2; =20 - gfs2_freeze_wq =3D alloc_workqueue("gfs2_freeze", 0, 0); + gfs2_freeze_wq =3D alloc_workqueue("gfs2_freeze", WQ_PERCPU, 0); =20 if (!gfs2_freeze_wq) goto fail_wq3; diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index e83d293c3614..0dccb5882ef6 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -1189,13 +1189,15 @@ static int gfs2_fill_super(struct super_block *sb, = struct fs_context *fc) =20 error =3D -ENOMEM; sdp->sd_glock_wq =3D alloc_workqueue("gfs2-glock/%s", - WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE, 0, + WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE | WQ_PERCPU, + 0, sdp->sd_fsname); if (!sdp->sd_glock_wq) goto fail_free; =20 sdp->sd_delete_wq =3D alloc_workqueue("gfs2-delete/%s", - WQ_MEM_RECLAIM | WQ_FREEZABLE, 0, sdp->sd_fsname); + WQ_MEM_RECLAIM | WQ_FREEZABLE | WQ_PERCPU, 0, + sdp->sd_fsname); if (!sdp->sd_delete_wq) goto fail_glock_wq; =20 diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 2018501b2249..2347a50f079b 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c @@ -1876,7 +1876,8 @@ static int dlm_join_domain(struct dlm_ctxt *dlm) dlm_debug_init(dlm); =20 snprintf(wq_name, O2NM_MAX_NAME_LEN, "dlm_wq-%s", dlm->name); - dlm->dlm_worker =3D alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 0); + dlm->dlm_worker =3D alloc_workqueue(wq_name, WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!dlm->dlm_worker) { status =3D -ENOMEM; mlog_errno(status); diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c index 5130ec44e5e1..0b730535b2c8 100644 --- a/fs/ocfs2/dlmfs/dlmfs.c +++ b/fs/ocfs2/dlmfs/dlmfs.c @@ -595,7 +595,8 @@ static int __init init_dlmfs_fs(void) } cleanup_inode =3D 1; =20 - user_dlm_worker =3D alloc_workqueue("user_dlm", WQ_MEM_RECLAIM, 0); + user_dlm_worker =3D alloc_workqueue("user_dlm", + WQ_MEM_RECLAIM | WQ_PERCPU, 0); if (!user_dlm_worker) { status =3D -ENOMEM; goto bail; diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index a08c42363ffc..3d3a76fa7210 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -1883,7 +1883,9 @@ init_cifs(void) cifs_dbg(VFS, "dir_cache_timeout set to max of 65000 seconds\n"); } =20 - cifsiod_wq =3D alloc_workqueue("cifsiod", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); + cifsiod_wq =3D alloc_workqueue("cifsiod", + WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!cifsiod_wq) { rc =3D -ENOMEM; goto out_clean_proc; @@ -1911,28 +1913,32 @@ init_cifs(void) } =20 cifsoplockd_wq =3D alloc_workqueue("cifsoplockd", - WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); + WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!cifsoplockd_wq) { rc =3D -ENOMEM; goto out_destroy_fileinfo_put_wq; } =20 deferredclose_wq =3D alloc_workqueue("deferredclose", - WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); + WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!deferredclose_wq) { rc =3D -ENOMEM; goto out_destroy_cifsoplockd_wq; } =20 serverclose_wq =3D alloc_workqueue("serverclose", - WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); + WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!serverclose_wq) { rc =3D -ENOMEM; goto out_destroy_deferredclose_wq; } =20 cfid_put_wq =3D alloc_workqueue("cfid_put_wq", - WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); + WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!cfid_put_wq) { rc =3D -ENOMEM; goto out_destroy_serverclose_wq; diff --git a/fs/smb/server/ksmbd_work.c b/fs/smb/server/ksmbd_work.c index 72b00ca6e455..4a71f46d7020 100644 --- a/fs/smb/server/ksmbd_work.c +++ b/fs/smb/server/ksmbd_work.c @@ -78,7 +78,7 @@ int ksmbd_work_pool_init(void) =20 int ksmbd_workqueue_init(void) { - ksmbd_wq =3D alloc_workqueue("ksmbd-io", 0, 0); + ksmbd_wq =3D alloc_workqueue("ksmbd-io", WQ_PERCPU, 0); if (!ksmbd_wq) return -ENOMEM; return 0; diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c index 4998df04ab95..43b7062335fa 100644 --- a/fs/smb/server/transport_rdma.c +++ b/fs/smb/server/transport_rdma.c @@ -2198,7 +2198,8 @@ int ksmbd_rdma_init(void) * for lack of credits */ smb_direct_wq =3D alloc_workqueue("ksmbd-smb_direct-wq", - WQ_HIGHPRI | WQ_MEM_RECLAIM, 0); + WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_PERCPU, + 0); if (!smb_direct_wq) return -ENOMEM; =20 diff --git a/fs/super.c b/fs/super.c index 97a17f9d9023..0a9af48f30dd 100644 --- a/fs/super.c +++ b/fs/super.c @@ -2174,7 +2174,8 @@ int sb_init_dio_done_wq(struct super_block *sb) { struct workqueue_struct *old; struct workqueue_struct *wq =3D alloc_workqueue("dio/%s", - WQ_MEM_RECLAIM, 0, + WQ_MEM_RECLAIM | WQ_PERCPU, + 0, sb->s_id); if (!wq) return -ENOMEM; diff --git a/fs/verity/verify.c b/fs/verity/verify.c index 4fcad0825a12..b8f53d1cfd20 100644 --- a/fs/verity/verify.c +++ b/fs/verity/verify.c @@ -357,7 +357,7 @@ void __init fsverity_init_workqueue(void) * latency on ARM64. */ fsverity_read_workqueue =3D alloc_workqueue("fsverity_read_queue", - WQ_HIGHPRI, + WQ_HIGHPRI | WQ_PERCPU, num_online_cpus()); if (!fsverity_read_workqueue) panic("failed to allocate fsverity_read_queue"); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 6493bdb57351..3fecb066eeb3 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1489,8 +1489,7 @@ xlog_alloc_log( log->l_iclog->ic_prev =3D prev_iclog; /* re-write 1st prev ptr */ =20 log->l_ioend_workqueue =3D alloc_workqueue("xfs-log/%s", - XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM | - WQ_HIGHPRI), + XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_PERCPU), 0, mp->m_super->s_id); if (!log->l_ioend_workqueue) goto out_free_iclog; diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c index d0f5b403bdbe..152032f68013 100644 --- a/fs/xfs/xfs_mru_cache.c +++ b/fs/xfs/xfs_mru_cache.c @@ -293,7 +293,8 @@ int xfs_mru_cache_init(void) { xfs_mru_reap_wq =3D alloc_workqueue("xfs_mru_cache", - XFS_WQFLAGS(WQ_MEM_RECLAIM | WQ_FREEZABLE), 1); + XFS_WQFLAGS(WQ_MEM_RECLAIM | WQ_FREEZABLE | WQ_PERCPU), + 1); if (!xfs_mru_reap_wq) return -ENOMEM; return 0; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b2dd0c0bf509..38584c5618f4 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -565,19 +565,19 @@ xfs_init_mount_workqueues( struct xfs_mount *mp) { mp->m_buf_workqueue =3D alloc_workqueue("xfs-buf/%s", - XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM), + XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU), 1, mp->m_super->s_id); if (!mp->m_buf_workqueue) goto out; =20 mp->m_unwritten_workqueue =3D alloc_workqueue("xfs-conv/%s", - XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM), + XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU), 0, mp->m_super->s_id); if (!mp->m_unwritten_workqueue) goto out_destroy_buf; =20 mp->m_reclaim_workqueue =3D alloc_workqueue("xfs-reclaim/%s", - XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM), + XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU), 0, mp->m_super->s_id); if (!mp->m_reclaim_workqueue) goto out_destroy_unwritten; @@ -589,13 +589,14 @@ xfs_init_mount_workqueues( goto out_destroy_reclaim; =20 mp->m_inodegc_wq =3D alloc_workqueue("xfs-inodegc/%s", - XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM), + XFS_WQFLAGS(WQ_FREEZABLE | WQ_MEM_RECLAIM | WQ_PERCPU), 1, mp->m_super->s_id); if (!mp->m_inodegc_wq) goto out_destroy_blockgc; =20 mp->m_sync_workqueue =3D alloc_workqueue("xfs-sync/%s", - XFS_WQFLAGS(WQ_FREEZABLE), 0, mp->m_super->s_id); + XFS_WQFLAGS(WQ_FREEZABLE | WQ_PERCPU), 0, + mp->m_super->s_id); if (!mp->m_sync_workqueue) goto out_destroy_inodegc; =20 @@ -2499,8 +2500,8 @@ xfs_init_workqueues(void) * AGs in all the filesystems mounted. Hence use the default large * max_active value for this workqueue. */ - xfs_alloc_wq =3D alloc_workqueue("xfsalloc", - XFS_WQFLAGS(WQ_MEM_RECLAIM | WQ_FREEZABLE), 0); + xfs_alloc_wq =3D alloc_workqueue("xfsalloc", XFS_WQFLAGS(WQ_MEM_RECLAIM |= WQ_FREEZABLE | WQ_PERCPU), + 0); if (!xfs_alloc_wq) return -ENOMEM; =20 --=20 2.51.0