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. */
|
/* Unregister vhost driver. This is only meaningful to vhost user. */
|
||||||
int rte_vhost_driver_unregister(const char *path);
|
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.
|
* 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);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -65,4 +65,8 @@ EXPERIMENTAL {
|
|||||||
rte_vdpa_unregister_device;
|
rte_vdpa_unregister_device;
|
||||||
rte_vdpa_find_device_id;
|
rte_vdpa_find_device_id;
|
||||||
rte_vdpa_get_device;
|
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;
|
} DPDK_18.02;
|
||||||
|
@ -51,6 +51,13 @@ struct vhost_user_socket {
|
|||||||
uint64_t supported_features;
|
uint64_t supported_features;
|
||||||
uint64_t 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;
|
struct vhost_device_ops const *notify_ops;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -545,6 +552,52 @@ find_vhost_user_socket(const char *path)
|
|||||||
return NULL;
|
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
|
int
|
||||||
rte_vhost_driver_disable_features(const char *path, uint64_t features)
|
rte_vhost_driver_disable_features(const char *path, uint64_t features)
|
||||||
{
|
{
|
||||||
|
@ -283,6 +283,7 @@ vhost_new_device(void)
|
|||||||
dev->vid = i;
|
dev->vid = i;
|
||||||
dev->flags = VIRTIO_DEV_BUILTIN_VIRTIO_NET;
|
dev->flags = VIRTIO_DEV_BUILTIN_VIRTIO_NET;
|
||||||
dev->slave_req_fd = -1;
|
dev->slave_req_fd = -1;
|
||||||
|
dev->vdpa_dev_id = -1;
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@ -310,6 +311,31 @@ vhost_destroy_device(int vid)
|
|||||||
vhost_devices[vid] = NULL;
|
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
|
void
|
||||||
vhost_set_ifname(int vid, const char *if_name, unsigned int if_len)
|
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;
|
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_rwlock.h>
|
||||||
|
|
||||||
#include "rte_vhost.h"
|
#include "rte_vhost.h"
|
||||||
|
#include "rte_vdpa.h"
|
||||||
|
|
||||||
/* Used to indicate that the device is running on a data core */
|
/* Used to indicate that the device is running on a data core */
|
||||||
#define VIRTIO_DEV_RUNNING 1
|
#define VIRTIO_DEV_RUNNING 1
|
||||||
@ -240,6 +241,12 @@ struct virtio_net {
|
|||||||
struct guest_page *guest_pages;
|
struct guest_page *guest_pages;
|
||||||
|
|
||||||
int slave_req_fd;
|
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;
|
} __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);
|
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_set_ifname(int, const char *if_name, unsigned int if_len);
|
||||||
void vhost_enable_dequeue_zero_copy(int vid);
|
void vhost_enable_dequeue_zero_copy(int vid);
|
||||||
void vhost_set_builtin_virtio_net(int vid, bool enable);
|
void vhost_set_builtin_virtio_net(int vid, bool enable);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user