blob: ee7537c2875e52909e0092e896f84840bffef14e [file] [log] [blame]
Jens Axboee5024352020-02-11 20:34:12 -07001/* SPDX-License-Identifier: MIT */
James Rouzier0b88d722019-09-25 15:35:06 -04002/*
3 * Description: test CQ peek-batch
4 *
5 */
6#include <errno.h>
7#include <stdio.h>
8#include <unistd.h>
9#include <stdlib.h>
10#include <string.h>
11#include <fcntl.h>
12
13#include "liburing.h"
14
15static int queue_n_nops(struct io_uring *ring, int n, int offset)
16{
17 struct io_uring_sqe *sqe;
18 int i, ret;
19
20 for (i = 0; i < n; i++) {
21 sqe = io_uring_get_sqe(ring);
22 if (!sqe) {
23 printf("get sqe failed\n");
24 goto err;
25 }
26
27 io_uring_prep_nop(sqe);
28 sqe->user_data = i + offset;
29 }
30
31 ret = io_uring_submit(ring);
32 if (ret < n) {
33 printf("Submitted only %d\n", ret);
34 goto err;
35 } else if (ret < 0) {
36 printf("sqe submit failed: %d\n", ret);
37 goto err;
38 }
39
40 return 0;
41err:
42 return 1;
43}
44
45#define CHECK_BATCH(ring, got, cqes, count, expected) do {\
46 got = io_uring_peek_batch_cqe((ring), cqes, count);\
47 if (got != expected) {\
48 printf("Got %d CQs, expected %d\n", got, expected);\
49 goto err;\
50 }\
51} while(0)
52
53int main(int argc, char *argv[])
54{
55 struct io_uring_cqe *cqes[8];
56 struct io_uring ring;
57 int ret, i;
58 unsigned got;
59
Jens Axboea2141fc2020-05-19 17:36:19 -060060 if (argc > 1)
61 return 0;
62
James Rouzier0b88d722019-09-25 15:35:06 -040063 ret = io_uring_queue_init(4, &ring, 0);
64 if (ret) {
65 printf("ring setup failed\n");
66 return 1;
67
68 }
69
70 CHECK_BATCH(&ring, got, cqes, 4, 0);
71 if (queue_n_nops(&ring, 4, 0))
72 goto err;
73
74 CHECK_BATCH(&ring, got, cqes, 4, 4);
75 for (i=0;i<4;i++) {
76 if (i != cqes[i]->user_data) {
77 printf("Got user_data %lld, expected %d\n", cqes[i]->user_data, i);
78 goto err;
79 }
80 }
81
82 if (queue_n_nops(&ring, 4, 4))
83 goto err;
84
85 io_uring_cq_advance(&ring, 4);
86 CHECK_BATCH(&ring, got, cqes, 4, 4);
87 for (i=0;i<4;i++) {
88 if (i + 4 != cqes[i]->user_data) {
89 printf("Got user_data %lld, expected %d\n", cqes[i]->user_data, i + 4);
90 goto err;
91 }
92 }
93
94 io_uring_cq_advance(&ring, 8);
95 io_uring_queue_exit(&ring);
96 return 0;
97err:
98 io_uring_queue_exit(&ring);
99 return 1;
100}