blob: 69f554c60d96f3717c089d820db84107e7b4eb43 [file] [log] [blame]
Jens Axboee5024352020-02-11 20:34:12 -07001/* SPDX-License-Identifier: MIT */
James Rouzier59df60e2019-09-21 12:32:47 -04002/*
3 * Description: test SQ queue space left
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
Jens Axboe12e24c02020-03-13 08:53:42 -060015static int test_left(void)
James Rouzier59df60e2019-09-21 12:32:47 -040016{
17 struct io_uring_sqe *sqe;
18 struct io_uring ring;
19 int ret, i = 0, s;
20
21 ret = io_uring_queue_init(8, &ring, 0);
22 if (ret) {
Jens Axboea8dc4972020-02-01 09:58:07 -070023 fprintf(stderr, "ring setup failed: %d\n", ret);
James Rouzier59df60e2019-09-21 12:32:47 -040024 return 1;
25
26 }
27
28 if ((s = io_uring_sq_space_left(&ring)) != 8) {
Jens Axboea8dc4972020-02-01 09:58:07 -070029 fprintf(stderr, "Got %d SQEs left, expected %d\n", s, 8);
James Rouzier59df60e2019-09-21 12:32:47 -040030 goto err;
31 }
32
33 i = 0;
34 while ((sqe = io_uring_get_sqe(&ring)) != NULL) {
35 i++;
36 if ((s = io_uring_sq_space_left(&ring)) != 8 - i) {
Jens Axboea8dc4972020-02-01 09:58:07 -070037 fprintf(stderr, "Got %d SQEs left, expected %d\n", s, 8 - i);
James Rouzier59df60e2019-09-21 12:32:47 -040038 goto err;
39 }
40 }
41
42 if (i != 8) {
Jens Axboea8dc4972020-02-01 09:58:07 -070043 fprintf(stderr, "Got %d SQEs, expected %d\n", i, 8);
James Rouzier59df60e2019-09-21 12:32:47 -040044 goto err;
45 }
46
47 io_uring_queue_exit(&ring);
48 return 0;
49err:
50 io_uring_queue_exit(&ring);
51 return 1;
52}
Jens Axboe12e24c02020-03-13 08:53:42 -060053
54static int test_sync(void)
55{
56 struct io_uring_sqe *sqe;
57 struct io_uring ring;
58 int ret, i;
59
60 ret = io_uring_queue_init(32, &ring, 0);
61 if (ret) {
62 fprintf(stderr, "ring setup failed: %d\n", ret);
63 return 1;
64
65 }
66
67 /* prep 8 NOPS */
68 for (i = 0; i < 8; i++) {
69 sqe = io_uring_get_sqe(&ring);
70 if (!sqe) {
71 fprintf(stderr, "get sqe failed\n");
72 goto err;
73 }
74 io_uring_prep_nop(sqe);
75 }
76
77 /* prep known bad command, this should terminate submission */
78 sqe = io_uring_get_sqe(&ring);
79 if (!sqe) {
80 fprintf(stderr, "get sqe failed\n");
81 goto err;
82 }
83 io_uring_prep_nop(sqe);
84 sqe->opcode = 0xfe;
85
86 /* prep 8 NOPS */
87 for (i = 0; i < 8; i++) {
88 sqe = io_uring_get_sqe(&ring);
89 if (!sqe) {
90 fprintf(stderr, "get sqe failed\n");
91 goto err;
92 }
93 io_uring_prep_nop(sqe);
94 }
95
96 /* we should have 8 + 1 + 8 pending now */
97 ret = io_uring_sq_ready(&ring);
98 if (ret != 17) {
99 fprintf(stderr, "%d ready, wanted 17\n", ret);
100 goto err;
101 }
102
103 ret = io_uring_submit(&ring);
104
105 /* should submit 8 successfully, then error #9 and stop */
106 if (ret != 9) {
107 fprintf(stderr, "submitted %d, wanted 9\n", ret);
108 goto err;
109 }
110
111 /* should now have 8 ready, with 9 gone */
112 ret = io_uring_sq_ready(&ring);
113 if (ret != 8) {
114 fprintf(stderr, "%d ready, wanted 8\n", ret);
115 goto err;
116 }
117
118 ret = io_uring_submit(&ring);
119
120 /* the last 8 should submit fine */
121 if (ret != 8) {
122 fprintf(stderr, "submitted %d, wanted 8\n", ret);
123 goto err;
124 }
125
126 ret = io_uring_sq_ready(&ring);
127 if (ret) {
128 fprintf(stderr, "%d ready, wanted 0\n", ret);
129 goto err;
130 }
131
132 io_uring_queue_exit(&ring);
133 return 0;
134err:
135 io_uring_queue_exit(&ring);
136 return 1;
137}
138
139int main(int argc, char *argv[])
140{
141 int ret;
142
Jens Axboea2141fc2020-05-19 17:36:19 -0600143 if (argc > 1)
144 return 0;
145
Jens Axboe12e24c02020-03-13 08:53:42 -0600146 ret = test_left();
147 if (ret) {
148 fprintf(stderr, "test_left failed\n");
149 return ret;
150 }
151
152 ret = test_sync();
153 if (ret) {
154 fprintf(stderr, "test_sync failed\n");
155 return ret;
156 }
157
158 return 0;
159}