diff options
author | Laurent Vivier <lvivier@redhat.com> | 2024-12-13 15:15:20 +0100 |
---|---|---|
committer | Laurent Vivier <lvivier@redhat.com> | 2024-12-19 12:08:20 +0100 |
commit | 749a3db4714db0cccc49dde7b9fb216b924e0bd6 (patch) | |
tree | 552fa9d6480c5c6d12f438351fa2538665f37094 | |
parent | 12c90b9e03251a62acb98846e7b82018d7f58f86 (diff) | |
download | passt-749a3db4714db0cccc49dde7b9fb216b924e0bd6.tar passt-749a3db4714db0cccc49dde7b9fb216b924e0bd6.tar.gz passt-749a3db4714db0cccc49dde7b9fb216b924e0bd6.tar.bz2 passt-749a3db4714db0cccc49dde7b9fb216b924e0bd6.tar.lz passt-749a3db4714db0cccc49dde7b9fb216b924e0bd6.tar.xz passt-749a3db4714db0cccc49dde7b9fb216b924e0bd6.tar.zst passt-749a3db4714db0cccc49dde7b9fb216b924e0bd6.zip |
vhost-user: add VHOST_USER_SET_LOG_FD command
VHOST_USER_SET_LOG_FD is an optional message with an eventfd
in ancillary data, it may be used to inform the front-end that the
log has been modified.
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
-rw-r--r-- | vhost_user.c | 56 | ||||
-rw-r--r-- | vhost_user.h | 1 | ||||
-rw-r--r-- | virtio.h | 2 |
3 files changed, 59 insertions, 0 deletions
diff --git a/vhost_user.c b/vhost_user.c index 48226a8..ce4373d 100644 --- a/vhost_user.c +++ b/vhost_user.c @@ -505,6 +505,57 @@ static bool vu_set_mem_table_exec(struct vu_dev *vdev, } /** + * vu_close_log() - Close the logging file descriptor + * @vdev: vhost-user device + */ +static void vu_close_log(struct vu_dev *vdev) +{ + if (vdev->log_call_fd != -1) { + close(vdev->log_call_fd); + vdev->log_call_fd = -1; + } +} + +/** + * vu_log_kick() - Inform the front-end that the log has been modified + * @vdev: vhost-user device + */ +/* cppcheck-suppress unusedFunction */ +void vu_log_kick(const struct vu_dev *vdev) +{ + if (vdev->log_call_fd != -1) { + int rc; + + rc = eventfd_write(vdev->log_call_fd, 1); + if (rc == -1) + die_perror("vhost-user kick eventfd_write()"); + } +} + +/** + * vu_set_log_fd_exec() -- Set the eventfd used to report logging update + * @vdev: vhost-user device + * @vmsg: vhost-user message + * + * Return: False as no reply is requested + */ +static bool vu_set_log_fd_exec(struct vu_dev *vdev, + struct vhost_user_msg *msg) +{ + if (msg->fd_num != 1) + die("Invalid log_fd message"); + + if (vdev->log_call_fd != -1) + close(vdev->log_call_fd); + + vdev->log_call_fd = msg->fds[0]; + + debug("Got log_call_fd: %d", vdev->log_call_fd); + + return false; +} + +/** * vu_set_vring_num_exec() - Set the size of the queue (vring size) * @vdev: vhost-user device * @vmsg: vhost-user message @@ -864,8 +915,10 @@ void vu_init(struct ctx *c) .notification = true, }; } + c->vdev->log_call_fd = -1; } + /** * vu_cleanup() - Reset vhost-user device * @vdev: vhost-user device @@ -909,6 +962,8 @@ void vu_cleanup(struct vu_dev *vdev) } } vdev->nregions = 0; + + vu_close_log(vdev); } /** @@ -929,6 +984,7 @@ static bool (*vu_handle[VHOST_USER_MAX])(struct vu_dev *vdev, [VHOST_USER_GET_QUEUE_NUM] = vu_get_queue_num_exec, [VHOST_USER_SET_OWNER] = vu_set_owner_exec, [VHOST_USER_SET_MEM_TABLE] = vu_set_mem_table_exec, + [VHOST_USER_SET_LOG_FD] = vu_set_log_fd_exec, [VHOST_USER_SET_VRING_NUM] = vu_set_vring_num_exec, [VHOST_USER_SET_VRING_ADDR] = vu_set_vring_addr_exec, [VHOST_USER_SET_VRING_BASE] = vu_set_vring_base_exec, diff --git a/vhost_user.h b/vhost_user.h index fbacb55..2fc0342 100644 --- a/vhost_user.h +++ b/vhost_user.h @@ -240,5 +240,6 @@ static inline bool vu_queue_started(const struct vu_virtq *vq) void vu_print_capabilities(void); void vu_init(struct ctx *c); void vu_cleanup(struct vu_dev *vdev); +void vu_log_kick(const struct vu_dev *vdev); void vu_control_handler(struct vu_dev *vdev, int fd, uint32_t events); #endif /* VHOST_USER_H */ @@ -103,6 +103,7 @@ struct vu_dev_region { * @regions: Guest shared memory regions * @features: Vhost-user features * @protocol_features: Vhost-user protocol features + * @log_call_fd: Eventfd to report logging update */ struct vu_dev { struct ctx *context; @@ -111,6 +112,7 @@ struct vu_dev { struct vu_virtq vq[VHOST_USER_MAX_QUEUES]; uint64_t features; uint64_t protocol_features; + int log_call_fd; }; /** |