On Mon, Jun 17, 2019 at 06:46:33AM +0000, Yoshihiro Shimoda wrote:
> > can_merge seems a little too generic a name to me.  Maybe can_iommu_merge?
> 
> I'll fix the name. Also, only the device_iommu_mapped() condition wiil cause
> a problem on iommu=pt [1]. So, I'll add another condition here.

Instead of adding another condition here I think we need to properly
abstract it out in the DMA layer.  E.g. have a

unsigned long dma_get_merge_boundary(struct device *dev)
{
        const struct dma_map_ops *ops = get_dma_ops(dev);

        if (!ops || !ops->get_merge_boundary)
                return 0; /* can't merge */
        return ops->get_merge_boundary(dev);
}

and then implement the method in dma-iommu.c.

blk_queue_can_use_iommu_merging then comes:

bool blk_queue_enable_iommu_merging(struct request_queue *q,
                struct device *dev)
{
        unsigned long boundary = dma_get_merge_boundary(dev);

        if (!boundary)
                return false;
        blk_queue_virt_boundary(q, boundary);
        return true;
}

Reply via email to