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