Re: [RFC PATCHES 00/17] IOMMUFD: Deliver IO page faults to user space

From: Jason Gunthorpe
Date: Fri Jun 23 2023 - 09:50:29 EST


On Fri, Jun 23, 2023 at 02:18:38PM +0800, Baolu Lu wrote:

> struct io_uring ring;
>
> io_uring_setup(IOPF_ENTRIES, &ring);
>
> while (1) {
> struct io_uring_prep_read read;
> struct io_uring_cqe *cqe;
>
> read.fd = iopf_fd;
> read.buf = malloc(IOPF_SIZE);
> read.len = IOPF_SIZE;
> read.flags = 0;
>
> io_uring_prep_read(&ring, &read);
> io_uring_submit(&ring);
>
> // Wait for the read to complete
> while ((cqe = io_uring_get_cqe(&ring)) != NULL) {
> // Check if the read completed
> if (cqe->res < 0)
> break;
>
> if (page_fault_read_completion(cqe)) {
> // Get the fault data
> void *data = cqe->buf;
> size_t size = cqe->res;
>
> // Handle the page fault
> handle_page_fault(data);
>
> // Respond the fault
> struct io_uring_prep_write write;
> write.fd = iopf_fd;
> write.buf = malloc(IOPF_RESPONSE_SIZE);
> write.len = IOPF_RESPONSE_SIZE;
> write.flags = 0;
>
> io_uring_prep_write(&ring, &write);
> io_uring_submit(&ring);
> }
>
> // Reap the cqe
> io_uring_cqe_free(&ring, cqe);
> }
> }
>
> Did I understand you correctly?

Yes, basically this is the right idea. There are more complex ways to
use the iouring that would be faster still.

And the kernel side can have support to speed it up as well.

I'm wondering if we should be pushing invalidations on io_uring as
well?

Jason