Fixes: 2b8819c6eee5 ("vhost-user: modify SET_LOG_BASE to pass mmap size and offset")
For compatibility with old vhost backend content of the SET_LOG_BASE message can not be modified. The SET_LOG_BASE message payload is modified only if the VHOST_USER_PROTOCOL_F_LOG_SHMFD protocol feature has been negociated. The documentation has been updated accordingly with remarks from Marc André Lureau. Signed-off-by: Thibaut Collet <thibaut.col...@6wind.com> --- docs/specs/vhost-user.txt | 16 ++++++++++++++-- hw/virtio/vhost-user.c | 12 +++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/docs/specs/vhost-user.txt b/docs/specs/vhost-user.txt index 26dde2e..da4bf9c 100644 --- a/docs/specs/vhost-user.txt +++ b/docs/specs/vhost-user.txt @@ -87,6 +87,14 @@ Depending on the request type, payload can be: User address: a 64-bit user address mmap offset: 64-bit offset where region starts in the mapped memory + * vhost user log description + ----------------- + | size | offset | + ----------------- + + size: a 64-bit size + Offset: a 64-bit offset where log starts in the mapped memory + In QEMU the vhost-user message is implemented with the following struct: typedef struct VhostUserMsg { @@ -280,14 +288,18 @@ Message types Id: 6 Equivalent ioctl: VHOST_SET_LOG_BASE - Master payload: u64 + Master payload: - u64 if slave has not the VHOST_USER_PROTOCOL_F_LOG_SHMFD + protocol feature + - vhost user log if slave has the + VHOST_USER_PROTOCOL_F_LOG_SHMFD protocol feature Slave payload: N/A Sets logging shared memory space. When slave has VHOST_USER_PROTOCOL_F_LOG_SHMFD protocol feature, the log memory fd is provided in the ancillary data of VHOST_USER_SET_LOG_BASE message, the size and offset of shared - memory area provided in the message. + memory area provided in the message and the message reply is an + empty message (size of 0). * VHOST_USER_SET_LOG_FD diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index c443602..dcdfd40 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -206,11 +206,17 @@ static int vhost_user_set_log_base(struct vhost_dev *dev, uint64_t base, VhostUserMsg msg = { .request = VHOST_USER_SET_LOG_BASE, .flags = VHOST_USER_VERSION, - .payload.log.mmap_size = log->size, - .payload.log.mmap_offset = 0, - .size = sizeof(msg.payload.log), }; + if (shmfd) { + msg.payload.log.mmap_size = log->size; + msg.payload.log.mmap_offset = 0; + msg.size = sizeof(msg.payload.log); + } else { + msg.payload.u64 = base; + msg.size = sizeof(msg.payload.u64); + } + if (shmfd && log->fd != -1) { fds[fd_num++] = log->fd; } -- 2.1.4