Commit d2db3cdf authored by Liu Xiaodong's avatar Liu Xiaodong Committed by Tomasz Zawadzki
Browse files

vhost: extract vhost_session_vq_used_signal



Change-Id: I249e3e0df45f394c03aedfa7fa2a960de7419a58
Signed-off-by: default avatarLiu Xiaodong <xiaodong.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4862


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 6a1ec6a6
Loading
Loading
Loading
Loading
+38 −39
Original line number Diff line number Diff line
@@ -327,21 +327,16 @@ session_vq_io_stats_update(struct spdk_vhost_session *vsession,
}

static void
check_session_io_stats(struct spdk_vhost_session *vsession, uint64_t now)
check_session_vq_io_stats(struct spdk_vhost_session *vsession,
			  struct spdk_vhost_virtqueue *virtqueue, uint64_t now)
{
	struct spdk_vhost_virtqueue *virtqueue;
	uint16_t q_idx;

	if (now < vsession->next_stats_check_time) {
		return;
	}

	vsession->next_stats_check_time = now + vsession->stats_check_interval;
	for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) {
		virtqueue = &vsession->virtqueue[q_idx];
	session_vq_io_stats_update(vsession, virtqueue, now);
}
}

static inline bool
vhost_vq_event_is_suppressed(struct spdk_vhost_virtqueue *vq)
@@ -360,44 +355,36 @@ vhost_vq_event_is_suppressed(struct spdk_vhost_virtqueue *vq)
}

void
vhost_session_used_signal(struct spdk_vhost_session *vsession)
vhost_session_vq_used_signal(struct spdk_vhost_virtqueue *virtqueue)
{
	struct spdk_vhost_virtqueue *virtqueue;
	struct spdk_vhost_session *vsession = virtqueue->vsession;
	uint64_t now;
	uint16_t q_idx;

	if (vsession->coalescing_delay_time_base == 0) {
		for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) {
			virtqueue = &vsession->virtqueue[q_idx];

		if (virtqueue->vring.desc == NULL) {
				continue;
			return;
		}

		if (vhost_vq_event_is_suppressed(virtqueue)) {
				continue;
			return;
		}

		vhost_vq_used_signal(vsession, virtqueue);
		}
	} else {
		now = spdk_get_ticks();
		check_session_io_stats(vsession, now);

		for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) {
			virtqueue = &vsession->virtqueue[q_idx];
		check_session_vq_io_stats(vsession, virtqueue, now);

		/* No need for event right now */
		if (now < virtqueue->next_event_time) {
				continue;
			return;
		}

		if (vhost_vq_event_is_suppressed(virtqueue)) {
				continue;
			return;
		}

		if (!vhost_vq_used_signal(vsession, virtqueue)) {
				continue;
			return;
		}

		/* Syscall is quite long so update time */
@@ -405,6 +392,17 @@ vhost_session_used_signal(struct spdk_vhost_session *vsession)
		virtqueue->next_event_time = now + virtqueue->irq_delay_time;
	}
}

void
vhost_session_used_signal(struct spdk_vhost_session *vsession)
{
	struct spdk_vhost_virtqueue *virtqueue;
	uint16_t q_idx;

	for (q_idx = 0; q_idx < vsession->max_queues; q_idx++) {
		virtqueue = &vsession->virtqueue[q_idx];
		vhost_session_vq_used_signal(virtqueue);
	}
}

static int
@@ -1215,6 +1213,7 @@ vhost_start_device_cb(int vid)
	for (i = 0; i < SPDK_VHOST_MAX_VQUEUES; i++) {
		struct spdk_vhost_virtqueue *q = &vsession->virtqueue[i];

		q->vsession = vsession;
		q->vring_idx = -1;
		if (rte_vhost_get_vhost_vring(vid, i, &q->vring)) {
			continue;
+8 −0
Original line number Diff line number Diff line
@@ -122,6 +122,8 @@ struct spdk_vhost_virtqueue {

	/* Associated vhost_virtqueue in the virtio device's virtqueue list */
	uint32_t vring_idx;

	struct spdk_vhost_session *vsession;
} __attribute((aligned(SPDK_CACHE_LINE_SIZE)));

struct spdk_vhost_session {
@@ -300,6 +302,12 @@ int vhost_vq_used_signal(struct spdk_vhost_session *vsession, struct spdk_vhost_
 */
void vhost_session_used_signal(struct spdk_vhost_session *vsession);

/**
 * Send IRQs for the queue that need to be signaled.
 * \param vq virtqueue
 */
void vhost_session_vq_used_signal(struct spdk_vhost_virtqueue *virtqueue);

void vhost_vq_used_ring_enqueue(struct spdk_vhost_session *vsession,
				struct spdk_vhost_virtqueue *vq,
				uint16_t id, uint32_t len);