* Test timeout timeout timeout */
| 889 | * Test timeout <drain> timeout <link> timeout |
| 890 | */ |
| 891 | static int test_timeout_flags3(struct io_uring *ring) |
| 892 | { |
| 893 | struct io_uring_sqe *sqe; |
| 894 | struct io_uring_cqe *cqe; |
| 895 | struct __kernel_timespec ts; |
| 896 | int ret, i; |
| 897 | |
| 898 | msec_to_ts(&ts, TIMEOUT_MSEC); |
| 899 | |
| 900 | sqe = io_uring_get_sqe(ring); |
| 901 | if (!sqe) { |
| 902 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 903 | goto err; |
| 904 | } |
| 905 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 906 | sqe->user_data = 1; |
| 907 | sqe->flags |= IOSQE_IO_DRAIN; |
| 908 | |
| 909 | sqe = io_uring_get_sqe(ring); |
| 910 | if (!sqe) { |
| 911 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 912 | goto err; |
| 913 | } |
| 914 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 915 | sqe->user_data = 2; |
| 916 | sqe->flags |= IOSQE_IO_LINK; |
| 917 | |
| 918 | sqe = io_uring_get_sqe(ring); |
| 919 | if (!sqe) { |
| 920 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 921 | goto err; |
| 922 | } |
| 923 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 924 | sqe->user_data = 3; |
| 925 | |
| 926 | ret = io_uring_submit(ring); |
| 927 | if (ret <= 0) { |
| 928 | fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret); |
| 929 | goto err; |
| 930 | } |
| 931 | |
| 932 | for (i = 0; i < 3; i++) { |
| 933 | ret = io_uring_wait_cqe(ring, &cqe); |
| 934 | if (ret < 0) { |
| 935 | fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret); |
| 936 | goto err; |
| 937 | } |
| 938 | |
| 939 | if (cqe->res == -EINVAL) { |
| 940 | if (!i) |
| 941 | fprintf(stdout, "%s: timeout flags not supported\n", |
| 942 | __FUNCTION__); |
| 943 | io_uring_cqe_seen(ring, cqe); |
| 944 | continue; |
| 945 | } |
| 946 | |
| 947 | switch (cqe->user_data) { |
| 948 | case 1: |
no test coverage detected