• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &reg, 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