From 66c21aee89597e23a00906aa195ecb0ad620a1f3 Mon Sep 17 00:00:00 2001 From: Roman Bogorodskiy Date: Wed, 1 Feb 2017 20:19:31 +0400 Subject: [PATCH] bhyve: fix virtio disk addresses Like it usually happens, I fixed one thing and broke another: in 803966c76 address allocation was fixed for SATA disks, but broke that for virtio disks, because it dropped disk address assignment completely. It's not needed for SATA disks anymore, but still needed for the virtio ones. Bring that back and add a couple of tests to make sure it won't happen again. --- src/bhyve/bhyve_device.c | 16 +++++++ ...vexml2argv-addr-multiple-virtio-disks.args | 11 +++++ ...xml2argv-addr-multiple-virtio-disks.ldargs | 3 ++ ...yvexml2argv-addr-multiple-virtio-disks.xml | 32 ++++++++++++++ ...bhyvexml2argv-addr-single-virtio-disk.args | 9 ++++ ...yvexml2argv-addr-single-virtio-disk.ldargs | 3 ++ .../bhyvexml2argv-addr-single-virtio-disk.xml | 22 ++++++++++ tests/bhyvexml2argvtest.c | 2 + ...exml2xmlout-addr-multiple-virtio-disks.xml | 42 +++++++++++++++++++ ...hyvexml2xmlout-addr-single-virtio-disk.xml | 30 +++++++++++++ tests/bhyvexml2xmltest.c | 2 + 11 files changed, 172 insertions(+) create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.xml create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.args create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.ldargs create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.xml create mode 100644 tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-multiple-virtio-disks.xml create mode 100644 tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-single-virtio-disk.xml diff --git a/src/bhyve/bhyve_device.c b/src/bhyve/bhyve_device.c index 29528230fd..55ce631ec4 100644 --- a/src/bhyve/bhyve_device.c +++ b/src/bhyve/bhyve_device.c @@ -129,6 +129,22 @@ bhyveAssignDevicePCISlots(virDomainDefPtr def, goto error; } + for (i = 0; i < def->ndisks; i++) { + /* We only handle virtio disk addresses as SATA disks are + * attached to a controller and don't have their own PCI + * addresses */ + if (def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_VIRTIO) + continue; + + if (def->disks[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI && + !virPCIDeviceAddressIsEmpty(&def->disks[i]->info.addr.pci)) + continue; + if (virDomainPCIAddressReserveNextAddr(addrs, &def->disks[i]->info, + VIR_PCI_CONNECT_TYPE_PCI_DEVICE, + -1) < 0) + goto error; + } + return 0; error: diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.args b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.args new file mode 100644 index 0000000000..8cc1668949 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.args @@ -0,0 +1,11 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 3:0,virtio-net,faketapdev,mac=52:54:00:bc:85:fe \ +-s 2:0,virtio-blk,/tmp/freebsd.img \ +-s 4:0,virtio-blk,/tmp/test.img \ +-s 5:0,virtio-blk,/tmp/test2.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.ldargs b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.ldargs new file mode 100644 index 0000000000..32538b558e --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.ldargs @@ -0,0 +1,3 @@ +/usr/sbin/bhyveload \ +-m 214 \ +-d /tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.xml b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.xml new file mode 100644 index 0000000000..9bcd0a6290 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-multiple-virtio-disks.xml @@ -0,0 +1,32 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 1 + + hvm + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.args b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.args new file mode 100644 index 0000000000..4dcc40404b --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.args @@ -0,0 +1,9 @@ +/usr/sbin/bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 3:0,virtio-net,faketapdev,mac=52:54:00:bc:85:fe \ +-s 2:0,virtio-blk,/tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.ldargs b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.ldargs new file mode 100644 index 0000000000..32538b558e --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.ldargs @@ -0,0 +1,3 @@ +/usr/sbin/bhyveload \ +-m 214 \ +-d /tmp/freebsd.img bhyve diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.xml b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.xml new file mode 100644 index 0000000000..6be9ae1346 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-addr-single-virtio-disk.xml @@ -0,0 +1,22 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 1 + + hvm + + + + + + + + + + + +
+ + + diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index e80705780a..c36b55a0a6 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -190,6 +190,8 @@ mymain(void) DO_TEST("addr-single-sata-disk"); DO_TEST("addr-multiple-sata-disks"); DO_TEST("addr-more-than-32-sata-disks"); + DO_TEST("addr-single-virtio-disk"); + DO_TEST("addr-multiple-virtio-disks"); /* The same without 32 devs per controller support */ driver.bhyvecaps ^= BHYVE_CAP_AHCI32SLOT; diff --git a/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-multiple-virtio-disks.xml b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-multiple-virtio-disks.xml new file mode 100644 index 0000000000..542bff121c --- /dev/null +++ b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-multiple-virtio-disks.xml @@ -0,0 +1,42 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + + + + +
+ + + + + +
+ + + + + +
+ + + + + + +
+ + + diff --git a/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-single-virtio-disk.xml b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-single-virtio-disk.xml new file mode 100644 index 0000000000..d7abb5abcd --- /dev/null +++ b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-addr-single-virtio-disk.xml @@ -0,0 +1,30 @@ + + bhyve + df3be7e7-a104-11e3-aeb0-50e5492bd3dc + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + + + + +
+ + + + + + +
+ + + diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c index 004afda14e..ba9af29960 100644 --- a/tests/bhyvexml2xmltest.c +++ b/tests/bhyvexml2xmltest.c @@ -109,6 +109,8 @@ mymain(void) DO_TEST_DIFFERENT("addr-single-sata-disk"); DO_TEST_DIFFERENT("addr-multiple-sata-disks"); DO_TEST_DIFFERENT("addr-more-than-32-sata-disks"); + DO_TEST_DIFFERENT("addr-single-virtio-disk"); + DO_TEST_DIFFERENT("addr-multiple-virtio-disks"); /* The same without 32 devs per controller support */ driver.bhyvecaps ^= BHYVE_CAP_AHCI32SLOT;