summaryrefslogtreecommitdiff
path: root/drivers/net/ifc
diff options
context:
space:
mode:
authorXiao Wang <xiao.w.wang@intel.com>2019-01-23 21:02:59 +0800
committerFerruh Yigit <ferruh.yigit@intel.com>2019-02-08 19:27:07 +0100
commitb1721295834b4da3e683e87ec5823b355624ebe2 (patch)
tree222fc014cf3f80aeb220a97c8c7e3b9268bb626f /drivers/net/ifc
parent8b90e4358112b9e41f8eaa1ba14c783570307fea (diff)
downloaddpdk-next-eventdev-b1721295834b4da3e683e87ec5823b355624ebe2.zip
dpdk-next-eventdev-b1721295834b4da3e683e87ec5823b355624ebe2.tar.gz
dpdk-next-eventdev-b1721295834b4da3e683e87ec5823b355624ebe2.tar.xz
vhost: remove vDPA available ring relay helper
We don't need to relay available ring and check the desc, vdpa device can access the available ring in the guest directly. With this patch, we can achieve better throughput and lower CPU usage. Signed-off-by: Xiao Wang <xiao.w.wang@intel.com> Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Diffstat (limited to 'drivers/net/ifc')
-rw-r--r--drivers/net/ifc/ifcvf_vdpa.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/drivers/net/ifc/ifcvf_vdpa.c b/drivers/net/ifc/ifcvf_vdpa.c
index 972033b..921a7e0 100644
--- a/drivers/net/ifc/ifcvf_vdpa.c
+++ b/drivers/net/ifc/ifcvf_vdpa.c
@@ -584,9 +584,12 @@ m_ifcvf_start(struct ifcvf_internal *internal)
}
hw->vring[i].desc = gpa;
- hw->vring[i].avail = m_vring_iova +
- (char *)internal->m_vring[i].avail -
- (char *)internal->m_vring[i].desc;
+ gpa = hva_to_gpa(vid, (uint64_t)(uintptr_t)vq.avail);
+ if (gpa == 0) {
+ DRV_LOG(ERR, "Fail to get GPA for available ring.");
+ return -1;
+ }
+ hw->vring[i].avail = gpa;
hw->vring[i].used = m_vring_iova +
(char *)internal->m_vring[i].used -
@@ -674,13 +677,6 @@ m_disable_vfio_intr(struct ifcvf_internal *internal)
}
static void
-update_avail_ring(struct ifcvf_internal *internal, uint16_t qid)
-{
- rte_vdpa_relay_vring_avail(internal->vid, qid, &internal->m_vring[qid]);
- ifcvf_notify_queue(&internal->hw, qid);
-}
-
-static void
update_used_ring(struct ifcvf_internal *internal, uint16_t qid)
{
rte_vdpa_relay_vring_used(internal->vid, qid, &internal->m_vring[qid]);
@@ -703,12 +699,10 @@ vring_relay(void *arg)
vid = internal->vid;
q_num = rte_vhost_get_vring_num(vid);
/* prepare the mediated vring */
- for (qid = 0; qid < q_num; qid++) {
+ for (qid = 0; qid < q_num; qid++)
rte_vhost_get_vring_base(vid, qid,
&internal->m_vring[qid].avail->idx,
&internal->m_vring[qid].used->idx);
- rte_vdpa_relay_vring_avail(vid, qid, &internal->m_vring[qid]);
- }
/* add notify fd and interrupt fd to epoll */
epfd = epoll_create(IFCVF_MAX_QUEUES * 2);
@@ -775,7 +769,7 @@ vring_relay(void *arg)
if (events[i].data.u32 & 1)
update_used_ring(internal, qid);
else
- update_avail_ring(internal, qid);
+ ifcvf_notify_queue(&internal->hw, qid);
}
}
@@ -818,13 +812,14 @@ static int
ifcvf_sw_fallback_switchover(struct ifcvf_internal *internal)
{
int ret;
+ int vid = internal->vid;
/* stop the direct IO data path */
unset_notify_relay(internal);
vdpa_ifcvf_stop(internal);
vdpa_disable_vfio_intr(internal);
- ret = rte_vhost_host_notifier_ctrl(internal->vid, false);
+ ret = rte_vhost_host_notifier_ctrl(vid, false);
if (ret && ret != -ENOTSUP)
goto error;
@@ -843,6 +838,8 @@ ifcvf_sw_fallback_switchover(struct ifcvf_internal *internal)
if (ret)
goto stop_vf;
+ rte_vhost_host_notifier_ctrl(vid, true);
+
internal->sw_fallback_running = true;
return 0;