Re: [Qemu-devel] [PATCH v6 6/8] Add vhost-user calls implementation
On Tue, Jan 14, 2014 at 07:14:53PM +0100, Antonios Motakis wrote: On Tue, Jan 14, 2014 at 12:21 PM, Michael S. Tsirkin m...@redhat.com wrote: On Mon, Jan 13, 2014 at 03:25:17PM +0100, Antonios Motakis wrote: Each ioctl request of vhost-kernel has a vhost-user message equivalent, which is sent over the control socket. The general approach is to copy the data from the supplied argument pointer to a designated field in the message. If a file descriptor is to be passed it will be placed in the fds array for inclusion in the sendmsd control header. VHOST_SET_MEM_TABLE ignores the supplied vhost_memory structure and scans the global ram_list for ram blocks with a valid fd field set. This would be set when the -mem-path option with shared=on property is used. Signed-off-by: Antonios Motakis a.mota...@virtualopensystems.com Signed-off-by: Nikolay Nikolaev n.nikol...@virtualopensystems.com the name vhost-backend and vhost-user is unfortunate as you let some net specific stuff get in there. The vhost-net stuff here is not strictly necessary, so it can be removed. We don't need to set a TAP backend when using vhost-user. Weird. It does not need a tap backend? Why did you make this a tap option then? --- hw/virtio/vhost-backend.c | 147 -- 1 file changed, 143 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c index 460ee02..8f98562 100644 --- a/hw/virtio/vhost-backend.c +++ b/hw/virtio/vhost-backend.c @@ -81,6 +81,39 @@ static VhostUserMsg m __attribute__ ((unused)); /* The version of the protocol we support */ #define VHOST_USER_VERSION (0x1) +static unsigned long int ioctl_to_vhost_user_request[VHOST_USER_MAX] = { + -1, /* VHOST_USER_NONE */ + VHOST_GET_FEATURES, /* VHOST_USER_GET_FEATURES */ + VHOST_SET_FEATURES, /* VHOST_USER_SET_FEATURES */ + VHOST_SET_OWNER, /* VHOST_USER_SET_OWNER */ + VHOST_RESET_OWNER, /* VHOST_USER_RESET_OWNER */ + VHOST_SET_MEM_TABLE, /* VHOST_USER_SET_MEM_TABLE */ + VHOST_SET_LOG_BASE, /* VHOST_USER_SET_LOG_BASE */ + VHOST_SET_LOG_FD, /* VHOST_USER_SET_LOG_FD */ + VHOST_SET_VRING_NUM, /* VHOST_USER_SET_VRING_NUM */ + VHOST_SET_VRING_ADDR, /* VHOST_USER_SET_VRING_ADDR */ + VHOST_SET_VRING_BASE, /* VHOST_USER_SET_VRING_BASE */ + VHOST_GET_VRING_BASE, /* VHOST_USER_GET_VRING_BASE */ + VHOST_SET_VRING_KICK, /* VHOST_USER_SET_VRING_KICK */ + VHOST_SET_VRING_CALL, /* VHOST_USER_SET_VRING_CALL */ + VHOST_SET_VRING_ERR, /* VHOST_USER_SET_VRING_ERR */ + VHOST_NET_SET_BACKEND, /* VHOST_USER_NET_SET_BACKEND */ + -1 /* VHOST_USER_ECHO */ +}; + +static VhostUserRequest vhost_user_request_translate(unsigned long int request) +{ + VhostUserRequest idx; + + for (idx = 0; idx VHOST_USER_MAX; idx++) { + if (ioctl_to_vhost_user_request[idx] == request) { + break; + } + } + + return (idx == VHOST_USER_MAX) ? VHOST_USER_NONE : idx; +} + static int vhost_user_recv(int fd, VhostUserMsg *msg) { ssize_t r; @@ -235,7 +268,10 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, { int fd = dev-control; VhostUserMsg msg; - int result = 0; + VhostUserRequest msg_request; + RAMBlock *block = 0; + struct vhost_vring_file *file = 0; + int need_reply = 0; int fds[VHOST_MEMORY_MAX_NREGIONS]; size_t fd_num = 0; @@ -245,20 +281,123 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, return 0; } - msg.request = VHOST_USER_NONE; + msg_request = vhost_user_request_translate(request); + msg.request = msg_request; msg.flags = VHOST_USER_VERSION; msg.size = 0; switch (request) { + case VHOST_GET_FEATURES: + case VHOST_GET_VRING_BASE: + need_reply = 1; + break; + + case VHOST_SET_FEATURES: + case VHOST_SET_LOG_BASE: + msg.u64 = *((__u64 *) arg); + msg.size = sizeof(m.u64); + break; + + case VHOST_SET_OWNER: + case VHOST_RESET_OWNER: + break; + + case VHOST_SET_MEM_TABLE: + QTAILQ_FOREACH(block, ram_list.blocks, next) + { + if (block-fd 0) { + msg.memory.regions[fd_num].userspace_addr = (__u64) block-host; +
Re: [Qemu-devel] [PATCH v6 6/8] Add vhost-user calls implementation
On Wed, Jan 15, 2014 at 11:14:14AM +0200, Michael S. Tsirkin wrote: On Tue, Jan 14, 2014 at 07:14:53PM +0100, Antonios Motakis wrote: On Tue, Jan 14, 2014 at 12:21 PM, Michael S. Tsirkin m...@redhat.com wrote: On Mon, Jan 13, 2014 at 03:25:17PM +0100, Antonios Motakis wrote: Each ioctl request of vhost-kernel has a vhost-user message equivalent, which is sent over the control socket. The general approach is to copy the data from the supplied argument pointer to a designated field in the message. If a file descriptor is to be passed it will be placed in the fds array for inclusion in the sendmsd control header. VHOST_SET_MEM_TABLE ignores the supplied vhost_memory structure and scans the global ram_list for ram blocks with a valid fd field set. This would be set when the -mem-path option with shared=on property is used. Signed-off-by: Antonios Motakis a.mota...@virtualopensystems.com Signed-off-by: Nikolay Nikolaev n.nikol...@virtualopensystems.com the name vhost-backend and vhost-user is unfortunate as you let some net specific stuff get in there. The vhost-net stuff here is not strictly necessary, so it can be removed. We don't need to set a TAP backend when using vhost-user. Weird. It does not need a tap backend? Why did you make this a tap option then? Oh I didn't read what you wrote carefully. You are saying you don't use the VHOST_USER_NET_SET_BACKEND option to pass tap fd at all, so it can be removed? Pls ignore this last question then. --- hw/virtio/vhost-backend.c | 147 -- 1 file changed, 143 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c index 460ee02..8f98562 100644 --- a/hw/virtio/vhost-backend.c +++ b/hw/virtio/vhost-backend.c @@ -81,6 +81,39 @@ static VhostUserMsg m __attribute__ ((unused)); /* The version of the protocol we support */ #define VHOST_USER_VERSION (0x1) +static unsigned long int ioctl_to_vhost_user_request[VHOST_USER_MAX] = { + -1, /* VHOST_USER_NONE */ + VHOST_GET_FEATURES, /* VHOST_USER_GET_FEATURES */ + VHOST_SET_FEATURES, /* VHOST_USER_SET_FEATURES */ + VHOST_SET_OWNER, /* VHOST_USER_SET_OWNER */ + VHOST_RESET_OWNER, /* VHOST_USER_RESET_OWNER */ + VHOST_SET_MEM_TABLE, /* VHOST_USER_SET_MEM_TABLE */ + VHOST_SET_LOG_BASE, /* VHOST_USER_SET_LOG_BASE */ + VHOST_SET_LOG_FD, /* VHOST_USER_SET_LOG_FD */ + VHOST_SET_VRING_NUM, /* VHOST_USER_SET_VRING_NUM */ + VHOST_SET_VRING_ADDR, /* VHOST_USER_SET_VRING_ADDR */ + VHOST_SET_VRING_BASE, /* VHOST_USER_SET_VRING_BASE */ + VHOST_GET_VRING_BASE, /* VHOST_USER_GET_VRING_BASE */ + VHOST_SET_VRING_KICK, /* VHOST_USER_SET_VRING_KICK */ + VHOST_SET_VRING_CALL, /* VHOST_USER_SET_VRING_CALL */ + VHOST_SET_VRING_ERR, /* VHOST_USER_SET_VRING_ERR */ + VHOST_NET_SET_BACKEND, /* VHOST_USER_NET_SET_BACKEND */ + -1 /* VHOST_USER_ECHO */ +}; + +static VhostUserRequest vhost_user_request_translate(unsigned long int request) +{ + VhostUserRequest idx; + + for (idx = 0; idx VHOST_USER_MAX; idx++) { + if (ioctl_to_vhost_user_request[idx] == request) { + break; + } + } + + return (idx == VHOST_USER_MAX) ? VHOST_USER_NONE : idx; +} + static int vhost_user_recv(int fd, VhostUserMsg *msg) { ssize_t r; @@ -235,7 +268,10 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, { int fd = dev-control; VhostUserMsg msg; - int result = 0; + VhostUserRequest msg_request; + RAMBlock *block = 0; + struct vhost_vring_file *file = 0; + int need_reply = 0; int fds[VHOST_MEMORY_MAX_NREGIONS]; size_t fd_num = 0; @@ -245,20 +281,123 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, return 0; } - msg.request = VHOST_USER_NONE; + msg_request = vhost_user_request_translate(request); + msg.request = msg_request; msg.flags = VHOST_USER_VERSION; msg.size = 0; switch (request) { + case VHOST_GET_FEATURES: + case VHOST_GET_VRING_BASE: + need_reply = 1; + break; + + case VHOST_SET_FEATURES: + case VHOST_SET_LOG_BASE: + msg.u64 = *((__u64 *) arg); + msg.size = sizeof(m.u64);
Re: [Qemu-devel] [PATCH v6 6/8] Add vhost-user calls implementation
On Mon, Jan 13, 2014 at 03:25:17PM +0100, Antonios Motakis wrote: Each ioctl request of vhost-kernel has a vhost-user message equivalent, which is sent over the control socket. The general approach is to copy the data from the supplied argument pointer to a designated field in the message. If a file descriptor is to be passed it will be placed in the fds array for inclusion in the sendmsd control header. VHOST_SET_MEM_TABLE ignores the supplied vhost_memory structure and scans the global ram_list for ram blocks with a valid fd field set. This would be set when the -mem-path option with shared=on property is used. Signed-off-by: Antonios Motakis a.mota...@virtualopensystems.com Signed-off-by: Nikolay Nikolaev n.nikol...@virtualopensystems.com the name vhost-backend and vhost-user is unfortunate as you let some net specific stuff get in there. --- hw/virtio/vhost-backend.c | 147 -- 1 file changed, 143 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c index 460ee02..8f98562 100644 --- a/hw/virtio/vhost-backend.c +++ b/hw/virtio/vhost-backend.c @@ -81,6 +81,39 @@ static VhostUserMsg m __attribute__ ((unused)); /* The version of the protocol we support */ #define VHOST_USER_VERSION(0x1) +static unsigned long int ioctl_to_vhost_user_request[VHOST_USER_MAX] = { +-1, /* VHOST_USER_NONE */ +VHOST_GET_FEATURES, /* VHOST_USER_GET_FEATURES */ +VHOST_SET_FEATURES, /* VHOST_USER_SET_FEATURES */ +VHOST_SET_OWNER, /* VHOST_USER_SET_OWNER */ +VHOST_RESET_OWNER, /* VHOST_USER_RESET_OWNER */ +VHOST_SET_MEM_TABLE, /* VHOST_USER_SET_MEM_TABLE */ +VHOST_SET_LOG_BASE, /* VHOST_USER_SET_LOG_BASE */ +VHOST_SET_LOG_FD, /* VHOST_USER_SET_LOG_FD */ +VHOST_SET_VRING_NUM, /* VHOST_USER_SET_VRING_NUM */ +VHOST_SET_VRING_ADDR, /* VHOST_USER_SET_VRING_ADDR */ +VHOST_SET_VRING_BASE, /* VHOST_USER_SET_VRING_BASE */ +VHOST_GET_VRING_BASE, /* VHOST_USER_GET_VRING_BASE */ +VHOST_SET_VRING_KICK, /* VHOST_USER_SET_VRING_KICK */ +VHOST_SET_VRING_CALL, /* VHOST_USER_SET_VRING_CALL */ +VHOST_SET_VRING_ERR, /* VHOST_USER_SET_VRING_ERR */ +VHOST_NET_SET_BACKEND, /* VHOST_USER_NET_SET_BACKEND */ +-1 /* VHOST_USER_ECHO */ +}; + +static VhostUserRequest vhost_user_request_translate(unsigned long int request) +{ +VhostUserRequest idx; + +for (idx = 0; idx VHOST_USER_MAX; idx++) { +if (ioctl_to_vhost_user_request[idx] == request) { +break; +} +} + +return (idx == VHOST_USER_MAX) ? VHOST_USER_NONE : idx; +} + static int vhost_user_recv(int fd, VhostUserMsg *msg) { ssize_t r; @@ -235,7 +268,10 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, { int fd = dev-control; VhostUserMsg msg; -int result = 0; +VhostUserRequest msg_request; +RAMBlock *block = 0; +struct vhost_vring_file *file = 0; +int need_reply = 0; int fds[VHOST_MEMORY_MAX_NREGIONS]; size_t fd_num = 0; @@ -245,20 +281,123 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, return 0; } -msg.request = VHOST_USER_NONE; +msg_request = vhost_user_request_translate(request); +msg.request = msg_request; msg.flags = VHOST_USER_VERSION; msg.size = 0; switch (request) { +case VHOST_GET_FEATURES: +case VHOST_GET_VRING_BASE: +need_reply = 1; +break; + +case VHOST_SET_FEATURES: +case VHOST_SET_LOG_BASE: +msg.u64 = *((__u64 *) arg); +msg.size = sizeof(m.u64); +break; + +case VHOST_SET_OWNER: +case VHOST_RESET_OWNER: +break; + +case VHOST_SET_MEM_TABLE: +QTAILQ_FOREACH(block, ram_list.blocks, next) +{ +if (block-fd 0) { +msg.memory.regions[fd_num].userspace_addr = (__u64) block-host; +msg.memory.regions[fd_num].memory_size = block-length; +msg.memory.regions[fd_num].guest_phys_addr = block-offset; +fds[fd_num++] = block-fd; +} +} + +msg.memory.nregions = fd_num; + +if (!fd_num) { +error_report(Failed initializing vhost-user memory map\n +consider using -mem-path option\n); +return -1; +} + +msg.size = sizeof(m.memory.nregions); +msg.size += sizeof(m.memory.padding); +msg.size += fd_num * sizeof(VhostUserMemoryRegion); + +break; + +case VHOST_SET_LOG_FD: +fds[fd_num++] = *((int *) arg); +break; + +case VHOST_SET_VRING_NUM: +case VHOST_SET_VRING_BASE: +memcpy(msg.state, arg, sizeof(struct vhost_vring_state)); +msg.size = sizeof(m.state); +break; + +case
Re: [Qemu-devel] [PATCH v6 6/8] Add vhost-user calls implementation
On Tue, Jan 14, 2014 at 12:21 PM, Michael S. Tsirkin m...@redhat.com wrote: On Mon, Jan 13, 2014 at 03:25:17PM +0100, Antonios Motakis wrote: Each ioctl request of vhost-kernel has a vhost-user message equivalent, which is sent over the control socket. The general approach is to copy the data from the supplied argument pointer to a designated field in the message. If a file descriptor is to be passed it will be placed in the fds array for inclusion in the sendmsd control header. VHOST_SET_MEM_TABLE ignores the supplied vhost_memory structure and scans the global ram_list for ram blocks with a valid fd field set. This would be set when the -mem-path option with shared=on property is used. Signed-off-by: Antonios Motakis a.mota...@virtualopensystems.com Signed-off-by: Nikolay Nikolaev n.nikol...@virtualopensystems.com the name vhost-backend and vhost-user is unfortunate as you let some net specific stuff get in there. The vhost-net stuff here is not strictly necessary, so it can be removed. We don't need to set a TAP backend when using vhost-user. --- hw/virtio/vhost-backend.c | 147 -- 1 file changed, 143 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c index 460ee02..8f98562 100644 --- a/hw/virtio/vhost-backend.c +++ b/hw/virtio/vhost-backend.c @@ -81,6 +81,39 @@ static VhostUserMsg m __attribute__ ((unused)); /* The version of the protocol we support */ #define VHOST_USER_VERSION(0x1) +static unsigned long int ioctl_to_vhost_user_request[VHOST_USER_MAX] = { +-1, /* VHOST_USER_NONE */ +VHOST_GET_FEATURES, /* VHOST_USER_GET_FEATURES */ +VHOST_SET_FEATURES, /* VHOST_USER_SET_FEATURES */ +VHOST_SET_OWNER, /* VHOST_USER_SET_OWNER */ +VHOST_RESET_OWNER, /* VHOST_USER_RESET_OWNER */ +VHOST_SET_MEM_TABLE, /* VHOST_USER_SET_MEM_TABLE */ +VHOST_SET_LOG_BASE, /* VHOST_USER_SET_LOG_BASE */ +VHOST_SET_LOG_FD, /* VHOST_USER_SET_LOG_FD */ +VHOST_SET_VRING_NUM, /* VHOST_USER_SET_VRING_NUM */ +VHOST_SET_VRING_ADDR, /* VHOST_USER_SET_VRING_ADDR */ +VHOST_SET_VRING_BASE, /* VHOST_USER_SET_VRING_BASE */ +VHOST_GET_VRING_BASE, /* VHOST_USER_GET_VRING_BASE */ +VHOST_SET_VRING_KICK, /* VHOST_USER_SET_VRING_KICK */ +VHOST_SET_VRING_CALL, /* VHOST_USER_SET_VRING_CALL */ +VHOST_SET_VRING_ERR, /* VHOST_USER_SET_VRING_ERR */ +VHOST_NET_SET_BACKEND, /* VHOST_USER_NET_SET_BACKEND */ +-1 /* VHOST_USER_ECHO */ +}; + +static VhostUserRequest vhost_user_request_translate(unsigned long int request) +{ +VhostUserRequest idx; + +for (idx = 0; idx VHOST_USER_MAX; idx++) { +if (ioctl_to_vhost_user_request[idx] == request) { +break; +} +} + +return (idx == VHOST_USER_MAX) ? VHOST_USER_NONE : idx; +} + static int vhost_user_recv(int fd, VhostUserMsg *msg) { ssize_t r; @@ -235,7 +268,10 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, { int fd = dev-control; VhostUserMsg msg; -int result = 0; +VhostUserRequest msg_request; +RAMBlock *block = 0; +struct vhost_vring_file *file = 0; +int need_reply = 0; int fds[VHOST_MEMORY_MAX_NREGIONS]; size_t fd_num = 0; @@ -245,20 +281,123 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, return 0; } -msg.request = VHOST_USER_NONE; +msg_request = vhost_user_request_translate(request); +msg.request = msg_request; msg.flags = VHOST_USER_VERSION; msg.size = 0; switch (request) { +case VHOST_GET_FEATURES: +case VHOST_GET_VRING_BASE: +need_reply = 1; +break; + +case VHOST_SET_FEATURES: +case VHOST_SET_LOG_BASE: +msg.u64 = *((__u64 *) arg); +msg.size = sizeof(m.u64); +break; + +case VHOST_SET_OWNER: +case VHOST_RESET_OWNER: +break; + +case VHOST_SET_MEM_TABLE: +QTAILQ_FOREACH(block, ram_list.blocks, next) +{ +if (block-fd 0) { +msg.memory.regions[fd_num].userspace_addr = (__u64) block-host; +msg.memory.regions[fd_num].memory_size = block-length; +msg.memory.regions[fd_num].guest_phys_addr = block-offset; +fds[fd_num++] = block-fd; +} +} + +msg.memory.nregions = fd_num; + +if (!fd_num) { +error_report(Failed initializing vhost-user memory map\n +consider using -mem-path option\n); +return -1; +} + +msg.size = sizeof(m.memory.nregions); +msg.size += sizeof(m.memory.padding); +msg.size += fd_num * sizeof(VhostUserMemoryRegion); +
[Qemu-devel] [PATCH v6 6/8] Add vhost-user calls implementation
Each ioctl request of vhost-kernel has a vhost-user message equivalent, which is sent over the control socket. The general approach is to copy the data from the supplied argument pointer to a designated field in the message. If a file descriptor is to be passed it will be placed in the fds array for inclusion in the sendmsd control header. VHOST_SET_MEM_TABLE ignores the supplied vhost_memory structure and scans the global ram_list for ram blocks with a valid fd field set. This would be set when the -mem-path option with shared=on property is used. Signed-off-by: Antonios Motakis a.mota...@virtualopensystems.com Signed-off-by: Nikolay Nikolaev n.nikol...@virtualopensystems.com --- hw/virtio/vhost-backend.c | 147 -- 1 file changed, 143 insertions(+), 4 deletions(-) diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c index 460ee02..8f98562 100644 --- a/hw/virtio/vhost-backend.c +++ b/hw/virtio/vhost-backend.c @@ -81,6 +81,39 @@ static VhostUserMsg m __attribute__ ((unused)); /* The version of the protocol we support */ #define VHOST_USER_VERSION(0x1) +static unsigned long int ioctl_to_vhost_user_request[VHOST_USER_MAX] = { +-1, /* VHOST_USER_NONE */ +VHOST_GET_FEATURES, /* VHOST_USER_GET_FEATURES */ +VHOST_SET_FEATURES, /* VHOST_USER_SET_FEATURES */ +VHOST_SET_OWNER, /* VHOST_USER_SET_OWNER */ +VHOST_RESET_OWNER, /* VHOST_USER_RESET_OWNER */ +VHOST_SET_MEM_TABLE, /* VHOST_USER_SET_MEM_TABLE */ +VHOST_SET_LOG_BASE, /* VHOST_USER_SET_LOG_BASE */ +VHOST_SET_LOG_FD, /* VHOST_USER_SET_LOG_FD */ +VHOST_SET_VRING_NUM, /* VHOST_USER_SET_VRING_NUM */ +VHOST_SET_VRING_ADDR, /* VHOST_USER_SET_VRING_ADDR */ +VHOST_SET_VRING_BASE, /* VHOST_USER_SET_VRING_BASE */ +VHOST_GET_VRING_BASE, /* VHOST_USER_GET_VRING_BASE */ +VHOST_SET_VRING_KICK, /* VHOST_USER_SET_VRING_KICK */ +VHOST_SET_VRING_CALL, /* VHOST_USER_SET_VRING_CALL */ +VHOST_SET_VRING_ERR, /* VHOST_USER_SET_VRING_ERR */ +VHOST_NET_SET_BACKEND, /* VHOST_USER_NET_SET_BACKEND */ +-1 /* VHOST_USER_ECHO */ +}; + +static VhostUserRequest vhost_user_request_translate(unsigned long int request) +{ +VhostUserRequest idx; + +for (idx = 0; idx VHOST_USER_MAX; idx++) { +if (ioctl_to_vhost_user_request[idx] == request) { +break; +} +} + +return (idx == VHOST_USER_MAX) ? VHOST_USER_NONE : idx; +} + static int vhost_user_recv(int fd, VhostUserMsg *msg) { ssize_t r; @@ -235,7 +268,10 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, { int fd = dev-control; VhostUserMsg msg; -int result = 0; +VhostUserRequest msg_request; +RAMBlock *block = 0; +struct vhost_vring_file *file = 0; +int need_reply = 0; int fds[VHOST_MEMORY_MAX_NREGIONS]; size_t fd_num = 0; @@ -245,20 +281,123 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request, return 0; } -msg.request = VHOST_USER_NONE; +msg_request = vhost_user_request_translate(request); +msg.request = msg_request; msg.flags = VHOST_USER_VERSION; msg.size = 0; switch (request) { +case VHOST_GET_FEATURES: +case VHOST_GET_VRING_BASE: +need_reply = 1; +break; + +case VHOST_SET_FEATURES: +case VHOST_SET_LOG_BASE: +msg.u64 = *((__u64 *) arg); +msg.size = sizeof(m.u64); +break; + +case VHOST_SET_OWNER: +case VHOST_RESET_OWNER: +break; + +case VHOST_SET_MEM_TABLE: +QTAILQ_FOREACH(block, ram_list.blocks, next) +{ +if (block-fd 0) { +msg.memory.regions[fd_num].userspace_addr = (__u64) block-host; +msg.memory.regions[fd_num].memory_size = block-length; +msg.memory.regions[fd_num].guest_phys_addr = block-offset; +fds[fd_num++] = block-fd; +} +} + +msg.memory.nregions = fd_num; + +if (!fd_num) { +error_report(Failed initializing vhost-user memory map\n +consider using -mem-path option\n); +return -1; +} + +msg.size = sizeof(m.memory.nregions); +msg.size += sizeof(m.memory.padding); +msg.size += fd_num * sizeof(VhostUserMemoryRegion); + +break; + +case VHOST_SET_LOG_FD: +fds[fd_num++] = *((int *) arg); +break; + +case VHOST_SET_VRING_NUM: +case VHOST_SET_VRING_BASE: +memcpy(msg.state, arg, sizeof(struct vhost_vring_state)); +msg.size = sizeof(m.state); +break; + +case VHOST_SET_VRING_ADDR: +memcpy(msg.addr, arg, sizeof(struct vhost_vring_addr)); +msg.size = sizeof(m.addr); +break; + +case VHOST_SET_VRING_KICK: +case VHOST_SET_VRING_CALL: +case VHOST_SET_VRING_ERR: +case VHOST_NET_SET_BACKEND: +file = arg; +msg.u64 = file-index; +