xref: /aosp_15_r20/external/liburing/test/cq-full.c (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Description: test CQ ring overflow
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 
main(int argc,char * argv[])44 int main(int argc, char *argv[])
45 {
46 	struct io_uring_cqe *cqe;
47 	struct io_uring_params p;
48 	struct io_uring ring;
49 	int i, ret;
50 
51 	if (argc > 1)
52 		return 0;
53 
54 	memset(&p, 0, sizeof(p));
55 	ret = io_uring_queue_init_params(4, &ring, &p);
56 	if (ret) {
57 		printf("ring setup failed\n");
58 		return 1;
59 
60 	}
61 
62 	if (queue_n_nops(&ring, 4))
63 		goto err;
64 	if (queue_n_nops(&ring, 4))
65 		goto err;
66 	if (queue_n_nops(&ring, 4))
67 		goto err;
68 
69 	i = 0;
70 	do {
71 		ret = io_uring_peek_cqe(&ring, &cqe);
72 		if (ret < 0) {
73 			if (ret == -EAGAIN)
74 				break;
75 			printf("wait completion %d\n", ret);
76 			goto err;
77 		}
78 		io_uring_cqe_seen(&ring, cqe);
79 		if (!cqe)
80 			break;
81 		i++;
82 	} while (1);
83 
84 	if (i < 8 ||
85 	    ((*ring.cq.koverflow != 4) && !(p.features & IORING_FEAT_NODROP))) {
86 		printf("CQ overflow fail: %d completions, %u overflow\n", i,
87 				*ring.cq.koverflow);
88 		goto err;
89 	}
90 
91 	io_uring_queue_exit(&ring);
92 	return 0;
93 err:
94 	io_uring_queue_exit(&ring);
95 	return 1;
96 }
97