| 196 | } |
| 197 | |
| 198 | static int test_wait_arg(void) |
| 199 | { |
| 200 | struct io_uring_region_desc rd = {}; |
| 201 | struct io_uring_mem_region_reg mr = {}; |
| 202 | struct io_uring ring; |
| 203 | void *buffer; |
| 204 | int ret; |
| 205 | |
| 206 | ret = io_uring_queue_init(8, &ring, IORING_SETUP_R_DISABLED); |
| 207 | if (ret) { |
| 208 | if (ret == -EINVAL) { |
| 209 | printf("IORING_SETUP_R_DISABLED not supported, skip\n"); |
| 210 | return 0; |
| 211 | } |
| 212 | fprintf(stderr, "ring setup failed: %d\n", ret); |
| 213 | return T_EXIT_FAIL; |
| 214 | } |
| 215 | |
| 216 | buffer = t_aligned_alloc(page_size, page_size * 4); |
| 217 | if (!buffer) { |
| 218 | fprintf(stderr, "allocation failed\n"); |
| 219 | return T_EXIT_FAIL; |
| 220 | } |
| 221 | |
| 222 | rd.user_addr = uring_ptr_to_u64(buffer); |
| 223 | rd.size = page_size; |
| 224 | rd.flags = IORING_MEM_REGION_TYPE_USER; |
| 225 | mr.region_uptr = uring_ptr_to_u64(&rd); |
| 226 | mr.flags = IORING_MEM_REGION_REG_WAIT_ARG; |
| 227 | |
| 228 | ret = io_uring_register_region(&ring, &mr); |
| 229 | if (ret) { |
| 230 | fprintf(stderr, "region reg failed %i\n", ret); |
| 231 | return 1; |
| 232 | } |
| 233 | |
| 234 | ret = io_uring_enable_rings(&ring); |
| 235 | if (ret) { |
| 236 | fprintf(stderr, "io_uring_enable_rings failure %i\n", ret); |
| 237 | return T_EXIT_FAIL; |
| 238 | } |
| 239 | |
| 240 | reg = buffer; |
| 241 | |
| 242 | ret = test_basic(&ring); |
| 243 | if (ret == T_EXIT_FAIL) { |
| 244 | fprintf(stderr, "test failed\n"); |
| 245 | goto err; |
| 246 | } |
| 247 | |
| 248 | ret = test_invalid_sig(&ring); |
| 249 | if (ret == T_EXIT_FAIL) { |
| 250 | fprintf(stderr, "test_invalid sig failed\n"); |
| 251 | goto err; |
| 252 | } |
| 253 | |
| 254 | ret = test_offsets(&ring, buffer, page_size, true); |
| 255 | if (ret == T_EXIT_FAIL) { |
no test coverage detected