| 312 | } |
| 313 | |
| 314 | static int test(int reg_src, int reg_dst) |
| 315 | { |
| 316 | struct iovec vecs[NR_VECS]; |
| 317 | struct io_uring src, dst; |
| 318 | int ret, i; |
| 319 | |
| 320 | ret = io_uring_queue_init(1, &src, 0); |
| 321 | if (ret) { |
| 322 | fprintf(stderr, "ring_init: %d\n", ret); |
| 323 | return T_EXIT_FAIL; |
| 324 | } |
| 325 | ret = io_uring_queue_init(1, &dst, 0); |
| 326 | if (ret) { |
| 327 | fprintf(stderr, "ring_init: %d\n", ret); |
| 328 | return T_EXIT_FAIL; |
| 329 | } |
| 330 | if (reg_src) { |
| 331 | ret = io_uring_register_ring_fd(&src); |
| 332 | if (ret < 0) { |
| 333 | if (ret == -EINVAL) |
| 334 | return T_EXIT_SKIP; |
| 335 | fprintf(stderr, "register ring: %d\n", ret); |
| 336 | return T_EXIT_FAIL; |
| 337 | } |
| 338 | } |
| 339 | if (reg_dst) { |
| 340 | ret = io_uring_register_ring_fd(&dst); |
| 341 | if (ret < 0) { |
| 342 | if (ret == -EINVAL) |
| 343 | return T_EXIT_SKIP; |
| 344 | fprintf(stderr, "register ring: %d\n", ret); |
| 345 | return T_EXIT_FAIL; |
| 346 | } |
| 347 | } |
| 348 | |
| 349 | /* test fail with no buffers in src */ |
| 350 | ret = io_uring_clone_buffers(&dst, &src); |
| 351 | if (ret == -EINVAL) { |
| 352 | /* no buffer copy support */ |
| 353 | no_buf_clone = true; |
| 354 | return T_EXIT_SKIP; |
| 355 | } else if (ret != -ENXIO) { |
| 356 | fprintf(stderr, "empty copy: %d\n", ret); |
| 357 | return T_EXIT_FAIL; |
| 358 | } |
| 359 | |
| 360 | for (i = 0; i < NR_VECS; i++) { |
| 361 | if (posix_memalign(&vecs[i].iov_base, 4096, BUF_SIZE)) |
| 362 | return T_EXIT_FAIL; |
| 363 | vecs[i].iov_len = BUF_SIZE; |
| 364 | } |
| 365 | |
| 366 | ret = io_uring_register_buffers(&src, vecs, NR_VECS); |
| 367 | if (ret < 0) { |
| 368 | if (ret == -ENOMEM) |
| 369 | return T_EXIT_SKIP; |
| 370 | return T_EXIT_FAIL; |
| 371 | } |
no test coverage detected