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

Drivers: hv: balloon: Enable dynamic memory protocol negotiation with Windows 10 hosts

Support Win10 protocol for Dynamic Memory. Thia patch allows guests on Win10 hosts
to hot-add memory even when dynamic memory is not enabled on the guest.

Signed-off-by: Alex Ng <alexng@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Alex Ng and committed by
Greg Kroah-Hartman
b6ddeae1 25ef06fe

+20 -6
+20 -6
drivers/hv/hv_balloon.c
··· 62 62 enum { 63 63 DYNMEM_PROTOCOL_VERSION_1 = DYNMEM_MAKE_VERSION(0, 3), 64 64 DYNMEM_PROTOCOL_VERSION_2 = DYNMEM_MAKE_VERSION(1, 0), 65 + DYNMEM_PROTOCOL_VERSION_3 = DYNMEM_MAKE_VERSION(2, 0), 65 66 66 67 DYNMEM_PROTOCOL_VERSION_WIN7 = DYNMEM_PROTOCOL_VERSION_1, 67 68 DYNMEM_PROTOCOL_VERSION_WIN8 = DYNMEM_PROTOCOL_VERSION_2, 69 + DYNMEM_PROTOCOL_VERSION_WIN10 = DYNMEM_PROTOCOL_VERSION_3, 68 70 69 - DYNMEM_PROTOCOL_VERSION_CURRENT = DYNMEM_PROTOCOL_VERSION_WIN8 71 + DYNMEM_PROTOCOL_VERSION_CURRENT = DYNMEM_PROTOCOL_VERSION_WIN10 70 72 }; 71 73 72 74 ··· 1298 1296 if (dm->next_version == 0) 1299 1297 goto version_error; 1300 1298 1301 - dm->next_version = 0; 1302 1299 memset(&version_req, 0, sizeof(struct dm_version_request)); 1303 1300 version_req.hdr.type = DM_VERSION_REQUEST; 1304 1301 version_req.hdr.size = sizeof(struct dm_version_request); 1305 1302 version_req.hdr.trans_id = atomic_inc_return(&trans_id); 1306 - version_req.version.version = DYNMEM_PROTOCOL_VERSION_WIN7; 1307 - version_req.is_last_attempt = 1; 1303 + version_req.version.version = dm->next_version; 1304 + 1305 + /* 1306 + * Set the next version to try in case current version fails. 1307 + * Win7 protocol ought to be the last one to try. 1308 + */ 1309 + switch (version_req.version.version) { 1310 + case DYNMEM_PROTOCOL_VERSION_WIN8: 1311 + dm->next_version = DYNMEM_PROTOCOL_VERSION_WIN7; 1312 + version_req.is_last_attempt = 0; 1313 + break; 1314 + default: 1315 + dm->next_version = 0; 1316 + version_req.is_last_attempt = 1; 1317 + } 1308 1318 1309 1319 ret = vmbus_sendpacket(dm->dev->channel, &version_req, 1310 1320 sizeof(struct dm_version_request), ··· 1456 1442 1457 1443 dm_device.dev = dev; 1458 1444 dm_device.state = DM_INITIALIZING; 1459 - dm_device.next_version = DYNMEM_PROTOCOL_VERSION_WIN7; 1445 + dm_device.next_version = DYNMEM_PROTOCOL_VERSION_WIN8; 1460 1446 init_completion(&dm_device.host_event); 1461 1447 init_completion(&dm_device.config_event); 1462 1448 INIT_LIST_HEAD(&dm_device.ha_region_list); ··· 1488 1474 version_req.hdr.type = DM_VERSION_REQUEST; 1489 1475 version_req.hdr.size = sizeof(struct dm_version_request); 1490 1476 version_req.hdr.trans_id = atomic_inc_return(&trans_id); 1491 - version_req.version.version = DYNMEM_PROTOCOL_VERSION_WIN8; 1477 + version_req.version.version = DYNMEM_PROTOCOL_VERSION_WIN10; 1492 1478 version_req.is_last_attempt = 0; 1493 1479 1494 1480 ret = vmbus_sendpacket(dev->channel, &version_req,