pipe-reuse.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "../config-host.h"
  2. /* SPDX-License-Identifier: MIT */
  3. /*
  4. * Check split up read is handled correctly
  5. */
  6. #include <errno.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <unistd.h>
  10. #include <pthread.h>
  11. #include <string.h>
  12. #include "liburing.h"
  13. #define BUFSIZE 16384
  14. #define BUFFERS 16
  15. int main(int argc, char *argv[])
  16. {
  17. char buf[BUFSIZE], wbuf[BUFSIZE];
  18. struct iovec iov[BUFFERS];
  19. struct io_uring_params p = { };
  20. struct io_uring ring;
  21. struct io_uring_sqe *sqe;
  22. struct io_uring_cqe *cqe;
  23. int ret, i, fds[2];
  24. void *ptr;
  25. if (pipe(fds) < 0) {
  26. perror("pipe");
  27. return 1;
  28. }
  29. ptr = buf;
  30. for (i = 0; i < BUFFERS; i++) {
  31. unsigned bsize = BUFSIZE / BUFFERS;
  32. iov[i].iov_base = ptr;
  33. iov[i].iov_len = bsize;
  34. ptr += bsize;
  35. }
  36. ret = io_uring_queue_init_params(8, &ring, &p);
  37. if (ret) {
  38. fprintf(stderr, "queue_init: %d\n", ret);
  39. return 1;
  40. }
  41. if (!(p.features & IORING_FEAT_SUBMIT_STABLE)) {
  42. fprintf(stdout, "FEAT_SUBMIT_STABLE not there, skipping\n");
  43. return 0;
  44. }
  45. ptr = wbuf;
  46. memset(ptr, 0x11, sizeof(wbuf) / 2);
  47. ptr += sizeof(wbuf) / 2;
  48. memset(ptr, 0x22, sizeof(wbuf) / 2);
  49. ret = write(fds[1], wbuf, sizeof(wbuf) / 2);
  50. if (ret != sizeof(wbuf) / 2) {
  51. fprintf(stderr, "Bad write\n");
  52. ret = 1;
  53. goto err;
  54. }
  55. sqe = io_uring_get_sqe(&ring);
  56. io_uring_prep_readv(sqe, fds[0], iov, BUFFERS, 0);
  57. ret = io_uring_submit(&ring);
  58. if (ret != 1) {
  59. fprintf(stderr, "submit: %d\n", ret);
  60. return 1;
  61. }
  62. for (i = 0; i < BUFFERS; i++) {
  63. iov[i].iov_base = NULL;
  64. iov[i].iov_len = 1000000;
  65. }
  66. ret = write(fds[1], ptr, sizeof(wbuf) / 2);
  67. if (ret != sizeof(wbuf) / 2) {
  68. fprintf(stderr, "Bad write\n");
  69. ret = 1;
  70. goto err;
  71. }
  72. ret = io_uring_wait_cqe(&ring, &cqe);
  73. if (ret) {
  74. fprintf(stderr, "wait: %d\n", ret);
  75. return 1;
  76. }
  77. if (cqe->res < 0) {
  78. fprintf(stderr, "Read error: %s\n", strerror(-cqe->res));
  79. return 1;
  80. } else if (cqe->res != sizeof(wbuf)) {
  81. /* ignore short read, not a failure */
  82. goto err;
  83. }
  84. io_uring_cqe_seen(&ring, cqe);
  85. ret = memcmp(wbuf, buf, sizeof(wbuf));
  86. if (ret)
  87. fprintf(stderr, "Read data mismatch\n");
  88. err:
  89. io_uring_queue_exit(&ring);
  90. return ret;
  91. }