buf-ring-put.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "../config-host.h"
  2. /* SPDX-License-Identifier: MIT */
  3. /*
  4. * Description: test persistence of mmap'ed provided ring buffers. Use a range
  5. * of buffer group IDs that puts us into both the lower end array
  6. * and higher end xarry.
  7. *
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <unistd.h>
  12. #include <fcntl.h>
  13. #include <string.h>
  14. #include <sys/mman.h>
  15. #include "liburing.h"
  16. #include "helpers.h"
  17. #define BGID_START 60
  18. #define BGID_NR 10
  19. #define ENTRIES 512
  20. int main(int argc, char *argv[])
  21. {
  22. struct io_uring_buf_ring *br[BGID_NR];
  23. struct io_uring ring;
  24. size_t ring_size;
  25. int ret, i, j;
  26. if (argc > 1)
  27. return T_EXIT_SKIP;
  28. ret = io_uring_queue_init(1, &ring, 0);
  29. if (ret) {
  30. fprintf(stderr, "queue init failed %d\n", ret);
  31. return T_EXIT_FAIL;
  32. }
  33. ring_size = ENTRIES * sizeof(struct io_uring_buf);
  34. for (i = 0; i < BGID_NR; i++) {
  35. int bgid = BGID_START + i;
  36. struct io_uring_buf_reg reg = {
  37. .ring_entries = ENTRIES,
  38. .bgid = bgid,
  39. .flags = IOU_PBUF_RING_MMAP,
  40. };
  41. off_t off;
  42. ret = io_uring_register_buf_ring(&ring, &reg, 0);
  43. if (ret) {
  44. if (ret == -EINVAL)
  45. return T_EXIT_SKIP;
  46. fprintf(stderr, "reg buf ring: %d\n", ret);
  47. return T_EXIT_FAIL;
  48. }
  49. off = IORING_OFF_PBUF_RING |
  50. (unsigned long long) bgid << IORING_OFF_PBUF_SHIFT;
  51. br[i] = mmap(NULL, ring_size, PROT_READ | PROT_WRITE,
  52. MAP_SHARED | MAP_POPULATE, ring.ring_fd, off);
  53. if (br[i] == MAP_FAILED) {
  54. perror("mmap");
  55. return T_EXIT_FAIL;
  56. }
  57. }
  58. for (i = 0; i < BGID_NR; i++) {
  59. ret = io_uring_unregister_buf_ring(&ring, BGID_START + i);
  60. if (ret) {
  61. fprintf(stderr, "reg buf ring: %d\n", ret);
  62. return T_EXIT_FAIL;
  63. }
  64. }
  65. for (j = 0; j < 1000; j++) {
  66. for (i = 0; i < BGID_NR; i++)
  67. memset(br[i], 0x5a, ring_size);
  68. usleep(1000);
  69. }
  70. io_uring_queue_exit(&ring);
  71. return T_EXIT_PASS;
  72. }