| 402 | } |
| 403 | |
| 404 | static int ublk_queue_init(struct ublk_queue *q) |
| 405 | { |
| 406 | struct ublk_dev *dev = q->dev; |
| 407 | int depth = dev->dev_info.queue_depth; |
| 408 | int i, ret = -1; |
| 409 | int cmd_buf_size, io_buf_size; |
| 410 | unsigned long off; |
| 411 | int ring_depth = depth, cq_depth = depth; |
| 412 | |
| 413 | q->tgt_ops = dev->tgt.ops; |
| 414 | q->state = 0; |
| 415 | q->q_depth = depth; |
| 416 | q->cmd_inflight = 0; |
| 417 | q->tid = gettid(); |
| 418 | |
| 419 | cmd_buf_size = ublk_queue_cmd_buf_sz(q); |
| 420 | off = UBLKSRV_CMD_BUF_OFFSET + |
| 421 | q->q_id * (UBLK_MAX_QUEUE_DEPTH * sizeof(struct ublksrv_io_desc)); |
| 422 | q->io_cmd_buf = (char *)mmap(0, cmd_buf_size, PROT_READ, |
| 423 | MAP_SHARED | MAP_POPULATE, dev->fds[0], off); |
| 424 | if (q->io_cmd_buf == MAP_FAILED) { |
| 425 | ublk_err("ublk dev %d queue %d map io_cmd_buf failed %m\n", |
| 426 | q->dev->dev_info.dev_id, q->q_id); |
| 427 | goto fail; |
| 428 | } |
| 429 | |
| 430 | io_buf_size = dev->dev_info.max_io_buf_bytes; |
| 431 | for (i = 0; i < q->q_depth; i++) { |
| 432 | q->ios[i].buf_addr = NULL; |
| 433 | |
| 434 | if (posix_memalign((void **)&q->ios[i].buf_addr, |
| 435 | getpagesize(), io_buf_size)) { |
| 436 | ublk_err("ublk dev %d queue %d io %d posix_memalign failed %m\n", |
| 437 | dev->dev_info.dev_id, q->q_id, i); |
| 438 | goto fail; |
| 439 | } |
| 440 | q->ios[i].flags = UBLKSRV_NEED_FETCH_RQ | UBLKSRV_IO_FREE; |
| 441 | } |
| 442 | |
| 443 | ret = ublk_setup_ring(&q->ring, ring_depth, cq_depth, |
| 444 | IORING_SETUP_COOP_TASKRUN); |
| 445 | if (ret < 0) { |
| 446 | ublk_err("ublk dev %d queue %d setup io_uring failed %d\n", |
| 447 | q->dev->dev_info.dev_id, q->q_id, ret); |
| 448 | goto fail; |
| 449 | } |
| 450 | |
| 451 | io_uring_register_ring_fd(&q->ring); |
| 452 | |
| 453 | ret = io_uring_register_files(&q->ring, dev->fds, dev->nr_fds); |
| 454 | if (ret) { |
| 455 | ublk_err("ublk dev %d queue %d register files failed %d\n", |
| 456 | q->dev->dev_info.dev_id, q->q_id, ret); |
| 457 | goto fail; |
| 458 | } |
| 459 | |
| 460 | return 0; |
| 461 | fail: |
no test coverage detected