vhost: add APIs for live migration

This patch adds APIs to enable live migration for non-builtin data paths.

At src side, last_avail/used_idx from the device need to be set into the
virtio_net structure, and the log_base and log_size from the virtio_net
structure need to be set into the device.

At dst side, last_avail/used_idx need to be read from the virtio_net
structure and set into the device.

Signed-off-by: Zhihong Wang <zhihong.wang@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
Zhihong Wang 2018-04-02 19:46:56 +08:00 committed by Ferruh Yigit
parent 07718b4f87
commit bd2e0c3fe5
3 changed files with 117 additions and 0 deletions

View File

@ -526,6 +526,57 @@ int rte_vhost_vring_call(int vid, uint16_t vring_idx);
*/
uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid);
/**
* Get log base and log size of the vhost device
*
* @param vid
* vhost device ID
* @param log_base
* vhost log base
* @param log_size
* vhost log size
* @return
* 0 on success, -1 on failure
*/
int __rte_experimental
rte_vhost_get_log_base(int vid, uint64_t *log_base, uint64_t *log_size);
/**
* Get last_avail/used_idx of the vhost virtqueue
*
* @param vid
* vhost device ID
* @param queue_id
* vhost queue index
* @param last_avail_idx
* vhost last_avail_idx to get
* @param last_used_idx
* vhost last_used_idx to get
* @return
* 0 on success, -1 on failure
*/
int __rte_experimental
rte_vhost_get_vring_base(int vid, uint16_t queue_id,
uint16_t *last_avail_idx, uint16_t *last_used_idx);
/**
* Set last_avail/used_idx of the vhost virtqueue
*
* @param vid
* vhost device ID
* @param queue_id
* vhost queue index
* @param last_avail_idx
* last_avail_idx to set
* @param last_used_idx
* last_used_idx to set
* @return
* 0 on success, -1 on failure
*/
int __rte_experimental
rte_vhost_set_vring_base(int vid, uint16_t queue_id,
uint16_t last_avail_idx, uint16_t last_used_idx);
/**
* Get vdpa device id for vhost device.
*

View File

@ -71,4 +71,7 @@ EXPERIMENTAL {
rte_vhost_get_vdpa_device_id;
rte_vhost_driver_get_protocol_features;
rte_vhost_driver_get_queue_num;
rte_vhost_get_log_base;
rte_vhost_get_vring_base;
rte_vhost_set_vring_base;
} DPDK_18.02;

View File

@ -656,3 +656,66 @@ int rte_vhost_get_vdpa_device_id(int vid)
return dev->vdpa_dev_id;
}
int rte_vhost_get_log_base(int vid, uint64_t *log_base,
uint64_t *log_size)
{
struct virtio_net *dev = get_device(vid);
if (!dev)
return -1;
if (unlikely(!(dev->flags & VIRTIO_DEV_BUILTIN_VIRTIO_NET))) {
RTE_LOG(ERR, VHOST_DATA,
"(%d) %s: built-in vhost net backend is disabled.\n",
dev->vid, __func__);
return -1;
}
*log_base = dev->log_base;
*log_size = dev->log_size;
return 0;
}
int rte_vhost_get_vring_base(int vid, uint16_t queue_id,
uint16_t *last_avail_idx, uint16_t *last_used_idx)
{
struct virtio_net *dev = get_device(vid);
if (!dev)
return -1;
if (unlikely(!(dev->flags & VIRTIO_DEV_BUILTIN_VIRTIO_NET))) {
RTE_LOG(ERR, VHOST_DATA,
"(%d) %s: built-in vhost net backend is disabled.\n",
dev->vid, __func__);
return -1;
}
*last_avail_idx = dev->virtqueue[queue_id]->last_avail_idx;
*last_used_idx = dev->virtqueue[queue_id]->last_used_idx;
return 0;
}
int rte_vhost_set_vring_base(int vid, uint16_t queue_id,
uint16_t last_avail_idx, uint16_t last_used_idx)
{
struct virtio_net *dev = get_device(vid);
if (!dev)
return -1;
if (unlikely(!(dev->flags & VIRTIO_DEV_BUILTIN_VIRTIO_NET))) {
RTE_LOG(ERR, VHOST_DATA,
"(%d) %s: built-in vhost net backend is disabled.\n",
dev->vid, __func__);
return -1;
}
dev->virtqueue[queue_id]->last_avail_idx = last_avail_idx;
dev->virtqueue[queue_id]->last_used_idx = last_used_idx;
return 0;
}