aboutsummaryrefslogtreecommitdiff
path: root/test/io-cancel.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/io-cancel.c')
-rw-r--r--test/io-cancel.c53
1 files changed, 36 insertions, 17 deletions
diff --git a/test/io-cancel.c b/test/io-cancel.c
index 9a36dd9..d5e3ae9 100644
--- a/test/io-cancel.c
+++ b/test/io-cancel.c
@@ -11,7 +11,7 @@
#include <sys/types.h>
#include <sys/time.h>
#include <sys/wait.h>
-#include <sys/poll.h>
+#include <poll.h>
#include "helpers.h"
#include "liburing.h"
@@ -115,7 +115,7 @@ static int do_io(struct io_uring *ring, int fd, int do_write)
return 0;
}
-static int start_cancel(struct io_uring *ring, int do_partial)
+static int start_cancel(struct io_uring *ring, int do_partial, int async_cancel)
{
struct io_uring_sqe *sqe;
int i, ret, submitted = 0;
@@ -128,7 +128,9 @@ static int start_cancel(struct io_uring *ring, int do_partial)
fprintf(stderr, "sqe get failed\n");
goto err;
}
- io_uring_prep_cancel(sqe, (void *) (unsigned long) i + 1, 0);
+ io_uring_prep_cancel64(sqe, i + 1, 0);
+ if (async_cancel)
+ sqe->flags |= IOSQE_ASYNC;
sqe->user_data = 0;
submitted++;
}
@@ -148,7 +150,8 @@ err:
* the submitted IO. This is done to verify that cancelling one piece of IO doesn't
* impact others.
*/
-static int test_io_cancel(const char *file, int do_write, int do_partial)
+static int test_io_cancel(const char *file, int do_write, int do_partial,
+ int async_cancel)
{
struct io_uring ring;
struct timeval start_tv;
@@ -179,7 +182,7 @@ static int test_io_cancel(const char *file, int do_write, int do_partial)
goto err;
/* sleep for 1/3 of the total time, to allow some to start/complete */
usleep(usecs / 3);
- if (start_cancel(&ring, do_partial))
+ if (start_cancel(&ring, do_partial, async_cancel))
goto err;
to_wait = BUFFERS;
if (do_partial)
@@ -243,7 +246,7 @@ static int test_dont_cancel_another_ring(void)
fprintf(stderr, "%s: failed to get sqe\n", __FUNCTION__);
return 1;
}
- io_uring_prep_cancel(sqe, (void *) (unsigned long)1, 0);
+ io_uring_prep_cancel64(sqe, 1, 0);
sqe->user_data = 2;
ret = io_uring_submit(&ring2);
@@ -323,7 +326,7 @@ static int test_cancel_req_across_fork(void)
fprintf(stderr, "%s: failed to get sqe\n", __FUNCTION__);
return 1;
}
- io_uring_prep_cancel(sqe, (void *) (unsigned long)1, 0);
+ io_uring_prep_cancel64(sqe, 1, 0);
sqe->user_data = 2;
ret = io_uring_submit(&ring);
@@ -338,8 +341,21 @@ static int test_cancel_req_across_fork(void)
fprintf(stderr, "wait_cqe=%d\n", ret);
return 1;
}
- if ((cqe->user_data == 1 && cqe->res != -EINTR) ||
- (cqe->user_data == 2 && cqe->res != -EALREADY)) {
+ switch (cqe->user_data) {
+ case 1:
+ if (cqe->res != -EINTR &&
+ cqe->res != -ECANCELED) {
+ fprintf(stderr, "%i %i\n", (int)cqe->user_data, cqe->res);
+ exit(1);
+ }
+ break;
+ case 2:
+ if (cqe->res != -EALREADY && cqe->res) {
+ fprintf(stderr, "%i %i\n", (int)cqe->user_data, cqe->res);
+ exit(1);
+ }
+ break;
+ default:
fprintf(stderr, "%i %i\n", (int)cqe->user_data, cqe->res);
exit(1);
}
@@ -483,6 +499,7 @@ static int test_sqpoll_cancel_iowq_requests(void)
int main(int argc, char *argv[])
{
+ const char *fname = ".io-cancel-test";
int i, ret;
if (argc > 1)
@@ -508,24 +525,26 @@ int main(int argc, char *argv[])
return 1;
}
- t_create_file(".basic-rw", FILE_SIZE);
+ t_create_file(fname, FILE_SIZE);
vecs = t_create_buffers(BUFFERS, BS);
- for (i = 0; i < 4; i++) {
- int v1 = (i & 1) != 0;
- int v2 = (i & 2) != 0;
+ for (i = 0; i < 8; i++) {
+ int write = (i & 1) != 0;
+ int partial = (i & 2) != 0;
+ int async = (i & 4) != 0;
- ret = test_io_cancel(".basic-rw", v1, v2);
+ ret = test_io_cancel(fname, write, partial, async);
if (ret) {
- fprintf(stderr, "test_io_cancel %d %d failed\n", v1, v2);
+ fprintf(stderr, "test_io_cancel %d %d %d failed\n",
+ write, partial, async);
goto err;
}
}
- unlink(".basic-rw");
+ unlink(fname);
return 0;
err:
- unlink(".basic-rw");
+ unlink(fname);
return 1;
}