fix: io_uring sqpoll issue_time empty when kernel not yet read sq
authorJueji Yang <jueji.yang@gmail.com>
Thu, 6 Jul 2023 12:07:28 +0000 (20:07 +0800)
committerGitHub <noreply@github.com>
Thu, 6 Jul 2023 12:07:28 +0000 (20:07 +0800)
In io_uring sqpoll mode, when kernel side thread has not yet read
the sqring before second fio_ioring_commit() called, the
sq_ring.head will remain the same. The second
fio_ioring_commit() will initialize the wrong io_u's issue_time.
The old(in head) io_u‘s issue_time will to be initialized twice and
new(in tail - 1) io_u's issue_time will not to be initialized.
This problem will cause clat is weird, sometimes larger than lat.

Signed-off-by: Jueji Yang <jueji.yang@gmail.com>
engines/io_uring.c

index 5021239e147d2cf1dcd851a6dcffe2335307114a..9f8e8e6f48a531666faeb664708a8ca8f4ea2a7d 100644 (file)
@@ -646,7 +646,7 @@ static int fio_ioring_commit(struct thread_data *td)
         */
        if (o->sqpoll_thread) {
                struct io_sq_ring *ring = &ld->sq_ring;
-               unsigned start = *ld->sq_ring.head;
+               unsigned start = *ld->sq_ring.tail - ld->queued;
                unsigned flags;
 
                flags = atomic_load_acquire(ring->flags);