vhost: add APIs for datapath configuration

This patch adds APIs for datapath configuration.

The did of the vhost-user socket can be set to identify the backend device,
in this case each vhost-user socket can have only 1 connection. The did is
set to -1 by default when the software datapath is used.

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:54 +08:00 committed by Ferruh Yigit
parent d7280c9fff
commit b4953225ce
5 changed files with 149 additions and 0 deletions

View File

@ -199,6 +199,41 @@ int rte_vhost_driver_register(const char *path, uint64_t flags);
/* Unregister vhost driver. This is only meaningful to vhost user. */
int rte_vhost_driver_unregister(const char *path);
/**
* Set the vdpa device id, enforce single connection per socket
*
* @param path
* The vhost-user socket file path
* @param did
* Device id
* @return
* 0 on success, -1 on failure
*/
int __rte_experimental
rte_vhost_driver_attach_vdpa_device(const char *path, int did);
/**
* Unset the vdpa device id
*
* @param path
* The vhost-user socket file path
* @return
* 0 on success, -1 on failure
*/
int __rte_experimental
rte_vhost_driver_detach_vdpa_device(const char *path);
/**
* Get the device id
*
* @param path
* The vhost-user socket file path
* @return
* Device id, -1 on failure
*/
int __rte_experimental
rte_vhost_driver_get_vdpa_device_id(const char *path);
/**
* Set the feature bits the vhost-user driver supports.
*
@ -464,6 +499,17 @@ int rte_vhost_vring_call(int vid, uint16_t vring_idx);
*/
uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid);
/**
* Get vdpa device id for vhost device.
*
* @param vid
* vhost device id
* @return
* device id
*/
int __rte_experimental
rte_vhost_get_vdpa_device_id(int vid);
#ifdef __cplusplus
}
#endif

View File

@ -65,4 +65,8 @@ EXPERIMENTAL {
rte_vdpa_unregister_device;
rte_vdpa_find_device_id;
rte_vdpa_get_device;
rte_vhost_driver_attach_vdpa_device;
rte_vhost_driver_detach_vdpa_device;
rte_vhost_driver_get_vdpa_device_id;
rte_vhost_get_vdpa_device_id;
} DPDK_18.02;

View File

@ -51,6 +51,13 @@ struct vhost_user_socket {
uint64_t supported_features;
uint64_t features;
/*
* Device id to identify a specific backend device.
* It's set to -1 for the default software implementation.
* If valid, one socket can have 1 connection only.
*/
int vdpa_dev_id;
struct vhost_device_ops const *notify_ops;
};
@ -545,6 +552,52 @@ find_vhost_user_socket(const char *path)
return NULL;
}
int
rte_vhost_driver_attach_vdpa_device(const char *path, int did)
{
struct vhost_user_socket *vsocket;
if (rte_vdpa_get_device(did) == NULL)
return -1;
pthread_mutex_lock(&vhost_user.mutex);
vsocket = find_vhost_user_socket(path);
if (vsocket)
vsocket->vdpa_dev_id = did;
pthread_mutex_unlock(&vhost_user.mutex);
return vsocket ? 0 : -1;
}
int
rte_vhost_driver_detach_vdpa_device(const char *path)
{
struct vhost_user_socket *vsocket;
pthread_mutex_lock(&vhost_user.mutex);
vsocket = find_vhost_user_socket(path);
if (vsocket)
vsocket->vdpa_dev_id = -1;
pthread_mutex_unlock(&vhost_user.mutex);
return vsocket ? 0 : -1;
}
int
rte_vhost_driver_get_vdpa_device_id(const char *path)
{
struct vhost_user_socket *vsocket;
int did = -1;
pthread_mutex_lock(&vhost_user.mutex);
vsocket = find_vhost_user_socket(path);
if (vsocket)
did = vsocket->vdpa_dev_id;
pthread_mutex_unlock(&vhost_user.mutex);
return did;
}
int
rte_vhost_driver_disable_features(const char *path, uint64_t features)
{

View File

@ -283,6 +283,7 @@ vhost_new_device(void)
dev->vid = i;
dev->flags = VIRTIO_DEV_BUILTIN_VIRTIO_NET;
dev->slave_req_fd = -1;
dev->vdpa_dev_id = -1;
return i;
}
@ -310,6 +311,31 @@ vhost_destroy_device(int vid)
vhost_devices[vid] = NULL;
}
void
vhost_attach_vdpa_device(int vid, int did)
{
struct virtio_net *dev = get_device(vid);
if (dev == NULL)
return;
if (rte_vdpa_get_device(did) == NULL)
return;
dev->vdpa_dev_id = did;
}
void
vhost_detach_vdpa_device(int vid)
{
struct virtio_net *dev = get_device(vid);
if (dev == NULL)
return;
dev->vdpa_dev_id = -1;
}
void
vhost_set_ifname(int vid, const char *if_name, unsigned int if_len)
{
@ -614,3 +640,13 @@ rte_vhost_rx_queue_count(int vid, uint16_t qid)
return *((volatile uint16_t *)&vq->avail->idx) - vq->last_avail_idx;
}
int rte_vhost_get_vdpa_device_id(int vid)
{
struct virtio_net *dev = get_device(vid);
if (dev == NULL)
return -1;
return dev->vdpa_dev_id;
}

View File

@ -20,6 +20,7 @@
#include <rte_rwlock.h>
#include "rte_vhost.h"
#include "rte_vdpa.h"
/* Used to indicate that the device is running on a data core */
#define VIRTIO_DEV_RUNNING 1
@ -240,6 +241,12 @@ struct virtio_net {
struct guest_page *guest_pages;
int slave_req_fd;
/*
* Device id to identify a specific backend device.
* It's set to -1 for the default software implementation.
*/
int vdpa_dev_id;
} __rte_cache_aligned;
@ -362,6 +369,9 @@ void free_vq(struct vhost_virtqueue *vq);
int alloc_vring_queue(struct virtio_net *dev, uint32_t vring_idx);
void vhost_attach_vdpa_device(int vid, int did);
void vhost_detach_vdpa_device(int vid);
void vhost_set_ifname(int, const char *if_name, unsigned int if_len);
void vhost_enable_dequeue_zero_copy(int vid);
void vhost_set_builtin_virtio_net(int vid, bool enable);