From eef6af95d1ffb03f57d72ec1fe6346028710f61b Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Fri, 17 Sep 2021 10:47:53 +0200 Subject: [PATCH] vhost_blk: separate out generic virtio_blk request processing This patch adds process_virtio_blk_request() that will be called by virtio_blk transports to process incoming requests. Meanwhile vhost_user_blk_request_finish() will be replaced with a callback to the virtio_blk transport to notify of the result. blk_request_finish() should only be called as direct result of process_virtio_blk_request(), usually from it. Some error paths now call vhost_user_blk_request_finish() directly, if vhost_user_process_blk_request() was not called yet. Signed-off-by: Tomasz Zawadzki Change-Id: I0cce22f15b922fe45f30fb659c384b6e836def4c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9537 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker Reviewed-by: Changpeng Liu --- lib/vhost/vhost_blk.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/lib/vhost/vhost_blk.c b/lib/vhost/vhost_blk.c index eeaff87b2..b21e58f3f 100644 --- a/lib/vhost/vhost_blk.c +++ b/lib/vhost/vhost_blk.c @@ -110,8 +110,8 @@ static const struct spdk_json_object_decoder rpc_construct_vhost_blk[] = { static const struct spdk_vhost_dev_backend vhost_blk_device_backend; static int -process_blk_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, - struct spdk_vhost_blk_task *task); +virtio_blk_process_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, + struct spdk_vhost_blk_task *task); static int vhost_user_process_blk_request(struct spdk_vhost_user_blk_task *user_task) @@ -119,7 +119,7 @@ vhost_user_process_blk_request(struct spdk_vhost_user_blk_task *user_task) struct spdk_vhost_blk_session *bvsession = user_task->bvsession; struct spdk_vhost_dev *vdev = &bvsession->bvdev->vdev; - return process_blk_request(vdev, bvsession->io_channel, &user_task->blk_task); + return virtio_blk_process_request(vdev, bvsession->io_channel, &user_task->blk_task); } static struct spdk_vhost_blk_dev * @@ -179,14 +179,10 @@ blk_task_enqueue(struct spdk_vhost_user_blk_task *task) } static void -blk_request_finish(uint8_t status, struct spdk_vhost_blk_task *task) +vhost_user_blk_request_finish(uint8_t status, struct spdk_vhost_blk_task *task) { struct spdk_vhost_user_blk_task *user_task; - if (task->status) { - *task->status = status; - } - user_task = SPDK_CONTAINEROF(task, struct spdk_vhost_user_blk_task, blk_task); blk_task_enqueue(user_task); @@ -196,6 +192,17 @@ blk_request_finish(uint8_t status, struct spdk_vhost_blk_task *task) blk_task_finish(user_task); } +static void +blk_request_finish(uint8_t status, struct spdk_vhost_blk_task *task) +{ + + if (task->status) { + *task->status = status; + } + + vhost_user_blk_request_finish(status, task); +} + /* * Process task's descriptor chain and setup data related fields. * Return @@ -440,7 +447,7 @@ blk_request_resubmit(void *arg) struct spdk_vhost_blk_task *task = arg; int rc = 0; - rc = process_blk_request(task->bdev_io_wait_vdev, task->bdev_io_wait_ch, task); + rc = virtio_blk_process_request(task->bdev_io_wait_vdev, task->bdev_io_wait_ch, task); if (rc == 0) { SPDK_DEBUGLOG(vhost_blk, "====== Task %p resubmitted ======\n", task); } else { @@ -468,8 +475,8 @@ blk_request_queue_io(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, } static int -process_blk_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, - struct spdk_vhost_blk_task *task) +virtio_blk_process_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, + struct spdk_vhost_blk_task *task) { struct spdk_vhost_blk_dev *bvdev = to_blk_dev(vdev); struct virtio_blk_outhdr req; @@ -676,7 +683,7 @@ process_blk_task(struct spdk_vhost_virtqueue *vq, uint16_t req_idx) if (rc) { SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx); /* Only READ and WRITE are supported for now. */ - blk_request_finish(VIRTIO_BLK_S_UNSUPP, blk_task); + vhost_user_blk_request_finish(VIRTIO_BLK_S_UNSUPP, blk_task); return; } @@ -741,7 +748,7 @@ process_packed_blk_task(struct spdk_vhost_virtqueue *vq, uint16_t req_idx) if (rc) { SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx); /* Only READ and WRITE are supported for now. */ - blk_request_finish(VIRTIO_BLK_S_UNSUPP, blk_task); + vhost_user_blk_request_finish(VIRTIO_BLK_S_UNSUPP, blk_task); return; } @@ -802,7 +809,7 @@ process_packed_inflight_blk_task(struct spdk_vhost_virtqueue *vq, if (rc) { SPDK_DEBUGLOG(vhost_blk, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx); /* Only READ and WRITE are supported for now. */ - blk_request_finish(VIRTIO_BLK_S_UNSUPP, blk_task); + vhost_user_blk_request_finish(VIRTIO_BLK_S_UNSUPP, blk_task); return; }