eventfd-ring.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "../config-host.h"
  2. /* SPDX-License-Identifier: MIT */
  3. /*
  4. * Description: test use of eventfds with multiple rings
  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 <poll.h>
  14. #include <sys/eventfd.h>
  15. #include "liburing.h"
  16. #include "helpers.h"
  17. int main(int argc, char *argv[])
  18. {
  19. struct io_uring_params p = {};
  20. struct io_uring ring1, ring2;
  21. struct io_uring_sqe *sqe;
  22. int ret, evfd1, evfd2;
  23. if (argc > 1)
  24. return T_EXIT_SKIP;
  25. ret = io_uring_queue_init_params(8, &ring1, &p);
  26. if (ret) {
  27. fprintf(stderr, "ring setup failed: %d\n", ret);
  28. return T_EXIT_FAIL;
  29. }
  30. if (!(p.features & IORING_FEAT_CUR_PERSONALITY)) {
  31. fprintf(stdout, "Skipping\n");
  32. return T_EXIT_SKIP;
  33. }
  34. ret = io_uring_queue_init(8, &ring2, 0);
  35. if (ret) {
  36. fprintf(stderr, "ring setup failed: %d\n", ret);
  37. return T_EXIT_FAIL;
  38. }
  39. evfd1 = eventfd(0, EFD_CLOEXEC);
  40. if (evfd1 < 0) {
  41. perror("eventfd");
  42. return T_EXIT_FAIL;
  43. }
  44. evfd2 = eventfd(0, EFD_CLOEXEC);
  45. if (evfd2 < 0) {
  46. perror("eventfd");
  47. return T_EXIT_FAIL;
  48. }
  49. ret = io_uring_register_eventfd(&ring1, evfd1);
  50. if (ret) {
  51. fprintf(stderr, "failed to register evfd: %d\n", ret);
  52. return T_EXIT_FAIL;
  53. }
  54. ret = io_uring_register_eventfd(&ring2, evfd2);
  55. if (ret) {
  56. fprintf(stderr, "failed to register evfd: %d\n", ret);
  57. return T_EXIT_FAIL;
  58. }
  59. sqe = io_uring_get_sqe(&ring1);
  60. io_uring_prep_poll_add(sqe, evfd2, POLLIN);
  61. sqe->user_data = 1;
  62. sqe = io_uring_get_sqe(&ring2);
  63. io_uring_prep_poll_add(sqe, evfd1, POLLIN);
  64. sqe->user_data = 1;
  65. ret = io_uring_submit(&ring1);
  66. if (ret != 1) {
  67. fprintf(stderr, "submit: %d\n", ret);
  68. return T_EXIT_FAIL;
  69. }
  70. ret = io_uring_submit(&ring2);
  71. if (ret != 1) {
  72. fprintf(stderr, "submit: %d\n", ret);
  73. return T_EXIT_FAIL;
  74. }
  75. sqe = io_uring_get_sqe(&ring1);
  76. io_uring_prep_nop(sqe);
  77. sqe->user_data = 3;
  78. ret = io_uring_submit(&ring1);
  79. if (ret != 1) {
  80. fprintf(stderr, "submit: %d\n", ret);
  81. return T_EXIT_FAIL;
  82. }
  83. return T_EXIT_PASS;
  84. }