On 2022/09/13 15:51, Keith Busch wrote: > On Tue, Sep 13, 2022 at 03:20:23PM +0100, Damien Le Moal wrote: >> On 2022/09/13 15:12, Keith Busch wrote: >>> On Thu, Sep 08, 2022 at 09:45:26AM -0700, Keith Busch wrote: >>>> From: Keith Busch <kbu...@kernel.org> >>>> >>>> An iov length needs to be aligned to the logical block size, which may >>>> be larger than the memory alignment. >>> >>> [cc'ing some other interested folks] >>> >>> Any thoughts on this patch? It is fixing an observed IO error when running >>> virtio-blk with the default 512b logical block size backed by a drive >>> formatted >>> with 4k logical block. >> >> The patch look OK to me, but having virtio expose a 512B LBA size for a >> backing >> device that has 4K LBAs will break all IOs if caching is turned off (direct >> IOs >> case), even if this patch is applied. No ? > > Oh, as to why that type of setup "works" with O_DIRECT, when the check below > returns 'false', qemu allocates a bounce buffer. We want that to happen if the > guest's virtio driver tries to read/write 512b. The lengths just need to be > checked against the backing store's block size instead of the memory address > alignment.
Ah ! Got it. Thanks ! > >>>> @@ -3243,13 +3243,14 @@ bool bdrv_qiov_is_aligned(BlockDriverState *bs, >>>> QEMUIOVector *qiov) >>>> { >>>> int i; >>>> size_t alignment = bdrv_min_mem_align(bs); >>>> + size_t len = bs->bl.request_alignment; >>>> IO_CODE(); >>>> >>>> for (i = 0; i < qiov->niov; i++) { >>>> if ((uintptr_t) qiov->iov[i].iov_base % alignment) { >>>> return false; >>>> } >>>> - if (qiov->iov[i].iov_len % alignment) { >>>> + if (qiov->iov[i].iov_len % len) { >>>> return false; >>>> } >>>> } -- Damien Le Moal Western Digital Research