diff options
author | Jens Axboe <axboe@kernel.dk> | 2020-03-13 08:53:42 -0600 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-03-13 08:53:42 -0600 |
commit | 12e24c084489b96a978b335ff7529d1232176030 (patch) | |
tree | 3d0c85d26c15c42623a0d97f6d9886318aa89fe8 /test | |
parent | b3c7884621c0f97006e29fe1a89e4d33a3b3a5d2 (diff) | |
download | liburing-12e24c084489b96a978b335ff7529d1232176030.tar.gz liburing-12e24c084489b96a978b335ff7529d1232176030.tar.bz2 |
test/test/sq-space_left: test kernel vs liburing side sync on short submit
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'test')
-rw-r--r-- | test/sq-space_left.c | 106 |
1 files changed, 105 insertions, 1 deletions
diff --git a/test/sq-space_left.c b/test/sq-space_left.c index d7baeba..617ce28 100644 --- a/test/sq-space_left.c +++ b/test/sq-space_left.c @@ -12,7 +12,7 @@ #include "liburing.h" -int main(int argc, char *argv[]) +static int test_left(void) { struct io_uring_sqe *sqe; struct io_uring ring; @@ -50,3 +50,107 @@ err: io_uring_queue_exit(&ring); return 1; } + +static int test_sync(void) +{ + struct io_uring_sqe *sqe; + struct io_uring ring; + int ret, i; + + ret = io_uring_queue_init(32, &ring, 0); + if (ret) { + fprintf(stderr, "ring setup failed: %d\n", ret); + return 1; + + } + + /* prep 8 NOPS */ + for (i = 0; i < 8; i++) { + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + fprintf(stderr, "get sqe failed\n"); + goto err; + } + io_uring_prep_nop(sqe); + } + + /* prep known bad command, this should terminate submission */ + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + fprintf(stderr, "get sqe failed\n"); + goto err; + } + io_uring_prep_nop(sqe); + sqe->opcode = 0xfe; + + /* prep 8 NOPS */ + for (i = 0; i < 8; i++) { + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + fprintf(stderr, "get sqe failed\n"); + goto err; + } + io_uring_prep_nop(sqe); + } + + /* we should have 8 + 1 + 8 pending now */ + ret = io_uring_sq_ready(&ring); + if (ret != 17) { + fprintf(stderr, "%d ready, wanted 17\n", ret); + goto err; + } + + ret = io_uring_submit(&ring); + + /* should submit 8 successfully, then error #9 and stop */ + if (ret != 9) { + fprintf(stderr, "submitted %d, wanted 9\n", ret); + goto err; + } + + /* should now have 8 ready, with 9 gone */ + ret = io_uring_sq_ready(&ring); + if (ret != 8) { + fprintf(stderr, "%d ready, wanted 8\n", ret); + goto err; + } + + ret = io_uring_submit(&ring); + + /* the last 8 should submit fine */ + if (ret != 8) { + fprintf(stderr, "submitted %d, wanted 8\n", ret); + goto err; + } + + ret = io_uring_sq_ready(&ring); + if (ret) { + fprintf(stderr, "%d ready, wanted 0\n", ret); + goto err; + } + + io_uring_queue_exit(&ring); + return 0; +err: + io_uring_queue_exit(&ring); + return 1; +} + +int main(int argc, char *argv[]) +{ + int ret; + + ret = test_left(); + if (ret) { + fprintf(stderr, "test_left failed\n"); + return ret; + } + + ret = test_sync(); + if (ret) { + fprintf(stderr, "test_sync failed\n"); + return ret; + } + + return 0; +} |