aboutsummaryrefslogtreecommitdiffstats
path: root/tools/io_uring/io_uring-cp.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/io_uring/io_uring-cp.c')
-rw-r--r--tools/io_uring/io_uring-cp.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/tools/io_uring/io_uring-cp.c b/tools/io_uring/io_uring-cp.c
index 633f65bb43a7..81461813ec62 100644
--- a/tools/io_uring/io_uring-cp.c
+++ b/tools/io_uring/io_uring-cp.c
@@ -13,6 +13,7 @@
13#include <assert.h> 13#include <assert.h>
14#include <errno.h> 14#include <errno.h>
15#include <inttypes.h> 15#include <inttypes.h>
16#include <sys/types.h>
16#include <sys/stat.h> 17#include <sys/stat.h>
17#include <sys/ioctl.h> 18#include <sys/ioctl.h>
18 19
@@ -85,11 +86,16 @@ static int queue_read(struct io_uring *ring, off_t size, off_t offset)
85 struct io_uring_sqe *sqe; 86 struct io_uring_sqe *sqe;
86 struct io_data *data; 87 struct io_data *data;
87 88
89 data = malloc(size + sizeof(*data));
90 if (!data)
91 return 1;
92
88 sqe = io_uring_get_sqe(ring); 93 sqe = io_uring_get_sqe(ring);
89 if (!sqe) 94 if (!sqe) {
95 free(data);
90 return 1; 96 return 1;
97 }
91 98
92 data = malloc(size + sizeof(*data));
93 data->read = 1; 99 data->read = 1;
94 data->offset = data->first_offset = offset; 100 data->offset = data->first_offset = offset;
95 101
@@ -166,22 +172,23 @@ static int copy_file(struct io_uring *ring, off_t insize)
166 struct io_data *data; 172 struct io_data *data;
167 173
168 if (!got_comp) { 174 if (!got_comp) {
169 ret = io_uring_wait_completion(ring, &cqe); 175 ret = io_uring_wait_cqe(ring, &cqe);
170 got_comp = 1; 176 got_comp = 1;
171 } else 177 } else
172 ret = io_uring_get_completion(ring, &cqe); 178 ret = io_uring_peek_cqe(ring, &cqe);
173 if (ret < 0) { 179 if (ret < 0) {
174 fprintf(stderr, "io_uring_get_completion: %s\n", 180 fprintf(stderr, "io_uring_peek_cqe: %s\n",
175 strerror(-ret)); 181 strerror(-ret));
176 return 1; 182 return 1;
177 } 183 }
178 if (!cqe) 184 if (!cqe)
179 break; 185 break;
180 186
181 data = (struct io_data *) (uintptr_t) cqe->user_data; 187 data = io_uring_cqe_get_data(cqe);
182 if (cqe->res < 0) { 188 if (cqe->res < 0) {
183 if (cqe->res == -EAGAIN) { 189 if (cqe->res == -EAGAIN) {
184 queue_prepped(ring, data); 190 queue_prepped(ring, data);
191 io_uring_cqe_seen(ring, cqe);
185 continue; 192 continue;
186 } 193 }
187 fprintf(stderr, "cqe failed: %s\n", 194 fprintf(stderr, "cqe failed: %s\n",
@@ -193,6 +200,7 @@ static int copy_file(struct io_uring *ring, off_t insize)
193 data->iov.iov_len -= cqe->res; 200 data->iov.iov_len -= cqe->res;
194 data->offset += cqe->res; 201 data->offset += cqe->res;
195 queue_prepped(ring, data); 202 queue_prepped(ring, data);
203 io_uring_cqe_seen(ring, cqe);
196 continue; 204 continue;
197 } 205 }
198 206
@@ -209,6 +217,7 @@ static int copy_file(struct io_uring *ring, off_t insize)
209 free(data); 217 free(data);
210 writes--; 218 writes--;
211 } 219 }
220 io_uring_cqe_seen(ring, cqe);
212 } 221 }
213 } 222 }
214 223