1 /* SPDX-License-Identifier: MIT */
2 /*
3 * Description: run various nop tests
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
test_single_nop(struct io_uring * ring)15 static int test_single_nop(struct io_uring *ring)
16 {
17 struct io_uring_cqe *cqe;
18 struct io_uring_sqe *sqe;
19 int ret;
20
21 sqe = io_uring_get_sqe(ring);
22 if (!sqe) {
23 fprintf(stderr, "get sqe failed\n");
24 goto err;
25 }
26
27 io_uring_prep_nop(sqe);
28
29 ret = io_uring_submit(ring);
30 if (ret <= 0) {
31 fprintf(stderr, "sqe submit failed: %d\n", ret);
32 goto err;
33 }
34
35 ret = io_uring_wait_cqe(ring, &cqe);
36 if (ret < 0) {
37 fprintf(stderr, "wait completion %d\n", ret);
38 goto err;
39 }
40
41 io_uring_cqe_seen(ring, cqe);
42 return 0;
43 err:
44 return 1;
45 }
46
test_barrier_nop(struct io_uring * ring)47 static int test_barrier_nop(struct io_uring *ring)
48 {
49 struct io_uring_cqe *cqe;
50 struct io_uring_sqe *sqe;
51 int ret, i;
52
53 for (i = 0; i < 8; i++) {
54 sqe = io_uring_get_sqe(ring);
55 if (!sqe) {
56 fprintf(stderr, "get sqe failed\n");
57 goto err;
58 }
59
60 io_uring_prep_nop(sqe);
61 if (i == 4)
62 sqe->flags = IOSQE_IO_DRAIN;
63 }
64
65 ret = io_uring_submit(ring);
66 if (ret < 0) {
67 fprintf(stderr, "sqe submit failed: %d\n", ret);
68 goto err;
69 } else if (ret < 8) {
70 fprintf(stderr, "Submitted only %d\n", ret);
71 goto err;
72 }
73
74 for (i = 0; i < 8; i++) {
75 ret = io_uring_wait_cqe(ring, &cqe);
76 if (ret < 0) {
77 fprintf(stderr, "wait completion %d\n", ret);
78 goto err;
79 }
80 io_uring_cqe_seen(ring, cqe);
81 }
82
83 return 0;
84 err:
85 return 1;
86 }
87
main(int argc,char * argv[])88 int main(int argc, char *argv[])
89 {
90 struct io_uring ring;
91 int ret;
92
93 if (argc > 1)
94 return 0;
95
96 ret = io_uring_queue_init(8, &ring, 0);
97 if (ret) {
98 fprintf(stderr, "ring setup failed: %d\n", ret);
99 return 1;
100 }
101
102 ret = test_single_nop(&ring);
103 if (ret) {
104 fprintf(stderr, "test_single_nop failed\n");
105 return ret;
106 }
107
108 ret = test_barrier_nop(&ring);
109 if (ret) {
110 fprintf(stderr, "test_barrier_nop failed\n");
111 return ret;
112 }
113
114 return 0;
115 }
116