struct virtio_user_backend_ops {
int (*setup)(struct virtio_user_dev *dev);
+ int (*set_owner)(struct virtio_user_dev *dev);
int (*send_request)(struct virtio_user_dev *dev,
enum vhost_user_request req,
void *arg);
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
+#include <errno.h>
#include <rte_memory.h>
close(fd);
}
+static int
+vhost_kernel_ioctl(int fd, uint64_t request, void *arg)
+{
+ int ret;
+
+ ret = ioctl(fd, request, arg);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "Vhost-kernel ioctl %"PRIu64" failed (%s)",
+ request, strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+vhost_kernel_set_owner(struct virtio_user_dev *dev)
+{
+ return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_OWNER, NULL);
+}
+
static uint64_t vhost_req_user_to_kernel[] = {
- [VHOST_USER_SET_OWNER] = VHOST_SET_OWNER,
[VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER,
[VHOST_USER_SET_FEATURES] = VHOST_SET_FEATURES,
[VHOST_USER_GET_FEATURES] = VHOST_GET_FEATURES,
}
static int
-vhost_kernel_ioctl(struct virtio_user_dev *dev,
+vhost_kernel_send_request(struct virtio_user_dev *dev,
enum vhost_user_request req,
void *arg)
{
struct virtio_user_backend_ops virtio_ops_kernel = {
.setup = vhost_kernel_setup,
- .send_request = vhost_kernel_ioctl,
+ .set_owner = vhost_kernel_set_owner,
+ .send_request = vhost_kernel_send_request,
.enable_qp = vhost_kernel_enable_queue_pair
};
return -1;
}
+static int
+vhost_user_set_owner(struct virtio_user_dev *dev)
+{
+ int ret;
+ struct vhost_user_msg msg = {
+ .request = VHOST_USER_SET_OWNER,
+ .flags = VHOST_USER_VERSION,
+ };
+
+ ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0);
+ if (ret < 0) {
+ PMD_DRV_LOG(ERR, "Failed to set owner");
+ return -1;
+ }
+
+ return 0;
+}
+
struct walk_arg {
struct vhost_memory *vm;
int *fds;
static struct vhost_user_msg m;
const char * const vhost_msg_strings[] = {
- [VHOST_USER_SET_OWNER] = "VHOST_SET_OWNER",
[VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER",
[VHOST_USER_SET_FEATURES] = "VHOST_SET_FEATURES",
[VHOST_USER_GET_FEATURES] = "VHOST_GET_FEATURES",
msg.size = sizeof(m.payload.u64);
break;
- case VHOST_USER_SET_OWNER:
case VHOST_USER_RESET_OWNER:
break;
struct virtio_user_backend_ops virtio_ops_user = {
.setup = vhost_user_setup,
+ .set_owner = vhost_user_set_owner,
.send_request = vhost_user_sock,
.enable_qp = vhost_user_enable_queue_pair
};
#define VHOST_GET_BACKEND_FEATURES _IOR(VHOST_VIRTIO, 0x26, __u64)
static uint64_t vhost_req_user_to_vdpa[] = {
- [VHOST_USER_SET_OWNER] = VHOST_SET_OWNER,
[VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER,
[VHOST_USER_SET_FEATURES] = VHOST_SET_FEATURES,
[VHOST_USER_GET_FEATURES] = VHOST_GET_FEATURES,
};
};
+
+static int
+vhost_vdpa_ioctl(int fd, uint64_t request, void *arg)
+{
+ int ret;
+
+ ret = ioctl(fd, request, arg);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "Vhost-vDPA ioctl %"PRIu64" failed (%s)",
+ request, strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+vhost_vdpa_set_owner(struct virtio_user_dev *dev)
+{
+ return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_OWNER, NULL);
+}
+
static int
vhost_vdpa_iotlb_batch_begin(struct virtio_user_dev *dev)
{
(1ULL << VIRTIO_NET_F_CSUM))
static int
-vhost_vdpa_ioctl(struct virtio_user_dev *dev,
+vhost_vdpa_send_request(struct virtio_user_dev *dev,
enum vhost_user_request req,
void *arg)
{
.num = enable,
};
- if (vhost_vdpa_ioctl(dev, VHOST_USER_SET_VRING_ENABLE, &state))
+ if (vhost_vdpa_send_request(dev, VHOST_USER_SET_VRING_ENABLE, &state))
return -1;
}
struct virtio_user_backend_ops virtio_ops_vdpa = {
.setup = vhost_vdpa_setup,
- .send_request = vhost_vdpa_ioctl,
+ .set_owner = vhost_vdpa_set_owner,
+ .send_request = vhost_vdpa_send_request,
.enable_qp = vhost_vdpa_enable_queue_pair,
.dma_map = vhost_vdpa_dma_map_batch,
.dma_unmap = vhost_vdpa_dma_unmap_batch,
(1ULL << VHOST_USER_F_PROTOCOL_FEATURES);
if (!dev->is_server) {
- if (dev->ops->send_request(dev, VHOST_USER_SET_OWNER,
- NULL) < 0) {
+ if (dev->ops->set_owner(dev) < 0) {
PMD_INIT_LOG(ERR, "set_owner fails: %s",
strerror(errno));
return -1;