* Test timeout timeout timeout */
| 713 | * Test timeout <link> timeout <drain> timeout |
| 714 | */ |
| 715 | static int test_timeout_flags1(struct io_uring *ring) |
| 716 | { |
| 717 | struct io_uring_sqe *sqe; |
| 718 | struct io_uring_cqe *cqe; |
| 719 | struct __kernel_timespec ts; |
| 720 | int ret, i; |
| 721 | |
| 722 | msec_to_ts(&ts, TIMEOUT_MSEC); |
| 723 | |
| 724 | sqe = io_uring_get_sqe(ring); |
| 725 | if (!sqe) { |
| 726 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 727 | goto err; |
| 728 | } |
| 729 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 730 | sqe->user_data = 1; |
| 731 | sqe->flags |= IOSQE_IO_LINK; |
| 732 | |
| 733 | sqe = io_uring_get_sqe(ring); |
| 734 | if (!sqe) { |
| 735 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 736 | goto err; |
| 737 | } |
| 738 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 739 | sqe->user_data = 2; |
| 740 | sqe->flags |= IOSQE_IO_DRAIN; |
| 741 | |
| 742 | sqe = io_uring_get_sqe(ring); |
| 743 | if (!sqe) { |
| 744 | fprintf(stderr, "%s: get sqe failed\n", __FUNCTION__); |
| 745 | goto err; |
| 746 | } |
| 747 | io_uring_prep_timeout(sqe, &ts, 0, 0); |
| 748 | sqe->user_data = 3; |
| 749 | |
| 750 | ret = io_uring_submit(ring); |
| 751 | if (ret <= 0) { |
| 752 | fprintf(stderr, "%s: sqe submit failed: %d\n", __FUNCTION__, ret); |
| 753 | goto err; |
| 754 | } |
| 755 | |
| 756 | for (i = 0; i < 3; i++) { |
| 757 | ret = io_uring_wait_cqe(ring, &cqe); |
| 758 | if (ret < 0) { |
| 759 | fprintf(stderr, "%s: wait completion %d\n", __FUNCTION__, ret); |
| 760 | goto err; |
| 761 | } |
| 762 | |
| 763 | if (cqe->res == -EINVAL) { |
| 764 | if (!i) |
| 765 | fprintf(stdout, "%s: timeout flags not supported\n", |
| 766 | __FUNCTION__); |
| 767 | io_uring_cqe_seen(ring, cqe); |
| 768 | continue; |
| 769 | } |
| 770 | |
| 771 | switch (cqe->user_data) { |
| 772 | case 1: |
no test coverage detected