Blame SOURCES/kvm-scsi-disk-support-reporting-of-rotation-rate.patch

4a2fec
From 23c1feb875805a4c324c51c3916b249da0edbe02 Mon Sep 17 00:00:00 2001
4a2fec
From: "Daniel P. Berrange" <berrange@redhat.com>
4a2fec
Date: Wed, 29 Nov 2017 14:26:04 +0100
4a2fec
Subject: [PATCH 18/21] scsi-disk: support reporting of rotation rate
4a2fec
4a2fec
RH-Author: Daniel P. Berrange <berrange@redhat.com>
4a2fec
Message-id: <20171129142606.15965-2-berrange@redhat.com>
4a2fec
Patchwork-id: 77961
4a2fec
O-Subject: [PATCH RHV-7.5 qemu-kvm-rhev 1/3] scsi-disk: support reporting of rotation rate
4a2fec
Bugzilla: 1498042
4a2fec
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
4a2fec
RH-Acked-by: John Snow <jsnow@redhat.com>
4a2fec
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
4a2fec
4a2fec
The Linux kernel will query the SCSI "Block device characteristics"
4a2fec
VPD to determine the rotations per minute of the disk. If this has
4a2fec
the value 1, it is taken to be an SSD and so Linux sets the
4a2fec
'rotational' flag to 0 for the I/O queue and will stop using that
4a2fec
disk as a source of random entropy. Other operating systems may
4a2fec
also take into account rotation rate when setting up default
4a2fec
behaviour.
4a2fec
4a2fec
Mgmt apps should be able to set the rotation rate for virtualized
4a2fec
block devices, based on characteristics of the host storage in use,
4a2fec
so that the guest OS gets sensible behaviour out of the box. This
4a2fec
patch thus adds a 'rotation-rate' parameter for 'scsi-hd' and
4a2fec
'scsi-block' device types. For the latter, this parameter will be
4a2fec
ignored unless the host device has TYPE_DISK.
4a2fec
4a2fec
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
4a2fec
Message-Id: <20171004114008.14849-2-berrange@redhat.com>
4a2fec
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
4a2fec
(cherry picked from commit 070f80095ad5b1143b50d2faffd2b1a84292e00d)
4a2fec
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
4a2fec
---
4a2fec
 hw/scsi/scsi-disk.c | 20 ++++++++++++++++++++
4a2fec
 1 file changed, 20 insertions(+)
4a2fec
4a2fec
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
4a2fec
index 5f1e5e8..21d6b4e 100644
4a2fec
--- a/hw/scsi/scsi-disk.c
4a2fec
+++ b/hw/scsi/scsi-disk.c
4a2fec
@@ -104,6 +104,14 @@ typedef struct SCSIDiskState
4a2fec
     char *product;
4a2fec
     bool tray_open;
4a2fec
     bool tray_locked;
4a2fec
+    /*
4a2fec
+     * 0x0000        - rotation rate not reported
4a2fec
+     * 0x0001        - non-rotating medium (SSD)
4a2fec
+     * 0x0002-0x0400 - reserved
4a2fec
+     * 0x0401-0xffe  - rotations per minute
4a2fec
+     * 0xffff        - reserved
4a2fec
+     */
4a2fec
+    uint16_t rotation_rate;
4a2fec
 } SCSIDiskState;
4a2fec
 
4a2fec
 static int scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed);
4a2fec
@@ -597,6 +605,7 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
4a2fec
             outbuf[buflen++] = 0x83; // device identification
4a2fec
             if (s->qdev.type == TYPE_DISK) {
4a2fec
                 outbuf[buflen++] = 0xb0; // block limits
4a2fec
+                outbuf[buflen++] = 0xb1; /* block device characteristics */
4a2fec
                 outbuf[buflen++] = 0xb2; // thin provisioning
4a2fec
             }
4a2fec
             break;
4a2fec
@@ -739,6 +748,15 @@ static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
4a2fec
             outbuf[43] = max_io_sectors & 0xff;
4a2fec
             break;
4a2fec
         }
4a2fec
+        case 0xb1: /* block device characteristics */
4a2fec
+        {
4a2fec
+            buflen = 8;
4a2fec
+            outbuf[4] = (s->rotation_rate >> 8) & 0xff;
4a2fec
+            outbuf[5] = s->rotation_rate & 0xff;
4a2fec
+            outbuf[6] = 0;
4a2fec
+            outbuf[7] = 0;
4a2fec
+            break;
4a2fec
+        }
4a2fec
         case 0xb2: /* thin provisioning */
4a2fec
         {
4a2fec
             buflen = 8;
4a2fec
@@ -2903,6 +2921,7 @@ static Property scsi_hd_properties[] = {
4a2fec
                        DEFAULT_MAX_UNMAP_SIZE),
4a2fec
     DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
4a2fec
                        DEFAULT_MAX_IO_SIZE),
4a2fec
+    DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
4a2fec
     DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf),
4a2fec
     DEFINE_PROP_END_OF_LIST(),
4a2fec
 };
4a2fec
@@ -2973,6 +2992,7 @@ static const TypeInfo scsi_cd_info = {
4a2fec
 #ifdef __linux__
4a2fec
 static Property scsi_block_properties[] = {
4a2fec
     DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.blk),
4a2fec
+    DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
4a2fec
     DEFINE_PROP_END_OF_LIST(),
4a2fec
 };
4a2fec
 
4a2fec
-- 
4a2fec
1.8.3.1
4a2fec