This is not caused by a locking bug. The freed structure is a task_struct which is passed by io_sq_thread() to try_to_wake_up(). So the culprit is probably in the io_uring code. cc'ing the io_uring developers for further review.
Thanks. This also seems to involve sqpoll.c and io_uring.c. I'm sending an email to both Pavel Begunkov and Jens Axboe, with a cc to io_uring.