On Mon, May 10, 2021 at 11:05 PM Christoph Hellwig <hch@xxxxxx> wrote: > > > +static inline bool is_dev_swiotlb_force(struct device *dev) > > +{ > > +#ifdef CONFIG_DMA_RESTRICTED_POOL > > + if (dev->dma_io_tlb_mem) > > + return true; > > +#endif /* CONFIG_DMA_RESTRICTED_POOL */ > > + return false; > > +} > > + > > > /* If SWIOTLB is active, use its maximum mapping size */ > > if (is_swiotlb_active(dev) && > > - (dma_addressing_limited(dev) || swiotlb_force == SWIOTLB_FORCE)) > > + (dma_addressing_limited(dev) || swiotlb_force == SWIOTLB_FORCE || > > + is_dev_swiotlb_force(dev))) > > This is a mess. I think the right way is to have an always_bounce flag > in the io_tlb_mem structure instead. Then the global swiotlb_force can > go away and be replace with this and the fact that having no > io_tlb_mem structure at all means forced no buffering (after a little > refactoring). Will do in the next version.