1 /* SPDX-License-Identifier: MIT */
2 /*
3 * Description: test CQ ready
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
queue_n_nops(struct io_uring * ring,int n)15 static int queue_n_nops(struct io_uring *ring, int n)
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 }
29
30 ret = io_uring_submit(ring);
31 if (ret < n) {
32 printf("Submitted only %d\n", ret);
33 goto err;
34 } else if (ret < 0) {
35 printf("sqe submit failed: %d\n", ret);
36 goto err;
37 }
38
39 return 0;
40 err:
41 return 1;
42 }
43
44 #define CHECK_READY(ring, expected) do {\
45 ready = io_uring_cq_ready((ring));\
46 if (ready != expected) {\
47 printf("Got %d CQs ready, expected %d\n", ready, expected);\
48 goto err;\
49 }\
50 } while(0)
51
main(int argc,char * argv[])52 int main(int argc, char *argv[])
53 {
54 struct io_uring ring;
55 int ret;
56 unsigned ready;
57
58 if (argc > 1)
59 return 0;
60
61 ret = io_uring_queue_init(4, &ring, 0);
62 if (ret) {
63 printf("ring setup failed\n");
64 return 1;
65
66 }
67
68 CHECK_READY(&ring, 0);
69 if (queue_n_nops(&ring, 4))
70 goto err;
71
72 CHECK_READY(&ring, 4);
73 io_uring_cq_advance(&ring, 4);
74 CHECK_READY(&ring, 0);
75 if (queue_n_nops(&ring, 4))
76 goto err;
77
78 CHECK_READY(&ring, 4);
79
80 io_uring_cq_advance(&ring, 1);
81 CHECK_READY(&ring, 3);
82
83 io_uring_cq_advance(&ring, 2);
84 CHECK_READY(&ring, 1);
85
86 io_uring_cq_advance(&ring, 1);
87 CHECK_READY(&ring, 0);
88
89 io_uring_queue_exit(&ring);
90 return 0;
91 err:
92 io_uring_queue_exit(&ring);
93 return 1;
94 }
95