From 3ed4c29a11c9a31cc87244a568bbee02c14376ff Mon Sep 17 00:00:00 2001 From: Rui Chang Date: Wed, 11 May 2022 18:40:11 +0800 Subject: [PATCH] lib/vhost: Fix vhost user cpu usage statistic issue Currently, when you run vhost user target, no matter if the reactor is busy or not, spdk_top always shows 100% busy. Fix this by real load status. Signed-off-by: Rui Chang Change-Id: I610a8c2f4e74f46bd56955d31284372c775507ed Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12647 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto --- lib/vhost/vhost_blk.c | 25 ++++++++++++++++--------- lib/vhost/vhost_scsi.c | 14 +++++++++----- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/vhost/vhost_blk.c b/lib/vhost/vhost_blk.c index b21e58f3f..601e9a93e 100644 --- a/lib/vhost/vhost_blk.c +++ b/lib/vhost/vhost_blk.c @@ -861,7 +861,7 @@ submit_inflight_desc(struct spdk_vhost_blk_session *bvsession, resubmit->resubmit_num = 0; } -static void +static int process_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq) { struct spdk_vhost_session *vsession = &bvsession->vsession; @@ -872,7 +872,7 @@ process_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue reqs_cnt = vhost_vq_avail_ring_get(vq, reqs, SPDK_COUNTOF(reqs)); if (!reqs_cnt) { - return; + return 0; } for (i = 0; i < reqs_cnt; i++) { @@ -890,12 +890,15 @@ process_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue process_blk_task(vq, reqs[i]); } + + return reqs_cnt; } -static void +static int process_packed_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq) { uint16_t i = 0; + uint16_t count = 0; submit_inflight_desc(bvsession, vq); @@ -903,9 +906,11 @@ process_packed_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_vi vhost_vq_packed_ring_is_avail(vq)) { SPDK_DEBUGLOG(vhost_blk, "====== Starting processing request idx %"PRIu16"======\n", vq->last_avail_idx); - + count++; process_packed_blk_task(vq, vq->last_avail_idx); } + + return count; } static int @@ -914,17 +919,18 @@ _vdev_vq_worker(struct spdk_vhost_virtqueue *vq) struct spdk_vhost_session *vsession = vq->vsession; struct spdk_vhost_blk_session *bvsession = to_blk_session(vsession); bool packed_ring; + int rc = 0; packed_ring = vq->packed.packed_ring; if (packed_ring) { - process_packed_vq(bvsession, vq); + rc = process_packed_vq(bvsession, vq); } else { - process_vq(bvsession, vq); + rc = process_vq(bvsession, vq); } vhost_session_vq_used_signal(vq); - return SPDK_POLLER_BUSY; + return rc; } @@ -942,12 +948,13 @@ vdev_worker(void *arg) struct spdk_vhost_blk_session *bvsession = arg; struct spdk_vhost_session *vsession = &bvsession->vsession; uint16_t q_idx; + int rc = 0; for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) { - _vdev_vq_worker(&vsession->virtqueue[q_idx]); + rc += _vdev_vq_worker(&vsession->virtqueue[q_idx]); } - return SPDK_POLLER_BUSY; + return rc > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE; } static void diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index 85970c6e6..dd7b0fc0e 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -775,7 +775,7 @@ submit_inflight_desc(struct spdk_vhost_scsi_session *svsession, resubmit->resubmit_num = 0; } -static void +static int process_vq(struct spdk_vhost_scsi_session *svsession, struct spdk_vhost_virtqueue *vq) { struct spdk_vhost_session *vsession = &svsession->vsession; @@ -802,6 +802,8 @@ process_vq(struct spdk_vhost_scsi_session *svsession, struct spdk_vhost_virtqueu process_scsi_task(vsession, vq, reqs[i]); } + + return reqs_cnt; } static int @@ -809,6 +811,7 @@ vdev_mgmt_worker(void *arg) { struct spdk_vhost_scsi_session *svsession = arg; struct spdk_vhost_session *vsession = &svsession->vsession; + int rc = 0; process_removed_devs(svsession); @@ -817,11 +820,11 @@ vdev_mgmt_worker(void *arg) } if (vsession->virtqueue[VIRTIO_SCSI_CONTROLQ].vring.desc) { - process_vq(svsession, &vsession->virtqueue[VIRTIO_SCSI_CONTROLQ]); + rc = process_vq(svsession, &vsession->virtqueue[VIRTIO_SCSI_CONTROLQ]); vhost_vq_used_signal(vsession, &vsession->virtqueue[VIRTIO_SCSI_CONTROLQ]); } - return SPDK_POLLER_BUSY; + return rc > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE; } static int @@ -830,14 +833,15 @@ vdev_worker(void *arg) struct spdk_vhost_scsi_session *svsession = arg; struct spdk_vhost_session *vsession = &svsession->vsession; uint32_t q_idx; + int rc = 0; for (q_idx = VIRTIO_SCSI_REQUESTQ; q_idx < vsession->max_queues; q_idx++) { - process_vq(svsession, &vsession->virtqueue[q_idx]); + rc = process_vq(svsession, &vsession->virtqueue[q_idx]); } vhost_session_used_signal(vsession); - return SPDK_POLLER_BUSY; + return rc > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE; } static struct spdk_vhost_scsi_dev *