Commit 3ed4c29a authored by Rui Chang's avatar Rui Chang Committed by Tomasz Zawadzki
Browse files

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: default avatarRui 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: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent b0262063
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -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
+9 −5
Original line number Diff line number Diff line
@@ -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 *