On 4/29/22 4:18 AM, Hao Xu wrote: > @@ -1030,6 +1101,7 @@ static bool io_wq_work_match_item(struct io_wq_work *work, void *data) > static void io_wqe_enqueue(struct io_wqe *wqe, struct io_wq_work *work) > { > struct io_wqe_acct *acct = io_work_get_acct(wqe, work); > + struct io_wqe_acct *fixed_acct; > struct io_cb_cancel_data match; > unsigned work_flags = work->flags; > bool do_create; > @@ -1044,8 +1116,14 @@ static void io_wqe_enqueue(struct io_wqe *wqe, struct io_wq_work *work) > return; > } > > + fixed_acct = io_get_acct(wqe, !acct->index, true); > + if (fixed_acct->fixed_worker_registered && !io_wq_is_hashed(work)) { > + if (io_wqe_insert_private_work(wqe, work, fixed_acct)) > + return; > + } > + As per previous email, I was going to comment back saying "why don't we just always do hashed work on the non-fixed workers?" - but that's already what you are doing. Isn't this fine, does anything else need to get done here in terms of hashed work and fixed workers? If you need per-iowq serialization, then you don't get a fixed worker. -- Jens Axboe