From a8757f60816fad412759031c278949c8d717caab Mon Sep 17 00:00:00 2001 From: Tomasz Zawadzki Date: Thu, 21 Apr 2022 15:15:30 +0200 Subject: [PATCH] lib/vhost: cache vdev and io channel for bdev io wait Previously the blk_request_queue_io() and blk_request_resubmit() relied on vdev and channel contained in task or bvsession structures. In an effor to make the I/O processing for virtio blk not reliant on vhost_user, this patch caches the vbdev and io channel submited in process_blk_request(). Later in the series, vhost_user structures will be separated out from the spdk_vhost_blk_task. Signed-off-by: Tomasz Zawadzki Change-Id: If1ea38a77af8fcfee12054f5857a6db2db2093c6 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12334 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris --- lib/vhost/vhost_blk.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/vhost/vhost_blk.c b/lib/vhost/vhost_blk.c index afefaedf4..f25afaf8a 100644 --- a/lib/vhost/vhost_blk.c +++ b/lib/vhost/vhost_blk.c @@ -76,6 +76,8 @@ struct spdk_vhost_blk_task { /* for io wait */ struct spdk_bdev_io_wait_entry bdev_io_wait; + struct spdk_io_channel *bdev_io_wait_ch; + struct spdk_vhost_dev *bdev_io_wait_vdev; /* If set, the task is currently used for I/O processing. */ bool used; @@ -447,7 +449,7 @@ blk_request_resubmit(void *arg) struct spdk_vhost_blk_task *task = (struct spdk_vhost_blk_task *)arg; int rc = 0; - rc = vhost_user_process_blk_request(task); + rc = process_blk_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 { @@ -456,17 +458,20 @@ blk_request_resubmit(void *arg) } static inline void -blk_request_queue_io(struct spdk_vhost_blk_task *task) +blk_request_queue_io(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, + struct spdk_vhost_blk_task *task) { int rc; struct spdk_vhost_blk_session *bvsession = task->bvsession; - struct spdk_bdev *bdev = bvsession->bvdev->bdev; + struct spdk_bdev *bdev = task->bdev_io->bdev; task->bdev_io_wait.bdev = bdev; task->bdev_io_wait.cb_fn = blk_request_resubmit; task->bdev_io_wait.cb_arg = task; + task->bdev_io_wait_ch = ch; + task->bdev_io_wait_vdev = vdev; - rc = spdk_bdev_queue_io_wait(bdev, bvsession->io_channel, &task->bdev_io_wait); + rc = spdk_bdev_queue_io_wait(bdev, ch, &task->bdev_io_wait); if (rc != 0) { SPDK_ERRLOG("%s: failed to queue I/O, rc=%d\n", bvsession->vsession.name, rc); blk_request_finish(VIRTIO_BLK_S_IOERR, task); @@ -550,7 +555,7 @@ process_blk_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, if (rc) { if (rc == -ENOMEM) { SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); - blk_request_queue_io(task); + blk_request_queue_io(vdev, ch, task); } else { blk_request_finish(VIRTIO_BLK_S_IOERR, task); return -1; @@ -577,7 +582,7 @@ process_blk_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, if (rc) { if (rc == -ENOMEM) { SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); - blk_request_queue_io(task); + blk_request_queue_io(vdev, ch, task); } else { blk_request_finish(VIRTIO_BLK_S_IOERR, task); return -1; @@ -607,7 +612,7 @@ process_blk_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, if (rc) { if (rc == -ENOMEM) { SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); - blk_request_queue_io(task); + blk_request_queue_io(vdev, ch, task); } else { blk_request_finish(VIRTIO_BLK_S_IOERR, task); return -1; @@ -627,7 +632,7 @@ process_blk_request(struct spdk_vhost_dev *vdev, struct spdk_io_channel *ch, if (rc) { if (rc == -ENOMEM) { SPDK_DEBUGLOG(vhost_blk, "No memory, start to queue io.\n"); - blk_request_queue_io(task); + blk_request_queue_io(vdev, ch, task); } else { blk_request_finish(VIRTIO_BLK_S_IOERR, task); return -1;