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