[PATCH 2/2] qemu: support for virtio-blk-pci discard options

y005616296 yuxiating at huawei.com
Tue Sep 7 07:05:00 UTC 2021


>On Tue, Aug 31, 2021 at 20:50:04 +0800, yuxiating wrote:
>> DISCARD and WRITE_ZEROES features for machine type >= 4.0 is enabled
by default since
>>       commit 5c81161f804144b146607f890e84613a4cbad95c
>>       virtio-blk: add "discard" and "write-zeroes" properties
>> Sometimes guestos has bugs DISCARD need to be disabled.
>
>I'm not very persuaded by this commit message, could you please
elaborate how the bugs show themselves?
>
>Specifically this fells like a hack/workaround rather so a proper
justification would be great.
>

Virtio_blk kernel driver has a bug that causes memory corruption in
virtblk_setup_discard_write_zeroes();
af822aa68fbd ("block: virtio_blk: fix handling single range discard
request") has fix it.

However, some operating systems are not fixed and need to disabled on
the QEMU side.

>> Signed-off-by: yuxiating <yuxiating at huawei.com>
>> ---
>>  src/conf/domain_conf.c     | 15 +++++++++++++++
>>  src/conf/domain_conf.h     |  9 +++++++++
>>  src/conf/domain_validate.c |  6 ++++++
>>  src/libvirt_private.syms   |  3 ++-
>>  src/qemu/qemu_command.c    | 11 +++++++++++
>>  5 files changed, 43 insertions(+), 1 deletion(-)
>
>Please split the conf/* changes from the qemu changes.
>
>Also you didn't add any documentation to docs/formatdomain.rst which
describes the XML which is unacceptable.
>
>Additionally you are also missing test cases for qemuxml2argvtest.
>

I will add a description to docs/ formatDomain.rst.
qemuxml2argvtest will be added in version V2.

>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index
>> 6127513117..bfe4721e60 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -1278,6 +1278,13 @@ VIR_ENUM_IMPL(virDomainDiskDiscard,
>>                "ignore",
>>  );
>>
>> +VIR_ENUM_IMPL(virDomainDiskDiscardEnable,
>> +              VIR_DOMAIN_DISK_DISCARD_ENABLE_LAST,
>> +              "default",
>> +              "off",
>> +              "on",
>
>NACK to this hunk, 'default' value feels weird, and for the rest we
have the virTristateBool type.
>
>

I find virTristateSwitch more appropriate.

>> +);
>> +
>>  VIR_ENUM_IMPL(virDomainDiskDetectZeroes,
>>                VIR_DOMAIN_DISK_DETECT_ZEROES_LAST,
>>                "default",
>> @@ -8930,6 +8937,10 @@
virDomainDiskDefDriverParseXML(virDomainDiskDef *def,
>>      if (virXMLPropUInt(cur, "queues", 10, VIR_XML_PROP_NONE,
&def->queues) < 0)
>>          return -1;
>>
>> +    if (virXMLPropEnum(cur, "discard_enable",
virDomainDiskDiscardEnableTypeFromString,
>> +                       VIR_XML_PROP_NONZERO, &def->discard_enable) < 0)
>> +        return -1;
>> +
>>      return 0;
>>  }
>>
>> @@ -23416,6 +23427,10 @@ virDomainDiskDefFormatDriver(virBuffer *buf,
>>      if (disk->queues)
>>          virBufferAsprintf(&attrBuf, " queues='%u'", disk->queues);
>>
>> +    if (disk->discard_enable)
>> +        virBufferAsprintf(&attrBuf, " discard_enable='%s'",
>> +
>> + virDomainDiskDiscardEnableTypeToString(disk->discard_enable));
>
>It even behaves exactly like virTristateBool.
>

I'll use virTristateSwitch instead

>> +
>>      virDomainVirtioOptionsFormat(&attrBuf, disk->virtio);
>>
>>      if (disk->src->metadataCacheMaxSize > 0) { diff --git
>> a/src/conf/domain_conf.h b/src/conf/domain_conf.h index
>> c7e6df7981..c39694a19e 100644
>> --- a/src/conf/domain_conf.h
>> +++ b/src/conf/domain_conf.h
>
>[...]
>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index
>> ab8a6c00c3..52a74dd2d5 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -1,5 +1,5 @@
>> -#
>>  # General private symbols. Add symbols here, and see src/meson.build
>> for
>> +# mainDiskDeviceTypeToString
>>  # more details.
>>  #
>>  # Keep this file sorted by header name, then by symbols with each
header.
>
>NACK to this hunk too, you shouldn't need to modify the header here.
>

It was my mistake.

>> @@ -377,6 +377,7 @@ virDomainDiskDefParseSource;
>> virDomainDiskDetectZeroesTypeFromString;
>>  virDomainDiskDetectZeroesTypeToString;
>>  virDomainDiskDeviceTypeToString;
>> +virDomainDiskDiscardEnableTypeToString;
>>  virDomainDiskDiscardTypeToString;
>>  virDomainDiskEmptySource;
>>  virDomainDiskErrorPolicyTypeFromString;
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index
>> b230314f7f..894c8b17b9 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -1739,6 +1739,17 @@ qemuBuildDiskDeviceStr(const virDomainDef *def,
>>              virBufferAsprintf(&opt, ",num-queues=%u", disk->queues);
>>          }
>>
>> +        if (disk->discard_enable) {
>> +            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_DISCARD))
>> + {
>
>This capability was also checked in the validator so you don't need to
do this here.
>
>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                               _("virtio-blk discard property isn't
supported by this "
>> +                                 "QEMU binary"));
>
>
>

I'm going to delete this check.

>> +                return NULL;
>> +            }
>> +            virBufferAsprintf(&opt, ",discard=%s",
>> +
virDomainDiskDiscardEnableTypeToString(disk->discard_enable));
>> +    }
>> +
>>          qemuBuildVirtioOptionsStr(&opt, disk->virtio);
>>
>>          if (qemuBuildDeviceAddressStr(&opt, def, &disk->info) < 0)
>> --
>> 2.27.0
>>
>>




More information about the libvir-list mailing list