| 295 | } |
| 296 | |
| 297 | static int test_running(int bgid, int entries, int loops, int use_mmap) |
| 298 | { |
| 299 | int ring_mask = io_uring_buf_ring_mask(entries); |
| 300 | struct io_uring_buf_ring *br; |
| 301 | int ret, loop, idx, read_fd; |
| 302 | struct io_uring ring; |
| 303 | char buffer[8]; |
| 304 | bool *buffers; |
| 305 | |
| 306 | ret = t_create_ring(1, &ring, 0); |
| 307 | if (ret == T_SETUP_SKIP) |
| 308 | return T_EXIT_SKIP; |
| 309 | else if (ret != T_SETUP_OK) |
| 310 | return T_EXIT_FAIL; |
| 311 | |
| 312 | if (!use_mmap) { |
| 313 | br = io_uring_setup_buf_ring(&ring, entries, bgid, 0, &ret); |
| 314 | if (!br) { |
| 315 | /* by now should have checked if this is supported or not */ |
| 316 | fprintf(stderr, "Buffer ring register failed %d\n", ret); |
| 317 | return T_EXIT_FAIL; |
| 318 | } |
| 319 | } else { |
| 320 | struct io_uring_buf_reg reg = { |
| 321 | .ring_entries = entries, |
| 322 | .bgid = bgid, |
| 323 | .flags = IOU_PBUF_RING_MMAP, |
| 324 | }; |
| 325 | size_t ring_size; |
| 326 | off_t off; |
| 327 | |
| 328 | ret = io_uring_register_buf_ring(&ring, ®, 0); |
| 329 | if (ret) { |
| 330 | if (ret == -EINVAL) |
| 331 | return T_EXIT_SKIP; |
| 332 | fprintf(stderr, "mmap ring register failed %d\n", ret); |
| 333 | return T_EXIT_FAIL; |
| 334 | } |
| 335 | |
| 336 | off = IORING_OFF_PBUF_RING | |
| 337 | (unsigned long long) bgid << IORING_OFF_PBUF_SHIFT; |
| 338 | ring_size = sizeof(struct io_uring_buf) * entries; |
| 339 | br = mmap(NULL, ring_size, PROT_READ | PROT_WRITE, |
| 340 | MAP_SHARED | MAP_POPULATE, ring.ring_fd, off); |
| 341 | if (br == MAP_FAILED) { |
| 342 | perror("mmap"); |
| 343 | return T_EXIT_FAIL; |
| 344 | } |
| 345 | } |
| 346 | |
| 347 | buffers = malloc(sizeof(bool) * entries); |
| 348 | if (!buffers) |
| 349 | return T_EXIT_SKIP; |
| 350 | |
| 351 | read_fd = open("/dev/zero", O_RDONLY); |
| 352 | if (read_fd < 0) |
| 353 | return T_EXIT_SKIP; |
| 354 |
no test coverage detected