diff options
Diffstat (limited to 'tools/io_uring/io_uring-cp.c')
| -rw-r--r-- | tools/io_uring/io_uring-cp.c | 21 |
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 | ||
