Skip to content

Commit 6de74d1

Browse files
kelleymhliuw
authored andcommitted
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>
1 parent 4ee5245 commit 6de74d1

2 files changed

Lines changed: 16 additions & 2 deletions

File tree

drivers/hv/hv_snapshot.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ static const int fw_versions[] = {
3131
UTIL_FW_VERSION
3232
};
3333

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+
3437
/*
3538
* Timeout values are based on expecations from host
3639
*/
@@ -298,7 +301,7 @@ void hv_vss_onchannelcallback(void *context)
298301
if (vss_transaction.state > HVUTIL_READY)
299302
return;
300303

301-
if (vmbus_recvpacket(channel, recv_buffer, HV_HYP_PAGE_SIZE * 2, &recvlen, &requestid)) {
304+
if (vmbus_recvpacket(channel, recv_buffer, VSS_MAX_PKT_SIZE, &recvlen, &requestid)) {
302305
pr_err_ratelimited("VSS request received. Could not read into recv buf\n");
303306
return;
304307
}
@@ -375,7 +378,7 @@ hv_vss_init(struct hv_util_service *srv)
375378
}
376379
recv_buffer = srv->recv_buffer;
377380
vss_transaction.recv_channel = srv->channel;
378-
vss_transaction.recv_channel->max_pkt_size = HV_HYP_PAGE_SIZE * 2;
381+
vss_transaction.recv_channel->max_pkt_size = VSS_MAX_PKT_SIZE;
379382

380383
/*
381384
* When this driver loads, the user level daemon that

include/uapi/linux/hyperv.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,17 @@ struct hv_vss_check_dm_info {
9090
__u32 flags;
9191
} __attribute__((packed));
9292

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+
*/
93104
struct hv_vss_msg {
94105
union {
95106
struct hv_vss_hdr vss_hdr;

0 commit comments

Comments
 (0)