From 7ff5e936ab0b833a89766dfdc699086e8275974f Mon Sep 17 00:00:00 2001 From: Mikhail Montsev Date: Mon, 20 Jan 2025 17:29:45 +0000 Subject: [PATCH 1/2] vdev: log failed requests in vhost_handle_msg Signed-off-by: Mikhail Montsev --- vdev.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/vdev.c b/vdev.c index 385c624..5ad94fc 100644 --- a/vdev.c +++ b/vdev.c @@ -1750,17 +1750,46 @@ static int (*vhost_msg_handlers[])(struct vhd_vdev *vdev, [VHOST_USER_SET_VRING_ENABLE] = vhost_vring_enable, }; +static inline void log_vhost_request_failed(struct vhd_vdev *vdev, uint32_t req, + const void *payload, size_t size, + int ret) +{ +#define CHARS_PER_BYTE 3 // hex number + space +#define MAX_BYTES_TO_DUMP 100 + char payload_hex[CHARS_PER_BYTE * MAX_BYTES_TO_DUMP + 1]; + size_t payload_bytes_to_dump; + + payload_bytes_to_dump = MIN(MAX_BYTES_TO_DUMP, size); + + for (size_t i = 0; i < payload_bytes_to_dump; ++i) { + sprintf(payload_hex + CHARS_PER_BYTE * i, "%02X ", ((char*)payload)[i]); + } + payload_hex[CHARS_PER_BYTE * payload_bytes_to_dump] = '\0'; +#undef MAX_BYTES_TO_DUMP +#undef CHARS_PER_BYTE + + VHD_OBJ_ERROR(vdev, "%s (%u) request failed: %s, request payload (%zu bytes): %s", + vhost_req_name(req), req, strerror(-ret), size, payload_hex); +} + static int vhost_handle_msg(struct vhd_vdev *vdev, uint32_t req, const void *payload, size_t size, const int *fds, size_t num_fds) { + int ret; + if (req >= sizeof(vhost_msg_handlers) / sizeof(vhost_msg_handlers[0]) || !vhost_msg_handlers[req]) { VHD_OBJ_WARN(vdev, "%s (%u) not supported", vhost_req_name(req), req); return -ENOTSUP; } - return vhost_msg_handlers[req](vdev, payload, size, fds, num_fds); + ret = vhost_msg_handlers[req](vdev, payload, size, fds, num_fds); + if (ret < 0) { + log_vhost_request_failed(vdev, req, payload, size, ret); + } + + return ret; } struct vdev_work { From 3865980af3673f73b3b0c142dfcf4066e528ba50 Mon Sep 17 00:00:00 2001 From: Mikhail Montsev Date: Thu, 23 Jan 2025 13:47:31 +0000 Subject: [PATCH 2/2] vdev: log features in vhost_get_features, vhost_set_features Signed-off-by: Mikhail Montsev --- vdev.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vdev.c b/vdev.c index 5ad94fc..bec46e3 100644 --- a/vdev.c +++ b/vdev.c @@ -753,6 +753,9 @@ static int vhost_get_features(struct vhd_vdev *vdev, const void *payload, vdev->supported_features = g_default_features | vdev->type->get_features(vdev); + VHD_OBJ_INFO(vdev, "GET_FEATURES: reply with supported_features 0x%" PRIx64, + vdev->supported_features); + return vhost_reply_u64(vdev, vdev->supported_features); } @@ -791,6 +794,8 @@ static int vhost_set_features(struct vhd_vdev *vdev, const void *payload, uint64_t supported_features = vdev->supported_features; uint64_t changed_features; + VHD_OBJ_INFO(vdev, "SET_FEATURES: features 0x%" PRIx64, *features); + if (num_fds || size < sizeof(*features)) { VHD_OBJ_ERROR(vdev, "malformed message size=%zu #fds=%zu", size, num_fds);