blob: 393178b8520ca4d387ded925467f7efa1f88b640 [file] [log] [blame]
Jens Axboecad057f2020-09-05 11:58:08 -06001/* SPDX-License-Identifier: MIT */
2/*
3 * Description: test SQPOLL with IORING_SETUP_ATTACH_WQ
4 */
5#include <errno.h>
6#include <stdio.h>
7#include <unistd.h>
8#include <stdlib.h>
9#include <string.h>
10#include <fcntl.h>
11#include <sys/types.h>
12#include <sys/poll.h>
13#include <sys/eventfd.h>
14#include <sys/resource.h>
Zhiqiang Liu97499812021-02-21 22:58:12 +080015
16#include "helpers.h"
Jens Axboecad057f2020-09-05 11:58:08 -060017#include "liburing.h"
18
19#define FILE_SIZE (128 * 1024 * 1024)
20#define BS 4096
21#define BUFFERS 64
22
23#define NR_RINGS 4
24
25static struct iovec *vecs;
26
27static int create_buffers(void)
28{
29 int i;
30
Zhiqiang Liu97499812021-02-21 22:58:12 +080031 vecs = io_uring_malloc(BUFFERS * sizeof(struct iovec));
Jens Axboecad057f2020-09-05 11:58:08 -060032 for (i = 0; i < BUFFERS; i++) {
33 if (posix_memalign(&vecs[i].iov_base, BS, BS))
34 return 1;
35 vecs[i].iov_len = BS;
36 }
37
38 return 0;
39}
40
41static int create_file(const char *file)
42{
43 ssize_t ret;
44 char *buf;
45 int fd;
46
Zhiqiang Liu97499812021-02-21 22:58:12 +080047 buf = io_uring_malloc(FILE_SIZE);
Jens Axboecad057f2020-09-05 11:58:08 -060048 memset(buf, 0xaa, FILE_SIZE);
49
50 fd = open(file, O_WRONLY | O_CREAT, 0644);
51 if (fd < 0) {
52 perror("open file");
53 return 1;
54 }
55 ret = write(fd, buf, FILE_SIZE);
56 close(fd);
57 return ret != FILE_SIZE;
58}
59
60static int wait_io(struct io_uring *ring, int nr_ios)
61{
62 struct io_uring_cqe *cqe;
63
64 while (nr_ios) {
Pavel Begunkov989d7cb2021-02-11 23:08:15 +000065 int ret = io_uring_wait_cqe(ring, &cqe);
66
67 if (ret == -EAGAIN) {
68 continue;
69 } else if (ret) {
70 fprintf(stderr, "io_uring_wait_cqe failed %i\n", ret);
71 return 1;
72 }
Jens Axboe48afc112020-09-08 07:42:41 -060073 if (cqe->res != BS) {
74 fprintf(stderr, "Unexpected ret %d\n", cqe->res);
75 return 1;
76 }
Jens Axboecad057f2020-09-05 11:58:08 -060077 io_uring_cqe_seen(ring, cqe);
78 nr_ios--;
79 }
80
81 return 0;
82}
83
Jens Axboe8f4329b2020-09-09 09:39:26 -060084static int queue_io(struct io_uring *ring, int fd, int nr_ios)
Jens Axboecad057f2020-09-05 11:58:08 -060085{
86 unsigned long off;
Jens Axboe8f4329b2020-09-09 09:39:26 -060087 int i;
Jens Axboecad057f2020-09-05 11:58:08 -060088
89 i = 0;
90 off = 0;
91 while (nr_ios) {
92 struct io_uring_sqe *sqe;
93
94 sqe = io_uring_get_sqe(ring);
95 if (!sqe)
96 break;
97 io_uring_prep_read(sqe, fd, vecs[i].iov_base, vecs[i].iov_len, off);
98 nr_ios--;
99 i++;
100 off += BS;
101 }
102
Jens Axboed4766742020-09-09 11:11:53 -0600103 io_uring_submit(ring);
104 return i;
Jens Axboecad057f2020-09-05 11:58:08 -0600105}
106
107int main(int argc, char *argv[])
108{
109 struct io_uring rings[NR_RINGS];
110 int rets[NR_RINGS];
111 unsigned long ios;
Jens Axboe8f4329b2020-09-09 09:39:26 -0600112 int i, ret, fd;
Jens Axboecad057f2020-09-05 11:58:08 -0600113 char *fname;
114
115 if (argc > 1) {
116 fname = argv[1];
117 } else {
118 fname = ".basic-rw";
119 if (create_file(fname)) {
120 fprintf(stderr, "file creation failed\n");
121 goto err;
122 }
123 }
124
125 if (create_buffers()) {
126 fprintf(stderr, "file creation failed\n");
127 goto err;
128 }
129
Jens Axboe8f4329b2020-09-09 09:39:26 -0600130 fd = open(fname, O_RDONLY | O_DIRECT);
131 if (fd < 0) {
132 perror("open");
133 return -1;
134 }
135
Jens Axboecad057f2020-09-05 11:58:08 -0600136 for (i = 0; i < NR_RINGS; i++) {
137 struct io_uring_params p = { };
138
139 p.flags = IORING_SETUP_SQPOLL;
140 if (i) {
141 p.wq_fd = rings[0].ring_fd;
142 p.flags |= IORING_SETUP_ATTACH_WQ;
143 }
144 ret = io_uring_queue_init_params(BUFFERS, &rings[i], &p);
145 if (ret) {
146 fprintf(stderr, "queue_init: %d/%d\n", ret, i);
147 goto err;
148 }
Jens Axboe48afc112020-09-08 07:42:41 -0600149 /* no sharing for non-fixed either */
150 if (!(p.features & IORING_FEAT_SQPOLL_NONFIXED)) {
151 fprintf(stdout, "No SQPOLL sharing, skipping\n");
152 return 0;
153 }
Jens Axboecad057f2020-09-05 11:58:08 -0600154 }
155
156 ios = 0;
157 while (ios < (FILE_SIZE / BS)) {
158 for (i = 0; i < NR_RINGS; i++) {
Jens Axboe8f4329b2020-09-09 09:39:26 -0600159 ret = queue_io(&rings[i], fd, BUFFERS);
Jens Axboecad057f2020-09-05 11:58:08 -0600160 if (ret < 0)
161 goto err;
162 rets[i] = ret;
163 }
Jens Axboe48afc112020-09-08 07:42:41 -0600164 for (i = 0; i < NR_RINGS; i++) {
165 if (wait_io(&rings[i], rets[i]))
166 goto err;
167 }
Jens Axboecad057f2020-09-05 11:58:08 -0600168 ios += BUFFERS;
169 }
170
Jens Axboe21f6f6e2020-09-09 09:30:50 -0600171 if (fname != argv[1])
172 unlink(fname);
Jens Axboecad057f2020-09-05 11:58:08 -0600173 return 0;
174err:
175 if (fname != argv[1])
176 unlink(fname);
177 return 1;
178}