cq-ready.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "../config-host.h"
  2. /* SPDX-License-Identifier: MIT */
  3. /*
  4. * Description: test CQ ready
  5. *
  6. */
  7. #include <errno.h>
  8. #include <stdio.h>
  9. #include <unistd.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <fcntl.h>
  13. #include "liburing.h"
  14. #include "helpers.h"
  15. static int queue_n_nops(struct io_uring *ring, int n)
  16. {
  17. struct io_uring_sqe *sqe;
  18. int i, ret;
  19. for (i = 0; i < n; i++) {
  20. sqe = io_uring_get_sqe(ring);
  21. if (!sqe) {
  22. printf("get sqe failed\n");
  23. goto err;
  24. }
  25. io_uring_prep_nop(sqe);
  26. }
  27. ret = io_uring_submit(ring);
  28. if (ret < n) {
  29. printf("Submitted only %d\n", ret);
  30. goto err;
  31. } else if (ret < 0) {
  32. printf("sqe submit failed: %d\n", ret);
  33. goto err;
  34. }
  35. return 0;
  36. err:
  37. return 1;
  38. }
  39. #define CHECK_READY(ring, expected) do {\
  40. ready = io_uring_cq_ready((ring));\
  41. if (ready != expected) {\
  42. printf("Got %d CQs ready, expected %d\n", ready, expected);\
  43. goto err;\
  44. }\
  45. } while(0)
  46. int main(int argc, char *argv[])
  47. {
  48. struct io_uring ring;
  49. int ret;
  50. unsigned ready;
  51. if (argc > 1)
  52. return T_EXIT_SKIP;
  53. ret = io_uring_queue_init(4, &ring, 0);
  54. if (ret) {
  55. printf("ring setup failed\n");
  56. return T_EXIT_FAIL;
  57. }
  58. CHECK_READY(&ring, 0);
  59. if (queue_n_nops(&ring, 4))
  60. goto err;
  61. CHECK_READY(&ring, 4);
  62. io_uring_cq_advance(&ring, 4);
  63. CHECK_READY(&ring, 0);
  64. if (queue_n_nops(&ring, 4))
  65. goto err;
  66. CHECK_READY(&ring, 4);
  67. io_uring_cq_advance(&ring, 1);
  68. CHECK_READY(&ring, 3);
  69. io_uring_cq_advance(&ring, 2);
  70. CHECK_READY(&ring, 1);
  71. io_uring_cq_advance(&ring, 1);
  72. CHECK_READY(&ring, 0);
  73. io_uring_queue_exit(&ring);
  74. return T_EXIT_PASS;
  75. err:
  76. io_uring_queue_exit(&ring);
  77. return T_EXIT_FAIL;
  78. }