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