169b9a
From f4030862f7ac7e6217415e3ca6be6a4151fa8208 Mon Sep 17 00:00:00 2001
169b9a
From: John Snow <jsnow@redhat.com>
169b9a
Date: Thu, 2 Aug 2018 15:53:35 +0200
169b9a
Subject: [PATCH 2/4] ide: support reporting of rotation rate
169b9a
169b9a
RH-Author: John Snow <jsnow@redhat.com>
169b9a
Message-id: <20180802155336.10347-3-jsnow@redhat.com>
169b9a
Patchwork-id: 81614
169b9a
O-Subject: [RHEL-7.6 qemu-kvm PATCH 2/3] ide: support reporting of rotation rate
169b9a
Bugzilla: 1583807
169b9a
RH-Acked-by: Daniel P. Berrange <berrange@redhat.com>
169b9a
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
169b9a
RH-Acked-by: Thomas Huth <thuth@redhat.com>
169b9a
169b9a
From: "Daniel P. Berrange" <berrange@redhat.com>
169b9a
169b9a
The Linux kernel will query the ATA IDENTITY DEVICE data, word 217
169b9a
to determine the rotations per minute of the disk. If this has
169b9a
the value 1, it is taken to be an SSD and so Linux sets the
169b9a
'rotational' flag to 0 for the I/O queue and will stop using that
169b9a
disk as a source of random entropy. Other operating systems may
169b9a
also take into account rotation rate when setting up default
169b9a
behaviour.
169b9a
169b9a
Mgmt apps should be able to set the rotation rate for virtualized
169b9a
block devices, based on characteristics of the host storage in use,
169b9a
so that the guest OS gets sensible behaviour out of the box. This
169b9a
patch thus adds a 'rotation-rate' parameter for 'ide-hd' device
169b9a
types.
169b9a
169b9a
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
169b9a
Message-Id: <20171004114008.14849-3-berrange@redhat.com>
169b9a
Reviewed-by: John Snow <jsnow@redhat.com>
169b9a
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
169b9a
(cherry picked from commit 3b19f4506901ecce25ff36cf62353a2b4bfe4f2b)
169b9a
Signed-off-by: John Snow <jsnow@redhat.com>
169b9a
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
169b9a
---
169b9a
 hw/ide/core.c     | 1 +
169b9a
 hw/ide/internal.h | 8 ++++++++
169b9a
 hw/ide/qdev.c     | 1 +
169b9a
 3 files changed, 10 insertions(+)
169b9a
169b9a
diff --git a/hw/ide/core.c b/hw/ide/core.c
169b9a
index 5c33735..aea2ff9 100644
169b9a
--- a/hw/ide/core.c
169b9a
+++ b/hw/ide/core.c
169b9a
@@ -179,6 +179,7 @@ static void ide_identify(IDEState *s)
169b9a
     if (dev && dev->conf.discard_granularity) {
169b9a
         put_le16(p + 169, 1); /* TRIM support */
169b9a
     }
169b9a
+    put_le16(p + 217, dev->rotation_rate); /* Nominal media rotation rate */
169b9a
 
169b9a
     memcpy(s->identify_data, p, sizeof(s->identify_data));
169b9a
     s->identify_set = 1;
169b9a
diff --git a/hw/ide/internal.h b/hw/ide/internal.h
169b9a
index f8fb564..1062f85 100644
169b9a
--- a/hw/ide/internal.h
169b9a
+++ b/hw/ide/internal.h
169b9a
@@ -484,6 +484,14 @@ struct IDEDevice {
169b9a
     char *serial;
169b9a
     char *model;
169b9a
     uint64_t wwn;
169b9a
+    /*
169b9a
+     * 0x0000        - rotation rate not reported
169b9a
+     * 0x0001        - non-rotating medium (SSD)
169b9a
+     * 0x0002-0x0400 - reserved
169b9a
+     * 0x0401-0xffe  - rotations per minute
169b9a
+     * 0xffff        - reserved
169b9a
+     */
169b9a
+    uint16_t rotation_rate;
169b9a
 };
169b9a
 
169b9a
 #define BM_STATUS_DMAING 0x01
169b9a
diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c
169b9a
index 44f36c3..4ba2c63 100644
169b9a
--- a/hw/ide/qdev.c
169b9a
+++ b/hw/ide/qdev.c
169b9a
@@ -219,6 +219,7 @@ static Property ide_hd_properties[] = {
169b9a
     DEFINE_BLOCK_CHS_PROPERTIES(IDEDrive, dev.conf),
169b9a
     DEFINE_PROP_BIOS_CHS_TRANS("bios-chs-trans",
169b9a
                 IDEDrive, dev.chs_trans, BIOS_ATA_TRANSLATION_AUTO),
169b9a
+    DEFINE_PROP_UINT16("rotation_rate", IDEDrive, dev.rotation_rate, 0),
169b9a
     DEFINE_PROP_END_OF_LIST(),
169b9a
 };
169b9a
 
169b9a
-- 
169b9a
1.8.3.1
169b9a