vhost/blk: refactor APIs to base on sessions

Prepared APIs to operate on a session parameter rather
than a device parameter. Some of those functions are
now ready to support more than one session per device.

Change-Id: Id55e70ae521039f5acc47e80ab8b0aa043679d95
Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/438679
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Darek Stojaczyk 2018-12-16 01:15:06 +01:00
parent a9019c6dad
commit bd7b05e419

View File

@ -46,7 +46,7 @@
struct spdk_vhost_blk_task { struct spdk_vhost_blk_task {
struct spdk_bdev_io *bdev_io; struct spdk_bdev_io *bdev_io;
struct spdk_vhost_blk_dev *bvdev; struct spdk_vhost_blk_session *bvsession;
struct spdk_vhost_virtqueue *vq; struct spdk_vhost_virtqueue *vq;
volatile uint8_t *status; volatile uint8_t *status;
@ -85,14 +85,15 @@ struct spdk_vhost_blk_session {
static const struct spdk_vhost_dev_backend vhost_blk_device_backend; static const struct spdk_vhost_dev_backend vhost_blk_device_backend;
static int static int
process_blk_request(struct spdk_vhost_blk_task *task, struct spdk_vhost_blk_dev *bvdev, process_blk_request(struct spdk_vhost_blk_task *task,
struct spdk_vhost_blk_session *bvsession,
struct spdk_vhost_virtqueue *vq); struct spdk_vhost_virtqueue *vq);
static void static void
blk_task_finish(struct spdk_vhost_blk_task *task) blk_task_finish(struct spdk_vhost_blk_task *task)
{ {
assert(task->bvdev->vdev.session->task_cnt > 0); assert(task->bvsession->vsession.task_cnt > 0);
task->bvdev->vdev.session->task_cnt--; task->bvsession->vsession.task_cnt--;
task->used = false; task->used = false;
} }
@ -103,7 +104,7 @@ invalid_blk_request(struct spdk_vhost_blk_task *task, uint8_t status)
*task->status = status; *task->status = status;
} }
spdk_vhost_vq_used_ring_enqueue(task->bvdev->vdev.session, task->vq, task->req_idx, spdk_vhost_vq_used_ring_enqueue(&task->bvsession->vsession, task->vq, task->req_idx,
task->used_len); task->used_len);
blk_task_finish(task); blk_task_finish(task);
SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK_DATA, "Invalid request (status=%" PRIu8")\n", status); SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK_DATA, "Invalid request (status=%" PRIu8")\n", status);
@ -117,15 +118,17 @@ invalid_blk_request(struct spdk_vhost_blk_task *task, uint8_t status)
* FIXME: Make this function return to rd_cnt and wr_cnt * FIXME: Make this function return to rd_cnt and wr_cnt
*/ */
static int static int
blk_iovs_setup(struct spdk_vhost_dev *vdev, struct spdk_vhost_virtqueue *vq, uint16_t req_idx, blk_iovs_setup(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq,
struct iovec *iovs, uint16_t *iovs_cnt, uint32_t *length) uint16_t req_idx, struct iovec *iovs, uint16_t *iovs_cnt, uint32_t *length)
{ {
struct spdk_vhost_session *vsession = &bvsession->vsession;
struct spdk_vhost_dev *vdev = vsession->vdev;
struct vring_desc *desc, *desc_table; struct vring_desc *desc, *desc_table;
uint16_t out_cnt = 0, cnt = 0; uint16_t out_cnt = 0, cnt = 0;
uint32_t desc_table_size, len = 0; uint32_t desc_table_size, len = 0;
int rc; int rc;
rc = spdk_vhost_vq_get_desc(vdev->session, vq, req_idx, &desc, &desc_table, &desc_table_size); rc = spdk_vhost_vq_get_desc(vsession, vq, req_idx, &desc, &desc_table, &desc_table_size);
if (rc != 0) { if (rc != 0) {
SPDK_ERRLOG("%s: Invalid descriptor at index %"PRIu16".\n", vdev->name, req_idx); SPDK_ERRLOG("%s: Invalid descriptor at index %"PRIu16".\n", vdev->name, req_idx);
return -1; return -1;
@ -142,7 +145,7 @@ blk_iovs_setup(struct spdk_vhost_dev *vdev, struct spdk_vhost_virtqueue *vq, uin
return -1; return -1;
} }
if (spdk_unlikely(spdk_vhost_vring_desc_to_iov(vdev->session, iovs, &cnt, desc))) { if (spdk_unlikely(spdk_vhost_vring_desc_to_iov(vsession, iovs, &cnt, desc))) {
SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "Invalid descriptor %" PRIu16" (req_idx = %"PRIu16").\n", SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "Invalid descriptor %" PRIu16" (req_idx = %"PRIu16").\n",
req_idx, cnt); req_idx, cnt);
return -1; return -1;
@ -180,7 +183,7 @@ static void
blk_request_finish(bool success, struct spdk_vhost_blk_task *task) blk_request_finish(bool success, struct spdk_vhost_blk_task *task)
{ {
*task->status = success ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR; *task->status = success ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR;
spdk_vhost_vq_used_ring_enqueue(task->bvdev->vdev.session, task->vq, task->req_idx, spdk_vhost_vq_used_ring_enqueue(&task->bvsession->vsession, task->vq, task->req_idx,
task->used_len); task->used_len);
SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "Finished task (%p) req_idx=%d\n status: %s\n", task, SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "Finished task (%p) req_idx=%d\n status: %s\n", task,
task->req_idx, success ? "OK" : "FAIL"); task->req_idx, success ? "OK" : "FAIL");
@ -202,7 +205,7 @@ blk_request_resubmit(void *arg)
struct spdk_vhost_blk_task *task = (struct spdk_vhost_blk_task *)arg; struct spdk_vhost_blk_task *task = (struct spdk_vhost_blk_task *)arg;
int rc = 0; int rc = 0;
rc = process_blk_request(task, task->bvdev, task->vq); rc = process_blk_request(task, task->bvsession, task->vq);
if (rc == 0) { if (rc == 0) {
SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "====== Task %p resubmitted ======\n", task); SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "====== Task %p resubmitted ======\n", task);
} else { } else {
@ -214,7 +217,7 @@ static inline void
blk_request_queue_io(struct spdk_vhost_blk_task *task) blk_request_queue_io(struct spdk_vhost_blk_task *task)
{ {
int rc; int rc;
struct spdk_vhost_blk_dev *bvdev = task->bvdev; struct spdk_vhost_blk_dev *bvdev = task->bvsession->bvdev;
struct spdk_bdev *bdev = bvdev->bdev; struct spdk_bdev *bdev = bvdev->bdev;
task->bdev_io_wait.bdev = bdev; task->bdev_io_wait.bdev = bdev;
@ -229,9 +232,11 @@ blk_request_queue_io(struct spdk_vhost_blk_task *task)
} }
static int static int
process_blk_request(struct spdk_vhost_blk_task *task, struct spdk_vhost_blk_dev *bvdev, process_blk_request(struct spdk_vhost_blk_task *task,
struct spdk_vhost_blk_session *bvsession,
struct spdk_vhost_virtqueue *vq) struct spdk_vhost_virtqueue *vq)
{ {
struct spdk_vhost_blk_dev *bvdev = bvsession->bvdev;
const struct virtio_blk_outhdr *req; const struct virtio_blk_outhdr *req;
struct virtio_blk_discard_write_zeroes *desc; struct virtio_blk_discard_write_zeroes *desc;
struct iovec *iov; struct iovec *iov;
@ -239,7 +244,7 @@ process_blk_request(struct spdk_vhost_blk_task *task, struct spdk_vhost_blk_dev
uint32_t payload_len; uint32_t payload_len;
int rc; int rc;
if (blk_iovs_setup(&bvdev->vdev, vq, task->req_idx, task->iovs, &task->iovcnt, &payload_len)) { if (blk_iovs_setup(bvsession, vq, task->req_idx, task->iovs, &task->iovcnt, &payload_len)) {
SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "Invalid request (req_idx = %"PRIu16").\n", task->req_idx); SPDK_DEBUGLOG(SPDK_LOG_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); invalid_blk_request(task, VIRTIO_BLK_S_UNSUPP);
@ -380,8 +385,9 @@ process_blk_request(struct spdk_vhost_blk_task *task, struct spdk_vhost_blk_dev
} }
static void static void
process_vq(struct spdk_vhost_blk_dev *bvdev, struct spdk_vhost_virtqueue *vq) process_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq)
{ {
struct spdk_vhost_blk_dev *bvdev = bvsession->bvdev;
struct spdk_vhost_blk_task *task; struct spdk_vhost_blk_task *task;
struct spdk_vhost_session *vsession = bvdev->vdev.session; struct spdk_vhost_session *vsession = bvdev->vdev.session;
int rc; int rc;
@ -419,7 +425,7 @@ process_vq(struct spdk_vhost_blk_dev *bvdev, struct spdk_vhost_virtqueue *vq)
task->status = NULL; task->status = NULL;
task->used_len = 0; task->used_len = 0;
rc = process_blk_request(task, bvdev, vq); rc = process_blk_request(task, bvsession, vq);
if (rc == 0) { if (rc == 0) {
SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "====== Task %p req_idx %d submitted ======\n", task, SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK, "====== Task %p req_idx %d submitted ======\n", task,
reqs[i]); reqs[i]);
@ -432,12 +438,13 @@ process_vq(struct spdk_vhost_blk_dev *bvdev, struct spdk_vhost_virtqueue *vq)
static int static int
vdev_worker(void *arg) vdev_worker(void *arg)
{ {
struct spdk_vhost_blk_dev *bvdev = arg; struct spdk_vhost_blk_session *bvsession = arg;
struct spdk_vhost_session *vsession = bvdev->vdev.session; struct spdk_vhost_session *vsession = &bvsession->vsession;
uint16_t q_idx; uint16_t q_idx;
for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) { for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) {
process_vq(bvdev, &vsession->virtqueue[q_idx]); process_vq(bvsession, &vsession->virtqueue[q_idx]);
} }
spdk_vhost_session_used_signal(vsession); spdk_vhost_session_used_signal(vsession);
@ -446,9 +453,9 @@ vdev_worker(void *arg)
} }
static void static void
no_bdev_process_vq(struct spdk_vhost_blk_dev *bvdev, struct spdk_vhost_virtqueue *vq) no_bdev_process_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq)
{ {
struct spdk_vhost_session *vsession = bvdev->vdev.session; struct spdk_vhost_session *vsession = &bvsession->vsession;
struct iovec iovs[SPDK_VHOST_IOVS_MAX]; struct iovec iovs[SPDK_VHOST_IOVS_MAX];
uint32_t length; uint32_t length;
uint16_t iovcnt, req_idx; uint16_t iovcnt, req_idx;
@ -458,7 +465,7 @@ no_bdev_process_vq(struct spdk_vhost_blk_dev *bvdev, struct spdk_vhost_virtqueue
} }
iovcnt = SPDK_COUNTOF(iovs); iovcnt = SPDK_COUNTOF(iovs);
if (blk_iovs_setup(&bvdev->vdev, vq, req_idx, iovs, &iovcnt, &length) == 0) { if (blk_iovs_setup(bvsession, vq, req_idx, iovs, &iovcnt, &length) == 0) {
*(volatile uint8_t *)iovs[iovcnt - 1].iov_base = VIRTIO_BLK_S_IOERR; *(volatile uint8_t *)iovs[iovcnt - 1].iov_base = VIRTIO_BLK_S_IOERR;
SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK_DATA, "Aborting request %" PRIu16"\n", req_idx); SPDK_DEBUGLOG(SPDK_LOG_VHOST_BLK_DATA, "Aborting request %" PRIu16"\n", req_idx);
} }
@ -469,12 +476,13 @@ no_bdev_process_vq(struct spdk_vhost_blk_dev *bvdev, struct spdk_vhost_virtqueue
static int static int
no_bdev_vdev_worker(void *arg) no_bdev_vdev_worker(void *arg)
{ {
struct spdk_vhost_blk_dev *bvdev = arg; struct spdk_vhost_blk_session *bvsession = arg;
struct spdk_vhost_session *vsession = bvdev->vdev.session; struct spdk_vhost_session *vsession = &bvsession->vsession;
struct spdk_vhost_blk_dev *bvdev = bvsession->bvdev;
uint16_t q_idx; uint16_t q_idx;
for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) { for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) {
no_bdev_process_vq(bvdev, &vsession->virtqueue[q_idx]); no_bdev_process_vq(bvsession, &vsession->virtqueue[q_idx]);
} }
spdk_vhost_session_used_signal(vsession); spdk_vhost_session_used_signal(vsession);
@ -536,7 +544,7 @@ _bdev_remove_cb(struct spdk_vhost_dev *vdev, void *arg)
bvdev->vdev.name); bvdev->vdev.name);
if (bvsession != NULL && bvsession->requestq_poller) { if (bvsession != NULL && bvsession->requestq_poller) {
spdk_poller_unregister(&bvsession->requestq_poller); spdk_poller_unregister(&bvsession->requestq_poller);
bvsession->requestq_poller = spdk_poller_register(no_bdev_vdev_worker, bvdev, 0); bvsession->requestq_poller = spdk_poller_register(no_bdev_vdev_worker, bvsession, 0);
} }
spdk_bdev_close(bvdev->bdev_desc); spdk_bdev_close(bvdev->bdev_desc);
@ -607,7 +615,7 @@ alloc_task_pool(struct spdk_vhost_blk_session *bvsession)
for (j = 0; j < task_cnt; j++) { for (j = 0; j < task_cnt; j++) {
task = &((struct spdk_vhost_blk_task *)vq->tasks)[j]; task = &((struct spdk_vhost_blk_task *)vq->tasks)[j];
task->bvdev = bvdev; task->bvsession = bvsession;
task->req_idx = j; task->req_idx = j;
task->vq = vq; task->vq = vq;
} }
@ -665,7 +673,7 @@ spdk_vhost_blk_start(struct spdk_vhost_dev *vdev, void *event_ctx)
} }
bvsession->requestq_poller = spdk_poller_register(bvdev->bdev ? vdev_worker : no_bdev_vdev_worker, bvsession->requestq_poller = spdk_poller_register(bvdev->bdev ? vdev_worker : no_bdev_vdev_worker,
bvdev, 0); bvsession, 0);
SPDK_INFOLOG(SPDK_LOG_VHOST, "Started poller for vhost controller %s on lcore %d\n", SPDK_INFOLOG(SPDK_LOG_VHOST, "Started poller for vhost controller %s on lcore %d\n",
vdev->name, vdev->lcore); vdev->name, vdev->lcore);
out: out: