Bhyve supports specifying disk rotation rate using the nmrr attribute,
e.g.:

 -s 3:0,ahci,hd:/data/img/freebsd.img,nmrr=1

Where 1 means the SSD, 0 (default) means do not report, and other values
specify the actual RPM.

Signed-off-by: Roman Bogorodskiy <[email protected]>
---
 src/bhyve/bhyve_command.c                     |  4 +++
 src/bhyve/bhyve_domain.c                      |  6 ++++
 ...hyvexml2argv-disk-virtio-rotation-rate.xml | 23 ++++++++++++++
 .../bhyvexml2argv-sata-rotation-rate.args     | 10 ++++++
 .../bhyvexml2argv-sata-rotation-rate.ldargs   |  4 +++
 .../bhyvexml2argv-sata-rotation-rate.xml      | 31 +++++++++++++++++++
 tests/bhyvexml2argvtest.c                     |  2 ++
 7 files changed, 80 insertions(+)
 create mode 100644 
tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio-rotation-rate.xml
 create mode 100644 
tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.args
 create mode 100644 
tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.ldargs
 create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.xml

diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
index ab6d6e92e4..10f07db06c 100644
--- a/src/bhyve/bhyve_command.c
+++ b/src/bhyve/bhyve_command.c
@@ -278,6 +278,10 @@ bhyveBuildAHCIControllerArgStr(const virDomainDef *def,
                            _("unsupported disk device"));
             return -1;
         }
+
+        if (disk->rotation_rate)
+            virBufferAsprintf(&device, ",nmrr=%u", disk->rotation_rate);
+
         virBufferAddBuffer(&buf, &device);
     }
 
diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
index 9dec300a99..7685d21c71 100644
--- a/src/bhyve/bhyve_domain.c
+++ b/src/bhyve/bhyve_domain.c
@@ -290,6 +290,12 @@ bhyveDomainDeviceDefValidate(const virDomainDeviceDef *dev,
                 return -1;
             }
         }
+    } else if (dev->type == VIR_DOMAIN_DEVICE_DISK &&
+               dev->data.disk->rotation_rate &&
+               dev->data.disk->bus != VIR_DOMAIN_DISK_BUS_SATA) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("rotation rate is only valid for SATA bus"));
+        return -1;
     }
 
     return 0;
diff --git 
a/tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio-rotation-rate.xml 
b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio-rotation-rate.xml
new file mode 100644
index 0000000000..0ec14018c1
--- /dev/null
+++ b/tests/bhyvexml2argvdata/bhyvexml2argv-disk-virtio-rotation-rate.xml
@@ -0,0 +1,23 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory>219136</memory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <disk type='file'>
+      <driver name='file' type='raw'/>
+      <source file='/tmp/freebsd.img'/>
+      <target dev='vda' bus='virtio' rotation_rate='10000'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' 
function='0x0'/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='52:54:00:bc:85:fe'/>
+      <model type='virtio'/>
+      <source bridge="virbr0"/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' 
function='0x0'/>
+    </interface>
+  </devices>
+</domain>
diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.args 
b/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.args
new file mode 100644
index 0000000000..2cf40953e8
--- /dev/null
+++ b/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.args
@@ -0,0 +1,10 @@
+bhyve \
+-c 1 \
+-m 214 \
+-u \
+-H \
+-P \
+-s 0:0,hostbridge \
+-s 
2:0,ahci,hd:/tmp/freebsd1.img,nmrr=7200,hd:/tmp/freebsd2.img,nmrr=5400,hd:/tmp/freebsd3.img,nmrr=1
 \
+-s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 \
+bhyve
diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.ldargs 
b/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.ldargs
new file mode 100644
index 0000000000..4257ffccee
--- /dev/null
+++ b/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.ldargs
@@ -0,0 +1,4 @@
+bhyveload \
+-m 214 \
+-d /tmp/freebsd1.img \
+bhyve
diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.xml 
b/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.xml
new file mode 100644
index 0000000000..a0d80cb908
--- /dev/null
+++ b/tests/bhyvexml2argvdata/bhyvexml2argv-sata-rotation-rate.xml
@@ -0,0 +1,31 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory>219136</memory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <disk type='file'>
+      <driver name='file' type='raw'/>
+      <source file='/tmp/freebsd1.img'/>
+      <target dev='hda' bus='sata' rotation_rate='7200'/>
+    </disk>
+    <disk type='file'>
+      <driver name='file' type='raw'/>
+      <source file='/tmp/freebsd2.img'/>
+      <target dev='hdb' bus='sata' rotation_rate='5400'/>
+    </disk>
+    <disk type='file'>
+      <driver name='file' type='raw'/>
+      <source file='/tmp/freebsd3.img'/>
+      <target dev='hdc' bus='sata' rotation_rate='1'/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='52:54:00:b9:94:02'/>
+      <model type='virtio'/>
+      <source bridge="virbr0"/>
+    </interface>
+  </devices>
+</domain>
diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c
index cc6b17233d..9493551f8d 100644
--- a/tests/bhyvexml2argvtest.c
+++ b/tests/bhyvexml2argvtest.c
@@ -259,6 +259,8 @@ mymain(void)
     DO_TEST("serial-tcp");
     DO_TEST("4-consoles");
     DO_TEST_FAILURE("serial-invalid-port");
+    DO_TEST("sata-rotation-rate");
+    DO_TEST_FAILURE("disk-virtio-rotation-rate");
 
     /* Address allocation tests */
     DO_TEST("addr-single-sata-disk");
-- 
2.51.0

Reply via email to