Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hv_utils: Add comment about max VMbus packet size in VSS driver

The VSS driver allocates a VMbus receive buffer significantly
larger than sizeof(hv_vss_msg), with no explanation. To help
prevent future mistakes, add a #define and comment about why
this is done.

No functional change.

Signed-off-by: Michael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/1644423070-75125-1-git-send-email-mikelley@microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>

authored by

Michael Kelley and committed by
Wei Liu
6de74d10 4ee52458

+16 -2
+5 -2
drivers/hv/hv_snapshot.c
··· 31 31 UTIL_FW_VERSION 32 32 }; 33 33 34 + /* See comment with struct hv_vss_msg regarding the max VMbus packet size */ 35 + #define VSS_MAX_PKT_SIZE (HV_HYP_PAGE_SIZE * 2) 36 + 34 37 /* 35 38 * Timeout values are based on expecations from host 36 39 */ ··· 301 298 if (vss_transaction.state > HVUTIL_READY) 302 299 return; 303 300 304 - if (vmbus_recvpacket(channel, recv_buffer, HV_HYP_PAGE_SIZE * 2, &recvlen, &requestid)) { 301 + if (vmbus_recvpacket(channel, recv_buffer, VSS_MAX_PKT_SIZE, &recvlen, &requestid)) { 305 302 pr_err_ratelimited("VSS request received. Could not read into recv buf\n"); 306 303 return; 307 304 } ··· 378 375 } 379 376 recv_buffer = srv->recv_buffer; 380 377 vss_transaction.recv_channel = srv->channel; 381 - vss_transaction.recv_channel->max_pkt_size = HV_HYP_PAGE_SIZE * 2; 378 + vss_transaction.recv_channel->max_pkt_size = VSS_MAX_PKT_SIZE; 382 379 383 380 /* 384 381 * When this driver loads, the user level daemon that
+11
include/uapi/linux/hyperv.h
··· 90 90 __u32 flags; 91 91 } __attribute__((packed)); 92 92 93 + /* 94 + * struct hv_vss_msg encodes the fields that the Linux VSS 95 + * driver accesses. However, FREEZE messages from Hyper-V contain 96 + * additional LUN information that Linux doesn't use and are not 97 + * represented in struct hv_vss_msg. A received FREEZE message may 98 + * be as large as 6,260 bytes, so the driver must allocate at least 99 + * that much space, not sizeof(struct hv_vss_msg). Other messages 100 + * such as AUTO_RECOVER may be as large as 12,500 bytes. However, 101 + * because the Linux VSS driver responds that it doesn't support 102 + * auto-recovery, it should not receive such messages. 103 + */ 93 104 struct hv_vss_msg { 94 105 union { 95 106 struct hv_vss_hdr vss_hdr;