[1/1] block: propagate discard aligment from format drivers to the guest
diff mbox series

Message ID 20190226145930.5000-1-den@openvz.org
State New
Headers show
Series
  • [1/1] block: propagate discard aligment from format drivers to the guest
Related show

Commit Message

Denis V. Lunev Feb. 26, 2019, 2:59 p.m. UTC
Nowaday SCSI drivers in guests are able to alight UNMAP requests before
sending to the device. Right now QEMU provides an ability to set
this via "discard_granularity" property of the block device which could
be used by management layer.

Though, in particular, from the point of QEMU, there is
pdiscard_granularity on the format driver level, f.e. on QCOW2 or iSCSI.
It would be beneficial to pass this value as a default for this
property.

Technically this should reduce the amount of useless UNMAP requests
from the guest to the host.

Signed-off-by: Denis V. Lunev <den@openvz.org>
CC: Kevin Wolf <kwolf@redhat.com>
CC: Max Reitz <mreitz@redhat.com>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: Fam Zheng <fam@euphon.net>
---
 block/block-backend.c          | 13 +++++++++++++
 hw/scsi/scsi-disk.c            |  4 ++--
 include/sysemu/block-backend.h |  1 +
 3 files changed, 16 insertions(+), 2 deletions(-)

Comments

Kevin Wolf Feb. 26, 2019, 3:51 p.m. UTC | #1
Am 26.02.2019 um 15:59 hat Denis V. Lunev geschrieben:
> Nowaday SCSI drivers in guests are able to alight UNMAP requests before

Is s/alight/align/ what you mean?

The subject line has an "alignment" typo, too.

> sending to the device. Right now QEMU provides an ability to set
> this via "discard_granularity" property of the block device which could
> be used by management layer.
> 
> Though, in particular, from the point of QEMU, there is
> pdiscard_granularity on the format driver level, f.e. on QCOW2 or iSCSI.
> It would be beneficial to pass this value as a default for this
> property.
> 
> Technically this should reduce the amount of useless UNMAP requests
> from the guest to the host.
> 
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Kevin Wolf <kwolf@redhat.com>
> CC: Max Reitz <mreitz@redhat.com>
> CC: Paolo Bonzini <pbonzini@redhat.com>
> CC: Fam Zheng <fam@euphon.net>

I'm not doing things like this very often, but you're touching the guest
ABI here, which is a bit tricky. The main point is that the same command
line must result in the same guest view.

You'll need at least some machine type magic to make old machine types
use the old defaults. I'm not sure if there's something else to consider
for migration compatibility.

Kevin
Denis V. Lunev Feb. 27, 2019, 12:32 p.m. UTC | #2
On 2/26/19 6:51 PM, Kevin Wolf wrote:
> Am 26.02.2019 um 15:59 hat Denis V. Lunev geschrieben:
>> Nowaday SCSI drivers in guests are able to alight UNMAP requests before
> Is s/alight/align/ what you mean?
>
> The subject line has an "alignment" typo, too.
>
>> sending to the device. Right now QEMU provides an ability to set
>> this via "discard_granularity" property of the block device which could
>> be used by management layer.
>>
>> Though, in particular, from the point of QEMU, there is
>> pdiscard_granularity on the format driver level, f.e. on QCOW2 or iSCSI.
>> It would be beneficial to pass this value as a default for this
>> property.
>>
>> Technically this should reduce the amount of useless UNMAP requests
>> from the guest to the host.
>>
>> Signed-off-by: Denis V. Lunev <den@openvz.org>
>> CC: Kevin Wolf <kwolf@redhat.com>
>> CC: Max Reitz <mreitz@redhat.com>
>> CC: Paolo Bonzini <pbonzini@redhat.com>
>> CC: Fam Zheng <fam@euphon.net>
> I'm not doing things like this very often, but you're touching the guest
> ABI here, which is a bit tricky. The main point is that the same command
> line must result in the same guest view.
>
> You'll need at least some machine type magic to make old machine types
> use the old defaults. I'm not sure if there's something else to consider
> for migration compatibility.
>
> Kevin
sounds reasonable, thank you for the suggestion.

I was fascinated with the fact that
a) change is not  disruptive
b) the guest actually do not read this value except on controller reset and
    it is safe to return different value on a new request. This is not a
very
    big deal.

Den

Patch
diff mbox series

diff --git a/block/block-backend.c b/block/block-backend.c
index f6ea824308..17a709a551 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -21,11 +21,13 @@ 
 #include "qapi/qapi-events-block.h"
 #include "qemu/id.h"
 #include "qemu/option.h"
+#include "qemu/units.h"
 #include "trace.h"
 #include "migration/misc.h"
 
 /* Number of coroutines to reserve per attached device model */
 #define COROUTINE_POOL_RESERVATION 64
+#define DEFAULT_DISCARD_GRANULARITY (4 * KiB)
 
 #define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
 
@@ -2042,6 +2044,17 @@  int blk_probe_geometry(BlockBackend *blk, HDGeometry *geo)
     return bdrv_probe_geometry(blk_bs(blk), geo);
 }
 
+int blk_discard_granularity(BlockBackend *blk)
+{
+    BlockDriverState *bs = blk_bs(blk);
+
+    if (bs == NULL) {
+        return DEFAULT_DISCARD_GRANULARITY;
+    }
+
+    return bs->bl.pdiscard_alignment;
+}
+
 /*
  * Updates the BlockBackendRootState object with data from the currently
  * attached BlockDriverState.
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index d4e83aef0e..f0ff099114 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -43,7 +43,6 @@ 
 #define SCSI_MAX_INQUIRY_LEN        256
 #define SCSI_MAX_MODE_LEN           256
 
-#define DEFAULT_DISCARD_GRANULARITY (4 * KiB)
 #define DEFAULT_MAX_UNMAP_SIZE      (1 * GiB)
 #define DEFAULT_MAX_IO_SIZE         INT_MAX     /* 2 GB - 1 block */
 
@@ -2338,7 +2337,8 @@  static void scsi_realize(SCSIDevice *dev, Error **errp)
 
     if (s->qdev.conf.discard_granularity == -1) {
         s->qdev.conf.discard_granularity =
-            MAX(s->qdev.conf.logical_block_size, DEFAULT_DISCARD_GRANULARITY);
+            MAX(s->qdev.conf.logical_block_size,
+                blk_discard_granularity(s->qdev.conf.blk));
     }
 
     if (!s->version) {
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
index 832a4bf168..18428e685d 100644
--- a/include/sysemu/block-backend.h
+++ b/include/sysemu/block-backend.h
@@ -218,6 +218,7 @@  int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf,
 int blk_load_vmstate(BlockBackend *blk, uint8_t *buf, int64_t pos, int size);
 int blk_probe_blocksizes(BlockBackend *blk, BlockSizes *bsz);
 int blk_probe_geometry(BlockBackend *blk, HDGeometry *geo);
+int blk_discard_granularity(BlockBackend *blk);
 BlockAIOCB *blk_abort_aio_request(BlockBackend *blk,
                                   BlockCompletionFunc *cb,
                                   void *opaque, int ret);