> Hello, > > On Mon, May 13, 2024 at 02:53:41PM +0200, Håkon Bugge wrote: > diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h > index 158784dd189ab..09ecc692ffcae 100644 > --- a/include/linux/workqueue.h > +++ b/include/linux/workqueue.h > @@ -398,6 +398,8 @@ enum wq_flags { > __WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */ > __WQ_ORDERED = 1 << 17, /* internal: workqueue is ordered */ > __WQ_LEGACY = 1 << 18, /* internal: create*_workqueue() */ > + __WQ_NOIO = 1 << 19, /* internal: execute work with NOIO */ > + __WQ_NOFS = 1 << 20, /* internal: execute work with NOFS */ > > I don't quite understand how this is supposed to be used. The flags are > marked internal but nothing actually sets them. Looking at later patches, I > don't see any usages either. What am I missing? Hi Tejun, Thank you for so quickly looking into this. You are quite right. During re-basing, I missed a hunk from alloc_workqueue(), where I sample current->flags for PF_MALLOC_{NOIO,NOFS} bits and sets the corresponding bits in wq->flags. Fixed in v2. > @@ -3184,6 +3189,12 @@ __acquires(&pool->lock) > > lockdep_copy_map(&lockdep_map, &work->lockdep_map); > #endif > + /* Set inherited alloc flags */ > + if (use_noio_allocs) > + noio_flags = memalloc_noio_save(); > + if (use_nofs_allocs) > + nofs_flags = memalloc_nofs_save(); > + > /* ensure we're on the correct CPU */ > WARN_ON_ONCE(!(pool->flags & POOL_DISASSOCIATED) && > raw_smp_processor_id() != pool->cpu); > @@ -3320,6 +3331,12 @@ __acquires(&pool->lock) > > /* must be the last step, see the function comment */ > pwq_dec_nr_in_flight(pwq, work_data); > + > + /* Restore alloc flags */ > + if (use_nofs_allocs) > + memalloc_nofs_restore(nofs_flags); > + if (use_noio_allocs) > + memalloc_noio_restore(noio_flags); > > Also, this looks like something that the work function can do on entry and > before exit, no? It _can_ be done in the work functions, but that will be a code sprawl. Only in RDS, we have the following worker functions: rds_ib_odp_mr_worker(); rds_ib_mr_pool_flush_worker() rds_ib_odp_mr_worker() rds_tcp_accept_worker() rds_connect_worker() rds_send_worker() rds_recv_worker() rds_shutdown_worker() adding the ones from ib_cm, rdma_cm, mlx5_ib, and mlx5_core, I strongly prefer to have it in one place. Thxs, Håkon