lib/vhost: consolidate successful and invalid request path

Both blk_request_finish() and invalid_blk_request()
acomplished the same thing, with variation on handled
statuses and debug logs.

Consolidating those two into single function will help
later on when replacing completion of request processing
to single callback.

Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: Iae7b93db01bfd98819b2bb8fad9e11afcdb3a459
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12196
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
Tomasz Zawadzki 2022-04-05 14:43:23 +02:00
parent 4f95fd7be6
commit 0368340581

View File

@ -166,15 +166,17 @@ blk_task_enqueue(struct spdk_vhost_blk_task *task)
} }
static void static void
invalid_blk_request(struct spdk_vhost_blk_task *task, uint8_t status) blk_request_finish(uint8_t status, struct spdk_vhost_blk_task *task)
{ {
if (task->status) { if (task->status) {
*task->status = status; *task->status = status;
} }
blk_task_enqueue(task); blk_task_enqueue(task);
SPDK_DEBUGLOG(vhost_blk, "Finished task (%p) req_idx=%d\n status: %" PRIu8"\n",
task, task->req_idx, status);
blk_task_finish(task); blk_task_finish(task);
SPDK_DEBUGLOG(vhost_blk_data, "Invalid request (status=%" PRIu8")\n", status);
} }
/* /*
@ -406,25 +408,13 @@ blk_iovs_inflight_queue_setup(struct spdk_vhost_blk_session *bvsession,
return 0; return 0;
} }
static void
blk_request_finish(bool success, struct spdk_vhost_blk_task *task)
{
*task->status = success ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR;
blk_task_enqueue(task);
SPDK_DEBUGLOG(vhost_blk, "Finished task (%p) req_idx=%d\n status: %s\n", task,
task->req_idx, success ? "OK" : "FAIL");
blk_task_finish(task);
}
static void static void
blk_request_complete_cb(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg) blk_request_complete_cb(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
{ {
struct spdk_vhost_blk_task *task = cb_arg; struct spdk_vhost_blk_task *task = cb_arg;
spdk_bdev_free_io(bdev_io); spdk_bdev_free_io(bdev_io);
blk_request_finish(success, task); blk_request_finish(success ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR, task);
} }
static void static void
@ -455,7 +445,7 @@ blk_request_queue_io(struct spdk_vhost_blk_task *task)
rc = spdk_bdev_queue_io_wait(bdev, bvsession->io_channel, &task->bdev_io_wait); rc = spdk_bdev_queue_io_wait(bdev, bvsession->io_channel, &task->bdev_io_wait);
if (rc != 0) { if (rc != 0) {
SPDK_ERRLOG("%s: failed to queue I/O, rc=%d\n", bvsession->vsession.name, rc); SPDK_ERRLOG("%s: failed to queue I/O, rc=%d\n", bvsession->vsession.name, rc);
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
} }
} }
@ -478,7 +468,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
SPDK_DEBUGLOG(vhost_blk, SPDK_DEBUGLOG(vhost_blk,
"First descriptor size is %zu but expected %zu (req_idx = %"PRIu16").\n", "First descriptor size is %zu but expected %zu (req_idx = %"PRIu16").\n",
iov->iov_len, sizeof(req), task->req_idx); iov->iov_len, sizeof(req), task->req_idx);
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return -1; return -1;
} }
@ -493,7 +483,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
SPDK_DEBUGLOG(vhost_blk, SPDK_DEBUGLOG(vhost_blk,
"Last descriptor size is %zu but expected %d (req_idx = %"PRIu16").\n", "Last descriptor size is %zu but expected %d (req_idx = %"PRIu16").\n",
iov->iov_len, 1, task->req_idx); iov->iov_len, 1, task->req_idx);
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return -1; return -1;
} }
@ -514,7 +504,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
if (spdk_unlikely(payload_len == 0 || (payload_len & (512 - 1)) != 0)) { if (spdk_unlikely(payload_len == 0 || (payload_len & (512 - 1)) != 0)) {
SPDK_ERRLOG("%s - passed IO buffer is not multiple of 512b (req_idx = %"PRIu16").\n", SPDK_ERRLOG("%s - passed IO buffer is not multiple of 512b (req_idx = %"PRIu16").\n",
type ? "WRITE" : "READ", task->req_idx); type ? "WRITE" : "READ", task->req_idx);
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return -1; return -1;
} }
@ -538,7 +528,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n");
blk_request_queue_io(task); blk_request_queue_io(task);
} else { } else {
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
return -1; return -1;
} }
} }
@ -547,13 +537,13 @@ process_blk_request(struct spdk_vhost_blk_task *task,
desc = task->iovs[1].iov_base; desc = task->iovs[1].iov_base;
if (payload_len != sizeof(*desc)) { if (payload_len != sizeof(*desc)) {
SPDK_NOTICELOG("Invalid discard payload size: %u\n", payload_len); SPDK_NOTICELOG("Invalid discard payload size: %u\n", payload_len);
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
return -1; return -1;
} }
if (desc->flags & VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP) { if (desc->flags & VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP) {
SPDK_ERRLOG("UNMAP flag is only used for WRITE ZEROES command\n"); SPDK_ERRLOG("UNMAP flag is only used for WRITE ZEROES command\n");
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return -1; return -1;
} }
@ -565,7 +555,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n");
blk_request_queue_io(task); blk_request_queue_io(task);
} else { } else {
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
return -1; return -1;
} }
} }
@ -574,7 +564,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
desc = task->iovs[1].iov_base; desc = task->iovs[1].iov_base;
if (payload_len != sizeof(*desc)) { if (payload_len != sizeof(*desc)) {
SPDK_NOTICELOG("Invalid write zeroes payload size: %u\n", payload_len); SPDK_NOTICELOG("Invalid write zeroes payload size: %u\n", payload_len);
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
return -1; return -1;
} }
@ -595,7 +585,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n");
blk_request_queue_io(task); blk_request_queue_io(task);
} else { } else {
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
return -1; return -1;
} }
} }
@ -604,7 +594,7 @@ process_blk_request(struct spdk_vhost_blk_task *task,
flush_bytes = spdk_bdev_get_num_blocks(bvdev->bdev) * spdk_bdev_get_block_size(bvdev->bdev); flush_bytes = spdk_bdev_get_num_blocks(bvdev->bdev) * spdk_bdev_get_block_size(bvdev->bdev);
if (req.sector != 0) { if (req.sector != 0) {
SPDK_NOTICELOG("sector must be zero for flush command\n"); SPDK_NOTICELOG("sector must be zero for flush command\n");
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
return -1; return -1;
} }
rc = spdk_bdev_flush(bvdev->bdev_desc, bvsession->io_channel, rc = spdk_bdev_flush(bvdev->bdev_desc, bvsession->io_channel,
@ -615,24 +605,24 @@ process_blk_request(struct spdk_vhost_blk_task *task,
SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n");
blk_request_queue_io(task); blk_request_queue_io(task);
} else { } else {
invalid_blk_request(task, VIRTIO_BLK_S_IOERR); blk_request_finish(VIRTIO_BLK_S_IOERR, task);
return -1; return -1;
} }
} }
break; break;
case VIRTIO_BLK_T_GET_ID: case VIRTIO_BLK_T_GET_ID:
if (!iovcnt || !payload_len) { if (!iovcnt || !payload_len) {
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return -1; return -1;
} }
task->used_len = spdk_min((size_t)VIRTIO_BLK_ID_BYTES, task->iovs[1].iov_len); task->used_len = spdk_min((size_t)VIRTIO_BLK_ID_BYTES, task->iovs[1].iov_len);
spdk_strcpy_pad(task->iovs[1].iov_base, spdk_bdev_get_name(bvdev->bdev), spdk_strcpy_pad(task->iovs[1].iov_base, spdk_bdev_get_name(bvdev->bdev),
task->used_len, ' '); task->used_len, ' ');
blk_request_finish(true, task); blk_request_finish(VIRTIO_BLK_S_OK, task);
break; break;
default: default:
SPDK_DEBUGLOG(vhost_blk, "Not supported request type '%"PRIu32"'.\n", type); SPDK_DEBUGLOG(vhost_blk, "Not supported request type '%"PRIu32"'.\n", type);
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return -1; return -1;
} }
@ -666,7 +656,7 @@ process_blk_task(struct spdk_vhost_virtqueue *vq, uint16_t req_idx)
if (rc) { if (rc) {
SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx); SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx);
/* Only READ and WRITE are supported for now. */ /* Only READ and WRITE are supported for now. */
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return; return;
} }
@ -728,7 +718,7 @@ process_packed_blk_task(struct spdk_vhost_virtqueue *vq, uint16_t req_idx)
if (rc) { if (rc) {
SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx); SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx);
/* Only READ and WRITE are supported for now. */ /* Only READ and WRITE are supported for now. */
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return; return;
} }
@ -786,7 +776,7 @@ process_packed_inflight_blk_task(struct spdk_vhost_virtqueue *vq,
if (rc) { if (rc) {
SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx); SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx);
/* Only READ and WRITE are supported for now. */ /* Only READ and WRITE are supported for now. */
invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP); blk_request_finish(VIRTIO_BLK_S_UNSUPP, task);
return; return;
} }