On Mon, Apr 18, 2022 at 10:30:47PM +0900, Tetsuo Handa wrote: > Flushing system-wide workqueues is dangerous and will be forbidden. > Replace system_unbound_wq with local ib_unbound_wq. I don't really like this patch, the whole reason to get rid of flushing the system_wq is due to unknowable interactions between work on the queue. Creating a subsystem wide WQ is creating the same problem, just in a microcosm. The flush_work exists because of this: > @@ -1602,7 +1604,7 @@ void ib_unregister_device_queued(struct ib_device *ib_dev) > WARN_ON(!refcount_read(&ib_dev->refcount)); > WARN_ON(!ib_dev->ops.dealloc_driver); > get_device(&ib_dev->dev); > - if (!queue_work(system_unbound_wq, &ib_dev->unregistration_work)) > + if (!queue_work(ib_unbound_wq, &ib_dev->unregistration_work)) > put_device(&ib_dev->dev); > } Which fires off a work that must be completed before the module is unloaded. It seems like a big waste to create an entire WQ just for a single infrequent user like this. Is there some other solution? Jason