One problem with io_uring is that it's completion based I/O where you move ownership of an buffer to the kernel which then writes to it until the operation completes.
This means you might not be able to (sync) cancel an operation occurring in the background.
This makes it harder to integrate into some I/O libraries, as the previous fact conflicts with RAII patterns.
Another think making adaption harder is that the interfaces for reading/writing with io_uring are conceptually slightly different.
Because of this e.g. Tokio currently hasn't switched yet to use io_uring but still uses readiness based async I/O as far as I know. (Which doesn't mean it won't support it in the future.)
This issue might be relevant (mio is internally used by tokio for async I/O): https://github.com/tokio-rs/mio/issues/923
[1]: https://crates.io/crates/rio [2]: https://docs.rs/rio/0.9.4/rio/struct.Completion.html#impl-Fu...