1 /* SPDX-License-Identifier: MIT */
2 /*
3 * Description: test eventfd registration+unregistration
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 #include "helpers.h"
17
main(int argc,char * argv[])18 int main(int argc, char *argv[])
19 {
20 struct io_uring_params p = {};
21 struct io_uring ring;
22 int ret, evfd[2], i;
23
24 if (argc > 1)
25 return T_EXIT_SKIP;
26
27 ret = io_uring_queue_init_params(8, &ring, &p);
28 if (ret) {
29 fprintf(stderr, "ring setup failed: %d\n", ret);
30 return T_EXIT_FAIL;
31 }
32
33 evfd[0] = eventfd(0, EFD_CLOEXEC);
34 evfd[1] = eventfd(0, EFD_CLOEXEC);
35 if (evfd[0] < 0 || evfd[1] < 0) {
36 perror("eventfd");
37 return T_EXIT_FAIL;
38 }
39
40 ret = io_uring_register_eventfd(&ring, evfd[0]);
41 if (ret) {
42 fprintf(stderr, "failed to register evfd: %d\n", ret);
43 return T_EXIT_FAIL;
44 }
45
46 /* Check that registering again will get -EBUSY */
47 ret = io_uring_register_eventfd(&ring, evfd[1]);
48 if (ret != -EBUSY) {
49 fprintf(stderr, "unexpected 2nd register: %d\n", ret);
50 return T_EXIT_FAIL;
51 }
52 close(evfd[1]);
53
54 ret = io_uring_unregister_eventfd(&ring);
55 if (ret) {
56 fprintf(stderr, "unexpected unregister: %d\n", ret);
57 return T_EXIT_FAIL;
58 }
59
60 /* loop 100 registers/unregister */
61 for (i = 0; i < 100; i++) {
62 ret = io_uring_register_eventfd(&ring, evfd[0]);
63 if (ret) {
64 fprintf(stderr, "failed to register evfd: %d\n", ret);
65 return T_EXIT_FAIL;
66 }
67
68 ret = io_uring_unregister_eventfd(&ring);
69 if (ret) {
70 fprintf(stderr, "unexpected unregister: %d\n", ret);
71 return T_EXIT_FAIL;
72 }
73 }
74
75 close(evfd[0]);
76 return T_EXIT_PASS;
77 }
78