[PATCHv5 1/2] block: accumulate memory segment gaps per bio

Keith Busch kbusch at kernel.org
Mon Aug 17 08:04:11 PDT 2026


On Mon, Aug 17, 2026 at 03:23:14PM +0200, Eric Auger wrote:
> >  
> > diff --git a/block/blk-mq-dma.c b/block/blk-mq-dma.c
> > index 449950029872a..94d3461b5bc8e 100644
> > --- a/block/blk-mq-dma.c
> > +++ b/block/blk-mq-dma.c
> > @@ -79,8 +79,7 @@ static bool blk_map_iter_next(struct request *req, struct blk_map_iter *iter,
> >  static inline bool blk_can_dma_map_iova(struct request *req,
> >  		struct device *dma_dev)
> >  {
> > -	return !((queue_virt_boundary(req->q) + 1) &
> > -		dma_get_merge_boundary(dma_dev));
> > +	return !(req_phys_gap_mask(req) & dma_get_merge_boundary(dma_dev));
> 
> I observe a regression on RHEL due to that change in
> blk_can_dma_map_iova() with a 64kB host. This also occurs with upstream
> (7.2-rc7).
> 
> For an NVME device blk_can_dma_map_iova() now returns trues while it did
> not before. And it seems it shouldn't because it then causes some errors
> on the dma_iova_link() path due to unaligned iova:
> 
> [ 4486.655564] iommu: unaligned: iova 0x14c34000 pa 0x000010764d790000
> size 0x1d0000 min_pagesz 0x10000
> 
> It occurs when launching a 4kB guest with virtio-blk.
> 
> I traced:
> nvme 0015:01:00.0: req_phys_gap_mask=0xffffffffffff0000,
> queue_virt_boundary+1=0x1, get_merge_boundary=0xffff

The first thing that looks odd to me here is the page offset in the iova
isn't reflected in the pa, so I think something in the construction
isn't setting it up the first vector correctly.

Thanks for the notice, I'm looking into it.



More information about the Linux-nvme mailing list