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:
parent
d7280c9fff
commit
b4953225ce
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user