]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
hv_netvsc: Fix the receive buffer size limit
authorHaiyang Zhang <haiyangz@microsoft.com>
Mon, 11 Dec 2017 16:56:57 +0000 (08:56 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 24 Mar 2018 10:02:44 +0000 (11:02 +0100)
[ Upstream commit 11b2b653102571ac791885324371d9a1a17b900e ]

The max should be 31 MB on host with NVSP version > 2.

On legacy hosts (NVSP version <=2) only 15 MB receive buffer is allowed,
otherwise the buffer request will be rejected by the host, resulting
vNIC not coming up.

The NVSP version is only available after negotiation. So, we add the
limit checking for legacy hosts in netvsc_init_buf().

Fixes: 5023a6db73196 ("netvsc: increase default receive buffer size")
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc.c

index 88ddfb92122b0e15a7b031a79c4ec8078af79cd9..dab27e91b83b6787ad54191074a48c6f214753b1 100644 (file)
@@ -635,9 +635,11 @@ struct nvsp_message {
 #define NETVSC_MTU 65535
 #define NETVSC_MTU_MIN ETH_MIN_MTU
 
-#define NETVSC_RECEIVE_BUFFER_SIZE             (1024*1024*16)  /* 16MB */
-#define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY      (1024*1024*15)  /* 15MB */
+/* Max buffer sizes allowed by a host */
+#define NETVSC_RECEIVE_BUFFER_SIZE             (1024 * 1024 * 31) /* 31MB */
+#define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY      (1024 * 1024 * 15) /* 15MB */
 #define NETVSC_SEND_BUFFER_SIZE                        (1024 * 1024 * 15)   /* 15MB */
+
 #define NETVSC_INVALID_INDEX                   -1
 
 #define NETVSC_SEND_SECTION_SIZE               6144
index bfc79698b8f4116564d14391527a866d5043ab00..1e4f512fb90d83b6d5d42bb6bf4b1110c540862e 100644 (file)
@@ -267,6 +267,11 @@ static int netvsc_init_buf(struct hv_device *device,
        buf_size = device_info->recv_sections * device_info->recv_section_size;
        buf_size = roundup(buf_size, PAGE_SIZE);
 
+       /* Legacy hosts only allow smaller receive buffer */
+       if (net_device->nvsp_version <= NVSP_PROTOCOL_VERSION_2)
+               buf_size = min_t(unsigned int, buf_size,
+                                NETVSC_RECEIVE_BUFFER_SIZE_LEGACY);
+
        net_device->recv_buf = vzalloc(buf_size);
        if (!net_device->recv_buf) {
                netdev_err(ndev,