[libvirt] [PATCH 0/3] esx: improve virtualHW > 7 handling.

Hello, The following patches are for issues found when using libvirt to create/manage VMs on ESXi hosts (5.5 and 6). The first patch addresses a fairly common issue with creating VMs on ESXi with SCSI controllers. The other two are to less common but work around known ESX issues e.g. 4TB drive size limit and vMotion compatibility. Dawid Zamirski (3): esx: add pciBridge devices when SCSI is used esx: Add VMCI device for virtualHW >= 7 esx: use newer virtualHW version for 5.1+ hosts src/esx/esx_vi.c | 17 ++++++++++++++ src/vmx/vmx.c | 27 ++++++++++++++++++++++ tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx | 14 +++++++++++ .../xml2vmxdata/xml2vmx-serial-network-client.vmx | 1 + .../xml2vmxdata/xml2vmx-serial-network-server.vmx | 1 + tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx | 14 +++++++++++ tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx | 14 +++++++++++ 7 files changed, 88 insertions(+) -- 2.7.4

When a SCSI controller is present, ESX adds several pciBridge devices to vmx file. This fixes an error message where it refuses to create VM due to not enough PCI devices available. This applies only to virtualHW version >= 7. --- src/vmx/vmx.c | 25 ++++++++++++++++++++++ tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx | 13 +++++++++++ tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx | 13 +++++++++++ tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx | 13 +++++++++++ 4 files changed, 64 insertions(+) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index f729e5d..5b98dac 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -3082,6 +3082,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe int scsi_virtualDev[4] = { -1, -1, -1, -1 }; bool floppy_present[2] = { false, false }; unsigned int maxvcpus; + bool hasScsi = false; if (ctx->formatFileName == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -3288,6 +3289,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe for (i = 0; i < 4; ++i) { if (scsi_present[i]) { + hasScsi = true; virBufferAsprintf(&buffer, "scsi%zu.present = \"true\"\n", i); if (scsi_virtualDev[i] != -1) { @@ -3298,6 +3300,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe } } + for (i = 0; i < def->ndisks; ++i) { switch (def->disks[i]->device) { case VIR_DOMAIN_DISK_DEVICE_DISK: @@ -3380,6 +3383,28 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe goto cleanup; } + if (virtualHW_version >= 7) { + if (hasScsi) { + virBufferAddLit(&buffer, "pciBridge0.present = \"true\"\n"); + + virBufferAddLit(&buffer, "pciBridge4.present = \"true\"\n"); + virBufferAddLit(&buffer, "pciBridge4.virtualDev = \"pcieRootPort\"\n"); + virBufferAddLit(&buffer, "pciBridge4.functions = \"8\"\n"); + + virBufferAddLit(&buffer, "pciBridge5.present = \"true\"\n"); + virBufferAddLit(&buffer, "pciBridge5.virtualDev = \"pcieRootPort\"\n"); + virBufferAddLit(&buffer, "pciBridge5.functions = \"8\"\n"); + + virBufferAddLit(&buffer, "pciBridge6.present = \"true\"\n"); + virBufferAddLit(&buffer, "pciBridge6.virtualDev = \"pcieRootPort\"\n"); + virBufferAddLit(&buffer, "pciBridge6.functions = \"8\"\n"); + + virBufferAddLit(&buffer, "pciBridge7.present = \"true\"\n"); + virBufferAddLit(&buffer, "pciBridge7.virtualDev = \"pcieRootPort\"\n"); + virBufferAddLit(&buffer, "pciBridge7.functions = \"8\"\n"); + } + } + /* Get final VMX output */ if (virBufferCheckError(&buffer) < 0) goto cleanup; diff --git a/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx b/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx index 5693210..ab09bc9 100644 --- a/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx +++ b/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx @@ -28,3 +28,16 @@ ethernet1.addressType = "generated" ethernet1.generatedAddress = "00:0c:29:3b:64:f4" ethernet1.generatedAddressOffset = "0" svga.vramSize = "4194304" +pciBridge0.present = "true" +pciBridge4.present = "true" +pciBridge4.virtualDev = "pcieRootPort" +pciBridge4.functions = "8" +pciBridge5.present = "true" +pciBridge5.virtualDev = "pcieRootPort" +pciBridge5.functions = "8" +pciBridge6.present = "true" +pciBridge6.virtualDev = "pcieRootPort" +pciBridge6.functions = "8" +pciBridge7.present = "true" +pciBridge7.virtualDev = "pcieRootPort" +pciBridge7.functions = "8" diff --git a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx index 4211a67..acdf772 100644 --- a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx +++ b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx @@ -20,3 +20,16 @@ ethernet0.addressType = "static" ethernet0.address = "00:90:b9:dc:ea:81" ethernet0.checkMACAddress = "false" svga.vramSize = "4194304" +pciBridge0.present = "true" +pciBridge4.present = "true" +pciBridge4.virtualDev = "pcieRootPort" +pciBridge4.functions = "8" +pciBridge5.present = "true" +pciBridge5.virtualDev = "pcieRootPort" +pciBridge5.functions = "8" +pciBridge6.present = "true" +pciBridge6.virtualDev = "pcieRootPort" +pciBridge6.functions = "8" +pciBridge7.present = "true" +pciBridge7.virtualDev = "pcieRootPort" +pciBridge7.functions = "8" diff --git a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx index ad68df9..5086605 100644 --- a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx +++ b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx @@ -20,3 +20,16 @@ ethernet0.addressType = "static" ethernet0.address = "00:90:b9:dc:ea:81" ethernet0.checkMACAddress = "false" svga.vramSize = "4194304" +pciBridge0.present = "true" +pciBridge4.present = "true" +pciBridge4.virtualDev = "pcieRootPort" +pciBridge4.functions = "8" +pciBridge5.present = "true" +pciBridge5.virtualDev = "pcieRootPort" +pciBridge5.functions = "8" +pciBridge6.present = "true" +pciBridge6.virtualDev = "pcieRootPort" +pciBridge6.functions = "8" +pciBridge7.present = "true" +pciBridge7.virtualDev = "pcieRootPort" +pciBridge7.functions = "8" -- 2.7.4

2016-05-23 23:22 GMT+02:00 Dawid Zamirski <dzamirski@datto.com>:
When a SCSI controller is present, ESX adds several pciBridge devices to vmx file. This fixes an error message where it refuses to create VM due to not enough PCI devices available. This applies only to virtualHW version >= 7. --- src/vmx/vmx.c | 25 ++++++++++++++++++++++ tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx | 13 +++++++++++ tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx | 13 +++++++++++ tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx | 13 +++++++++++ 4 files changed, 64 insertions(+)
@@ -3298,6 +3300,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe } }
+ for (i = 0; i < def->ndisks; ++i) { switch (def->disks[i]->device) { case VIR_DOMAIN_DISK_DEVICE_DISK:
Unnecessary whitespace change. I'll remove this hunk before pushing.
@@ -3380,6 +3383,28 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe goto cleanup; }
+ if (virtualHW_version >= 7) { + if (hasScsi) {
+ } + }
Those two if blocks can be merged into one. I'll do that before pushing. Also hasScsi doesn't pass make syntax-check. It has to be hasSCSI. I'll fix that before pushing.
diff --git a/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx b/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx index 5693210..ab09bc9 100644 --- a/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx +++ b/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx @@ -28,3 +28,16 @@ ethernet1.addressType = "generated" ethernet1.generatedAddress = "00:0c:29:3b:64:f4" ethernet1.generatedAddressOffset = "0" svga.vramSize = "4194304" +pciBridge0.present = "true" +pciBridge4.present = "true" +pciBridge4.virtualDev = "pcieRootPort" +pciBridge4.functions = "8" +pciBridge5.present = "true" +pciBridge5.virtualDev = "pcieRootPort" +pciBridge5.functions = "8" +pciBridge6.present = "true" +pciBridge6.virtualDev = "pcieRootPort" +pciBridge6.functions = "8" +pciBridge7.present = "true" +pciBridge7.virtualDev = "pcieRootPort" +pciBridge7.functions = "8"
Matches what we already have in some vmx2xml in-the-wild files. ACK and pushed with the listed changes. -- Matthias Bolte http://photron.blogspot.com

This patch fixes an issue where vMotion fails when VMCI device is not present in the vmx file. --- src/vmx/vmx.c | 2 ++ tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx | 1 + tests/xml2vmxdata/xml2vmx-serial-network-client.vmx | 1 + tests/xml2vmxdata/xml2vmx-serial-network-server.vmx | 1 + tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx | 1 + tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx | 1 + 6 files changed, 7 insertions(+) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 5b98dac..c8acc9f 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -3403,6 +3403,8 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe virBufferAddLit(&buffer, "pciBridge7.virtualDev = \"pcieRootPort\"\n"); virBufferAddLit(&buffer, "pciBridge7.functions = \"8\"\n"); } + + virBufferAddLit(&buffer, "vmci0.present = \"true\"\n"); } /* Get final VMX output */ diff --git a/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx b/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx index ab09bc9..9605e2d 100644 --- a/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx +++ b/tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx @@ -41,3 +41,4 @@ pciBridge6.functions = "8" pciBridge7.present = "true" pciBridge7.virtualDev = "pcieRootPort" pciBridge7.functions = "8" +vmci0.present = "true" diff --git a/tests/xml2vmxdata/xml2vmx-serial-network-client.vmx b/tests/xml2vmxdata/xml2vmx-serial-network-client.vmx index 00ed186..5e21903 100644 --- a/tests/xml2vmxdata/xml2vmx-serial-network-client.vmx +++ b/tests/xml2vmxdata/xml2vmx-serial-network-client.vmx @@ -13,3 +13,4 @@ serial0.fileType = "network" serial0.fileName = "tcp://192.168.0.17:42001" serial0.network.endPoint = "client" serial0.yieldOnMsrRead = "true" +vmci0.present = "true" diff --git a/tests/xml2vmxdata/xml2vmx-serial-network-server.vmx b/tests/xml2vmxdata/xml2vmx-serial-network-server.vmx index ff2384f..e65f175 100644 --- a/tests/xml2vmxdata/xml2vmx-serial-network-server.vmx +++ b/tests/xml2vmxdata/xml2vmx-serial-network-server.vmx @@ -13,3 +13,4 @@ serial0.fileType = "network" serial0.fileName = "ssl://0.0.0.0:42001" serial0.network.endPoint = "server" serial0.yieldOnMsrRead = "true" +vmci0.present = "true" diff --git a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx index acdf772..b43c933 100644 --- a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx +++ b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx @@ -33,3 +33,4 @@ pciBridge6.functions = "8" pciBridge7.present = "true" pciBridge7.virtualDev = "pcieRootPort" pciBridge7.functions = "8" +vmci0.present = "true" diff --git a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx index 5086605..f7f40ec 100644 --- a/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx +++ b/tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx @@ -33,3 +33,4 @@ pciBridge6.functions = "8" pciBridge7.present = "true" pciBridge7.virtualDev = "pcieRootPort" pciBridge7.functions = "8" +vmci0.present = "true" -- 2.7.4

