• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: MIT */
2 /*
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 #include "helpers.h"
15 
queue_n_nops(struct io_uring * ring,int n,int offset)16 static int queue_n_nops(struct io_uring *ring, int n, int offset)
17 {
18 	struct io_uring_sqe *sqe;
19 	int i, ret;
20 
21 	for (i = 0; i < n; i++) {
22 		sqe = io_uring_get_sqe(ring);
23 		if (!sqe) {
24 			printf("get sqe failed\n");
25 			goto err;
26 		}
27 
28 		io_uring_prep_nop(sqe);
29 		sqe->user_data = i + offset;
30 	}
31 
32 	ret = io_uring_submit(ring);
33 	if (ret < n) {
34 		printf("Submitted only %d\n", ret);
35 		goto err;
36 	} else if (ret < 0) {
37 		printf("sqe submit failed: %d\n", ret);
38 		goto err;
39 	}
40 
41 	return 0;
42 err:
43 	return 1;
44 }
45 
46 #define CHECK_BATCH(ring, got, cqes, count, expected) do {\
47 	got = io_uring_peek_batch_cqe((ring), cqes, count);\
48 	if (got != expected) {\
49 		printf("Got %d CQs, expected %d\n", got, expected);\
50 		goto err;\
51 	}\
52 } while(0)
53 
main(int argc,char * argv[])54 int main(int argc, char *argv[])
55 {
56 	struct io_uring_cqe *cqes[8];
57 	struct io_uring ring;
58 	int ret, i;
59 	unsigned got;
60 
61 	if (argc > 1)
62 		return T_EXIT_SKIP;
63 
64 	ret = io_uring_queue_init(4, &ring, 0);
65 	if (ret) {
66 		printf("ring setup failed\n");
67 		return T_EXIT_FAIL;
68 
69 	}
70 
71 	CHECK_BATCH(&ring, got, cqes, 4, 0);
72 	if (queue_n_nops(&ring, 4, 0))
73 		goto err;
74 
75 	CHECK_BATCH(&ring, got, cqes, 4, 4);
76 	for (i=0;i<4;i++) {
77 		if (i != cqes[i]->user_data) {
78 			printf("Got user_data %" PRIu64 ", expected %d\n",
79 				(uint64_t) cqes[i]->user_data, i);
80 			goto err;
81 		}
82 	}
83 
84 	if (queue_n_nops(&ring, 4, 4))
85 		goto err;
86 
87 	io_uring_cq_advance(&ring, 4);
88 	CHECK_BATCH(&ring, got, cqes, 4, 4);
89 	for (i=0;i<4;i++) {
90 		if (i + 4 != cqes[i]->user_data) {
91 			printf("Got user_data %" PRIu64 ", expected %d\n",
92 				(uint64_t) cqes[i]->user_data, i + 4);
93 			goto err;
94 		}
95 	}
96 
97 	io_uring_cq_advance(&ring, 8);
98 	io_uring_queue_exit(&ring);
99 	return T_EXIT_PASS;
100 err:
101 	io_uring_queue_exit(&ring);
102 	return T_EXIT_FAIL;
103 }
104