xref: /aosp_15_r20/external/liburing/test/eventfd-ring.c (revision 25da2bea747f3a93b4c30fd9708b0618ef55a0e6)
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Description: run various nop tests
4  *
5  */
6 #include <errno.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <fcntl.h>
12 #include <poll.h>
13 #include <sys/eventfd.h>
14 
15 #include "liburing.h"
16 
main(int argc,char * argv[])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 
24 	if (argc > 1)
25 		return 0;
26 
27 	ret = io_uring_queue_init_params(8, &ring1, &p);
28 	if (ret) {
29 		fprintf(stderr, "ring setup failed: %d\n", ret);
30 		return 1;
31 	}
32 	if (!(p.features & IORING_FEAT_CUR_PERSONALITY)) {
33 		fprintf(stdout, "Skipping\n");
34 		return 0;
35 	}
36 	ret = io_uring_queue_init(8, &ring2, 0);
37 	if (ret) {
38 		fprintf(stderr, "ring setup failed: %d\n", ret);
39 		return 1;
40 	}
41 
42 	evfd1 = eventfd(0, EFD_CLOEXEC);
43 	if (evfd1 < 0) {
44 		perror("eventfd");
45 		return 1;
46 	}
47 
48 	evfd2 = eventfd(0, EFD_CLOEXEC);
49 	if (evfd2 < 0) {
50 		perror("eventfd");
51 		return 1;
52 	}
53 
54 	ret = io_uring_register_eventfd(&ring1, evfd1);
55 	if (ret) {
56 		fprintf(stderr, "failed to register evfd: %d\n", ret);
57 		return 1;
58 	}
59 
60 	ret = io_uring_register_eventfd(&ring2, evfd2);
61 	if (ret) {
62 		fprintf(stderr, "failed to register evfd: %d\n", ret);
63 		return 1;
64 	}
65 
66 	sqe = io_uring_get_sqe(&ring1);
67 	io_uring_prep_poll_add(sqe, evfd2, POLLIN);
68 	sqe->user_data = 1;
69 
70 	sqe = io_uring_get_sqe(&ring2);
71 	io_uring_prep_poll_add(sqe, evfd1, POLLIN);
72 	sqe->user_data = 1;
73 
74 	ret = io_uring_submit(&ring1);
75 	if (ret != 1) {
76 		fprintf(stderr, "submit: %d\n", ret);
77 		return 1;
78 	}
79 
80 	ret = io_uring_submit(&ring2);
81 	if (ret != 1) {
82 		fprintf(stderr, "submit: %d\n", ret);
83 		return 1;
84 	}
85 
86 	sqe = io_uring_get_sqe(&ring1);
87 	io_uring_prep_nop(sqe);
88 	sqe->user_data = 3;
89 
90 	ret = io_uring_submit(&ring1);
91 	if (ret != 1) {
92 		fprintf(stderr, "submit: %d\n", ret);
93 		return 1;
94 	}
95 
96 	return 0;
97 }
98