selftest/net: adjust io_uring sendzc notif handling
[platform/kernel/linux-starfive.git] / tools / testing / selftests / net / io_uring_zerocopy_tx.c
index 8ce48ac..1542877 100644 (file)
@@ -400,7 +400,6 @@ static void do_tx(int domain, int type, int protocol)
                                                   cfg_payload_len, msg_flags);
                                sqe->user_data = NONZC_TAG;
                        } else {
-                               compl_cqes++;
                                io_uring_prep_sendzc(sqe, fd, payload,
                                                     cfg_payload_len,
                                                     msg_flags, zc_flags);
@@ -430,18 +429,23 @@ static void do_tx(int domain, int type, int protocol)
                        if (cqe->flags & IORING_CQE_F_NOTIF) {
                                if (cqe->flags & IORING_CQE_F_MORE)
                                        error(1, -EINVAL, "invalid notif flags");
+                               if (compl_cqes <= 0)
+                                       error(1, -EINVAL, "notification mismatch");
                                compl_cqes--;
                                i--;
-                       } else if (cqe->res <= 0) {
-                               if (cqe->flags & IORING_CQE_F_MORE)
-                                       error(1, cqe->res, "more with a failed send");
-                               error(1, cqe->res, "send failed");
-                       } else {
-                               if (cqe->user_data == ZC_TAG &&
-                                   !(cqe->flags & IORING_CQE_F_MORE))
-                                       error(1, cqe->res, "missing more flag");
+                               io_uring_cqe_seen(&ring);
+                               continue;
+                       }
+                       if (cqe->flags & IORING_CQE_F_MORE) {
+                               if (cqe->user_data != ZC_TAG)
+                                       error(1, cqe->res, "unexpected F_MORE");
+                               compl_cqes++;
+                       }
+                       if (cqe->res >= 0) {
                                packets++;
                                bytes += cqe->res;
+                       } else if (cqe->res != -EAGAIN) {
+                               error(1, cqe->res, "send failed");
                        }
                        io_uring_cqe_seen(&ring);
                }