2016-05-23 23:22 GMT+02:00 Dawid Zamirski <dzamirski@datto.com>:
This patch fixes an issue where vMotion fails when VMCI device is not present in the vmx file. --- src/vmx/vmx.c | 2 ++ tests/xml2vmxdata/xml2vmx-fusion-in-the-wild-1.vmx | 1 + tests/xml2vmxdata/xml2vmx-serial-network-client.vmx | 1 + tests/xml2vmxdata/xml2vmx-serial-network-server.vmx | 1 + tests/xml2vmxdata/xml2vmx-ws-in-the-wild-1.vmx | 1 + tests/xml2vmxdata/xml2vmx-ws-in-the-wild-2.vmx | 1 + 6 files changed, 7 insertions(+)
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 5b98dac..c8acc9f 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -3403,6 +3403,8 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe virBufferAddLit(&buffer, "pciBridge7.virtualDev = \"pcieRootPort\"\n"); virBufferAddLit(&buffer, "pciBridge7.functions = \"8\"\n"); } + + virBufferAddLit(&buffer, "vmci0.present = \"true\"\n"); }
And now I see why you had the nested if in the other patch. Sorry for messing this up. Anyway, ACK and pushed. -- Matthias Bolte http://photron.blogspot.com

This is because there's a known issue where ESX will refuse to attach drives bigger than 4TB when virtualHW < 9. Therefore, to avoid that use the higher virtualHW for hosts that support it. --- https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2054952 src/esx/esx_vi.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index f7eeeb5..bf6f228 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -4712,6 +4712,7 @@ esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductLine productLine, { /* product version == 1000000 * major + 1000 * minor + micro */ int major = productVersion / 1000000; + int minor = productVersion / 1000 - major * 1000; /* * virtualHW.version compatibility matrix: @@ -4738,6 +4739,14 @@ esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductLine productLine, return 7; case 5: + if (minor < 5) + return 9; + + return 10; + + case 6: + return 10; + default: return 8; } @@ -4751,6 +4760,14 @@ esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductLine productLine, return 7; case 5: + if (minor < 5) + return 9; + + return 10; + + case 6: + return 10; + default: return 8; } -- 2.7.4

2016-05-23 23:22 GMT+02:00 Dawid Zamirski <dzamirski@datto.com>:
This is because there's a known issue where ESX will refuse to attach drives bigger than 4TB when virtualHW < 9. Therefore, to avoid that use the higher virtualHW for hosts that support it.
ACK and pushed. -- Matthias Bolte http://photron.blogspot.com
participants (2)
-
Dawid Zamirski
-
Matthias Bolte