• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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