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 <rui.chang@arm.com> Change-Id: I610a8c2f4e74f46bd56955d31284372c775507ed Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12647 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: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
This commit is contained in:
parent
b0262063d3
commit
3ed4c29a11
@ -861,7 +861,7 @@ submit_inflight_desc(struct spdk_vhost_blk_session *bvsession,
|
|||||||
resubmit->resubmit_num = 0;
|
resubmit->resubmit_num = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
process_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq)
|
process_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq)
|
||||||
{
|
{
|
||||||
struct spdk_vhost_session *vsession = &bvsession->vsession;
|
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));
|
reqs_cnt = vhost_vq_avail_ring_get(vq, reqs, SPDK_COUNTOF(reqs));
|
||||||
if (!reqs_cnt) {
|
if (!reqs_cnt) {
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < reqs_cnt; i++) {
|
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]);
|
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)
|
process_packed_vq(struct spdk_vhost_blk_session *bvsession, struct spdk_vhost_virtqueue *vq)
|
||||||
{
|
{
|
||||||
uint16_t i = 0;
|
uint16_t i = 0;
|
||||||
|
uint16_t count = 0;
|
||||||
|
|
||||||
submit_inflight_desc(bvsession, vq);
|
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)) {
|
vhost_vq_packed_ring_is_avail(vq)) {
|
||||||
SPDK_DEBUGLOG(vhost_blk, "====== Starting processing request idx %"PRIu16"======\n",
|
SPDK_DEBUGLOG(vhost_blk, "====== Starting processing request idx %"PRIu16"======\n",
|
||||||
vq->last_avail_idx);
|
vq->last_avail_idx);
|
||||||
|
count++;
|
||||||
process_packed_blk_task(vq, vq->last_avail_idx);
|
process_packed_blk_task(vq, vq->last_avail_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -914,17 +919,18 @@ _vdev_vq_worker(struct spdk_vhost_virtqueue *vq)
|
|||||||
struct spdk_vhost_session *vsession = vq->vsession;
|
struct spdk_vhost_session *vsession = vq->vsession;
|
||||||
struct spdk_vhost_blk_session *bvsession = to_blk_session(vsession);
|
struct spdk_vhost_blk_session *bvsession = to_blk_session(vsession);
|
||||||
bool packed_ring;
|
bool packed_ring;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
packed_ring = vq->packed.packed_ring;
|
packed_ring = vq->packed.packed_ring;
|
||||||
if (packed_ring) {
|
if (packed_ring) {
|
||||||
process_packed_vq(bvsession, vq);
|
rc = process_packed_vq(bvsession, vq);
|
||||||
} else {
|
} else {
|
||||||
process_vq(bvsession, vq);
|
rc = process_vq(bvsession, vq);
|
||||||
}
|
}
|
||||||
|
|
||||||
vhost_session_vq_used_signal(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_blk_session *bvsession = arg;
|
||||||
struct spdk_vhost_session *vsession = &bvsession->vsession;
|
struct spdk_vhost_session *vsession = &bvsession->vsession;
|
||||||
uint16_t q_idx;
|
uint16_t q_idx;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) {
|
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
|
static void
|
||||||
|
@ -775,7 +775,7 @@ submit_inflight_desc(struct spdk_vhost_scsi_session *svsession,
|
|||||||
resubmit->resubmit_num = 0;
|
resubmit->resubmit_num = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
process_vq(struct spdk_vhost_scsi_session *svsession, struct spdk_vhost_virtqueue *vq)
|
process_vq(struct spdk_vhost_scsi_session *svsession, struct spdk_vhost_virtqueue *vq)
|
||||||
{
|
{
|
||||||
struct spdk_vhost_session *vsession = &svsession->vsession;
|
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]);
|
process_scsi_task(vsession, vq, reqs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return reqs_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -809,6 +811,7 @@ vdev_mgmt_worker(void *arg)
|
|||||||
{
|
{
|
||||||
struct spdk_vhost_scsi_session *svsession = arg;
|
struct spdk_vhost_scsi_session *svsession = arg;
|
||||||
struct spdk_vhost_session *vsession = &svsession->vsession;
|
struct spdk_vhost_session *vsession = &svsession->vsession;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
process_removed_devs(svsession);
|
process_removed_devs(svsession);
|
||||||
|
|
||||||
@ -817,11 +820,11 @@ vdev_mgmt_worker(void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (vsession->virtqueue[VIRTIO_SCSI_CONTROLQ].vring.desc) {
|
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]);
|
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
|
static int
|
||||||
@ -830,14 +833,15 @@ vdev_worker(void *arg)
|
|||||||
struct spdk_vhost_scsi_session *svsession = arg;
|
struct spdk_vhost_scsi_session *svsession = arg;
|
||||||
struct spdk_vhost_session *vsession = &svsession->vsession;
|
struct spdk_vhost_session *vsession = &svsession->vsession;
|
||||||
uint32_t q_idx;
|
uint32_t q_idx;
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
for (q_idx = VIRTIO_SCSI_REQUESTQ; q_idx < vsession->max_queues; q_idx++) {
|
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);
|
vhost_session_used_signal(vsession);
|
||||||
|
|
||||||
return SPDK_POLLER_BUSY;
|
return rc > 0 ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct spdk_vhost_scsi_dev *
|
static struct spdk_vhost_scsi_dev *
|
||||||
|
Loading…
Reference in New Issue
Block a user