summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhangyi (F) <yi.zhang@huawei.com>2019-10-23 15:12:59 +0800
committerJens Axboe <axboe@kernel.dk>2019-10-23 21:41:56 -0600
commit6cca9e574c931139556a5da336356fbd0cf90af2 (patch)
tree956ff13f1f3709fdea223e1c27b42e5c6e9894ef
parent37136cb4423b27dac2fc663b6a0c513b6d7d7ad1 (diff)
downloadliburing-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.c105
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");