1 /* SPDX-License-Identifier: MIT */
2 /*
3 * Test io_uring_register with a registered ring (IORING_REGISTER_USE_REGISTERED_RING)
4 *
5 */
6 #include <stdio.h>
7
8 #include "helpers.h"
9
main(int argc,char * argv[])10 int main(int argc, char *argv[])
11 {
12 struct io_uring ring;
13 unsigned values[2];
14 int ret;
15
16 if (argc > 1)
17 return T_EXIT_SKIP;
18
19 ret = io_uring_queue_init(8, &ring, 0);
20 if (ret) {
21 fprintf(stderr, "ring setup failed\n");
22 return T_EXIT_FAIL;
23 }
24
25 if (!(ring.features & IORING_FEAT_REG_REG_RING)) {
26 fprintf(stderr, "IORING_FEAT_REG_REG_RING not available in kernel\n");
27 io_uring_queue_exit(&ring);
28 return T_EXIT_SKIP;
29 }
30
31 ret = io_uring_close_ring_fd(&ring);
32 if (ret != -EINVAL) {
33 fprintf(stderr, "closing ring fd should EINVAL before register\n");
34 goto err;
35 }
36
37 ret = io_uring_unregister_ring_fd(&ring);
38 if (ret != -EINVAL) {
39 fprintf(stderr, "unregistering not-registered ring fd should fail\n");
40 goto err;
41 }
42
43 ret = io_uring_register_ring_fd(&ring);
44 if (ret != 1) {
45 fprintf(stderr, "registering ring fd failed\n");
46 goto err;
47 }
48
49 ret = io_uring_register_ring_fd(&ring);
50 if (ret != -EEXIST) {
51 fprintf(stderr, "registering already-registered ring fd should fail\n");
52 goto err;
53 }
54
55 /* Test a simple io_uring_register operation expected to work.
56 * io_uring_register_iowq_max_workers is arbitrary.
57 */
58 values[0] = values[1] = 0;
59 ret = io_uring_register_iowq_max_workers(&ring, values);
60 if (ret || (values[0] == 0 && values[1] == 0)) {
61 fprintf(stderr, "io_uring_register operation failed before closing ring fd\n");
62 goto err;
63 }
64
65 ret = io_uring_close_ring_fd(&ring);
66 if (ret != 1) {
67 fprintf(stderr, "closing ring fd failed\n");
68 goto err;
69 }
70
71 values[0] = values[1] = 0;
72 ret = io_uring_register_iowq_max_workers(&ring, values);
73 if (ret || (values[0] == 0 && values[1] == 0)) {
74 fprintf(stderr, "io_uring_register operation failed after closing ring fd\n");
75 goto err;
76 }
77
78 ret = io_uring_close_ring_fd(&ring);
79 if (ret != -EBADF) {
80 fprintf(stderr, "closing already-closed ring fd should fail\n");
81 goto err;
82 }
83
84 io_uring_queue_exit(&ring);
85 return T_EXIT_PASS;
86
87 err:
88 io_uring_queue_exit(&ring);
89 return T_EXIT_FAIL;
90 }
91