[RFC PATCH 0/6] fs: Move long delayed work on system_dfl_long_wq

Marco Crivellari posted 6 patches 1 month ago
fs/affs/super.c    | 2 +-
fs/fuse/dax.c      | 2 +-
fs/hfs/super.c     | 2 +-
fs/hfsplus/super.c | 2 +-
fs/jffs2/wbuf.c    | 2 +-
fs/ufs/super.c     | 2 +-
6 files changed, 6 insertions(+), 6 deletions(-)
[RFC PATCH 0/6] fs: Move long delayed work on system_dfl_long_wq
Posted by Marco Crivellari 1 month ago
Hello,

Currently the code uses the per-cpu workqueue system_long_wq to schedule
long running works.

Unbound works could benefit from scheduler task placement, to optimize
performance and power consumption. Another good reason to have this unbound,
is the "queue_delayed_work()" function, used to enqueue the work item.
More details on this will follow in the next section.

Recently, a new unbound workqueue specific for long running work has been
added:

    c116737e972e ("workqueue: Add system_dfl_long_wq for long unbound works")

~~~ Details about queue_delayed_work ~~~

system_long_wq is a per-cpu workqueue and it is used as a parameter of
queue_delayed_work(). This function schedule an item that it will later
be enqueued (once the timer will fire). __queue_delayed_work() does the job
receiving as "cpu" WORK_CPU_UNBOUND:

    if (housekeeping_enabled(HK_TYPE_TIMER)) {
    //      [....]
    } else {
            if (likely(cpu == WORK_CPU_UNBOUND))
                    add_timer_global(timer);
            else
                    add_timer_on(timer, cpu);
    }

The timer is global, so can fire everywhere, and the work item will be
enqueued where the timer fired.

Since the workqueue work doesn't rely on per-cpu variables, there is no
obvious reason that justify the use of a per-cpu workqueue. So change the
workqueue with the new system_dfl_long_wq, so that the used workqueue is
now unbound and can benefit from scheduler task placement.

Thanks!

Marco Crivellari (6):
  ufs: Move long delayed work on system_dfl_long_wq
  fs/jffs2: Move long delayed work on system_dfl_long_wq
  hfsplus: Move long delayed work on system_dfl_long_wq
  hfs: Move long delayed work on system_dfl_long_wq
  fuse: dax: Move long delayed work on system_dfl_long_wq
  affs: Move long delayed work on system_dfl_long_wq

 fs/affs/super.c    | 2 +-
 fs/fuse/dax.c      | 2 +-
 fs/hfs/super.c     | 2 +-
 fs/hfsplus/super.c | 2 +-
 fs/jffs2/wbuf.c    | 2 +-
 fs/ufs/super.c     | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

-- 
2.53.0
Re: [RFC PATCH 0/6] fs: Move long delayed work on system_dfl_long_wq
Posted by Marco Crivellari 1 week ago
Hi,

On Fri, May 8, 2026 at 3:45 PM Marco Crivellari
<marco.crivellari@suse.com> wrote:
> [...]
> Marco Crivellari (6):
>   ufs: Move long delayed work on system_dfl_long_wq
>   fs/jffs2: Move long delayed work on system_dfl_long_wq
>   hfsplus: Move long delayed work on system_dfl_long_wq
>   hfs: Move long delayed work on system_dfl_long_wq
>   fuse: dax: Move long delayed work on system_dfl_long_wq
>   affs: Move long delayed work on system_dfl_long_wq
>
>  fs/affs/super.c    | 2 +-
>  fs/fuse/dax.c      | 2 +-
>  fs/hfs/super.c     | 2 +-
>  fs/hfsplus/super.c | 2 +-
>  fs/jffs2/wbuf.c    | 2 +-
>  fs/ufs/super.c     | 2 +-
>  6 files changed, 6 insertions(+), 6 deletions(-)

Gentle ping.

Thanks!

-- 

Marco Crivellari

SUSE Labs