Message ID | 20230310102403.61347-1-faithilikerun@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | Add support for zoned device | expand |
On Fri, Mar 10, 2023 at 06:23:55PM +0800, Sam Li wrote: > Zoned Block Devices (ZBDs) devide the LBA space to block regions called zones > that are larger than the LBA size. It can only allow sequential writes, which > reduces write amplification in SSD, leading to higher throughput and increased > capacity. More details about ZBDs can be found at: > > https://zonedstorage.io/docs/introduction/zoned-storage > > The zoned device support aims to let guests (virtual machines) access zoned > storage devices on the host (hypervisor) through a virtio-blk device. This > involves extending QEMU's block layer and virtio-blk emulation code. In its > current status, the virtio-blk device is not aware of ZBDs but the guest sees > host-managed drives as regular drive that will runs correctly under the most > common write workloads. > > This patch series extend the block layer APIs with the minimum set of zoned > commands that are necessary to support zoned devices. The commands are - Report > Zones, four zone operations and Zone Append. > > There has been a debate on whethre introducing new zoned_host_device BlockDriver > specifically for zoned devices. In the end, it's been decided to stick to > existing host_device BlockDriver interface by only adding new zoned operations > inside it. The benefit of that is to avoid further changes - one example is > command line syntax - to the applications like Libvirt using QEMU zoned > emulation. > > It can be tested on a null_blk device using qemu-io or qemu-iotests. For > example, to test zone report using qemu-io: > $ path/to/qemu-io --image-opts -n driver=host_device,filename=/dev/nullb0 > -c "zrp offset nr_zones" > > v16: > - update zoned_host device name to host_device [Stefan] > - fix probing zoned device blocksizes [Stefan] > - Use empty fields instead of changing struct size of BlkRwCo [Kevin, Stefan] > > v15: > - drop zoned_host_device BlockDriver > - add zoned device option to host_device driver instead of introducing a new > zoned_host_device BlockDriver [Stefan] > > v14: > - address Stefan's comments of probing block sizes > > v13: > - add some tracing points for new zone APIs [Dmitry] > - change error handling in zone_mgmt [Damien, Stefan] > > v12: > - address review comments > * drop BLK_ZO_RESET_ALL bit [Damien] > * fix error messages, style, and typos[Damien, Hannes] > > v11: > - address review comments > * fix possible BLKZONED config compiling warnings [Stefan] > * fix capacity field compiling warnings on older kernel [Stefan,Damien] > > v10: > - address review comments > * deal with the last small zone case in zone_mgmt operations [Damien] > * handle the capacity field outdated in old kernel(before 5.9) [Damien] > * use byte unit in block layer to be consistent with QEMU [Eric] > * fix coding style related problems [Stefan] > > v9: > - address review comments > * specify units of zone commands requests [Stefan] > * fix some error handling in file-posix [Stefan] > * introduce zoned_host_devcie in the commit message [Markus] > > v8: > - address review comments > * solve patch conflicts and merge sysfs helper funcations into one patch > * add cache.direct=on check in config > > v7: > - address review comments > * modify sysfs attribute helper funcations > * move the input validation and error checking into raw_co_zone_* function > * fix checks in config > > v6: > - drop virtio-blk emulation changes > - address Stefan's review comments > * fix CONFIG_BLKZONED configs in related functions > * replace reading fd by g_file_get_contents() in get_sysfs_str_val() > * rewrite documentation for zoned storage > > v5: > - add zoned storage emulation to virtio-blk device > - add documentation for zoned storage > - address review comments > * fix qemu-iotests > * fix check to block layer > * modify interfaces of sysfs helper functions > * rename zoned device structs according to QEMU styles > * reorder patches > > v4: > - add virtio-blk headers for zoned device > - add configurations for zoned host device > - add zone operations for raw-format > - address review comments > * fix memory leak bug in zone_report > * add checks to block layers > * fix qemu-iotests format > * fix sysfs helper functions > > v3: > - add helper functions to get sysfs attributes > - address review comments > * fix zone report bugs > * fix the qemu-io code path > * use thread pool to avoid blocking ioctl() calls > > v2: > - add qemu-io sub-commands > - address review comments > * modify interfaces of APIs > > v1: > - add block layer APIs resembling Linux ZoneBlockDevice ioctls > > Sam Li (8): > include: add zoned device structs > file-posix: introduce helper functions for sysfs attributes > block: add block layer APIs resembling Linux ZonedBlockDevice ioctls > raw-format: add zone operations to pass through requests > config: add check to block layer > qemu-iotests: test new zone operations > block: add some trace events for new block layer APIs > docs/zoned-storage: add zoned device documentation > > block.c | 19 ++ > block/block-backend.c | 133 ++++++++ > block/file-posix.c | 446 +++++++++++++++++++++++-- > block/io.c | 41 +++ > block/raw-format.c | 18 + > block/trace-events | 2 + > docs/devel/zoned-storage.rst | 43 +++ > docs/system/qemu-block-drivers.rst.inc | 6 + > include/block/block-common.h | 43 +++ > include/block/block-io.h | 9 + > include/block/block_int-common.h | 29 ++ > include/block/raw-aio.h | 6 +- > include/sysemu/block-backend-io.h | 18 + > meson.build | 4 + > qemu-io-cmds.c | 149 +++++++++ > tests/qemu-iotests/tests/zoned.out | 53 +++ > tests/qemu-iotests/tests/zoned.sh | 86 +++++ > 17 files changed, 1068 insertions(+), 37 deletions(-) > create mode 100644 docs/devel/zoned-storage.rst > create mode 100644 tests/qemu-iotests/tests/zoned.out > create mode 100755 tests/qemu-iotests/tests/zoned.sh > > -- > 2.39.2 > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>