xref: /aosp_15_r20/external/liburing/test/cq-ready.c (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
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