diff options
author | zhangyi (F) <yi.zhang@huawei.com> | 2019-10-23 15:12:59 +0800 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2019-10-23 21:41:56 -0600 |
commit | 6cca9e574c931139556a5da336356fbd0cf90af2 (patch) | |
tree | 956ff13f1f3709fdea223e1c27b42e5c6e9894ef | |
parent | 37136cb4423b27dac2fc663b6a0c513b6d7d7ad1 (diff) | |
download | liburing-6cca9e574c931139556a5da336356fbd0cf90af2.tar.gz liburing-6cca9e574c931139556a5da336356fbd0cf90af2.tar.bz2 |
test/timeout: add multi timeout reqs test with different count
Add multi timeout reqs test case which want to test submitting timeout
reqs with different count number, check the return sequence and the
status of each req.
Signed-off-by: zhangyi (F) <yi.zhang@huawei.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | test/timeout.c | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/test/timeout.c b/test/timeout.c index 5b2a30a..ac76789 100644 --- a/test/timeout.c +++ b/test/timeout.c @@ -602,6 +602,105 @@ err: return 1; } +/* + * Test multi timeout req with different count + */ +static int test_multi_timeout_nr(struct io_uring *ring) +{ + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct __kernel_timespec ts; + int ret, i; + + msec_to_ts(&ts, TIMEOUT_MSEC); + + /* req_1: timeout req, count = 2 */ + sqe = io_uring_get_sqe(ring); + if (!sqe) { + fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); + goto err; + } + io_uring_prep_timeout(sqe, &ts, 2, 0); + sqe->user_data = 1; + + /* req_2: timeout req, count = 1 */ + sqe = io_uring_get_sqe(ring); + if (!sqe) { + fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); + goto err; + } + io_uring_prep_timeout(sqe, &ts, 1, 0); + sqe->user_data = 2; + + /* req_3: nop req */ + sqe = io_uring_get_sqe(ring); + if (!sqe) { + fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); + goto err; + } + io_uring_prep_nop(sqe); + io_uring_sqe_set_data(sqe, (void *) 1); + + ret = io_uring_submit(ring); + if (ret <= 0) { + fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret); + goto err; + } + + /* + * req_2 (count=1) should return without error and req_1 (count=2) + * should timeout. + */ + for (i = 0; i < 3; i++) { + ret = io_uring_wait_cqe(ring, &cqe); + if (ret < 0) { + fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret); + goto err; + } + + switch (i) { + case 0: + /* Should be nop req */ + if (io_uring_cqe_get_data(cqe) != (void *) 1) { + fprintf(stderr, "%s: nop not seen as 1 or 2\n", __FUNCTION__); + goto err; + } + break; + case 1: + /* Should be timeout req_2 */ + if (cqe->user_data != 2) { + fprintf(stderr, "%s: unexpected timeout req %d sequece\n", + __FUNCTION__, i+1); + goto err; + } + if (cqe->res < 0) { + fprintf(stderr, "%s: Req %d res %d\n", + __FUNCTION__, i+1, cqe->res); + goto err; + } + break; + case 2: + /* Should be timeout req_1 */ + if (cqe->user_data != 1) { + fprintf(stderr, "%s: unexpected timeout req %d sequece\n", + __FUNCTION__, i+1); + goto err; + } + if (cqe->res != -ETIME) { + fprintf(stderr, "%s: Req %d timeout: %s\n", + __FUNCTION__, i+1, strerror(cqe->res)); + goto err; + } + break; + } + io_uring_cqe_seen(ring, cqe); + } + + return 0; +err: + return 1; +} + int main(int argc, char *argv[]) { struct io_uring ring; @@ -657,6 +756,12 @@ int main(int argc, char *argv[]) return ret; } + ret = test_multi_timeout_nr(&ring); + if (ret) { + fprintf(stderr, "test_multi_timeout_nr failed\n"); + return ret; + } + ret = test_single_timeout_wait(&ring); if (ret) { fprintf(stderr, "test_single_timeout_wait failed\n"); |