Christoph Hellwig
2023-Apr-10 15:27 UTC
[PATCH vhost v6 08/11] virtio_ring: introduce virtqueue_dma_dev()
On Mon, Apr 10, 2023 at 01:14:13PM +0800, Jason Wang wrote:> > But rethink, this is unreliable. Some platforms have returned their own ops, > > including X86. > > > > Because the priority of dev->dma_ops is higher than get_arch_dma_ops(), we > > should not let dev->dma_ops be null. We should define a set of dma_ops to > > actively implement direct dMA. > > Then this will duplicate with existing DMA API helpers. Could we tweak > the sparc or introduce a new flag for the device structure then the > DMA API knows it needs to use direct mapping? > > Adding Christoph for more comments.Code outside of the core kernel/dma/ code has no business doing anything with the dma_ops. WTF is going on?
Xuan Zhuo
2023-Apr-11 01:56 UTC
[PATCH vhost v6 08/11] virtio_ring: introduce virtqueue_dma_dev()
On Mon, 10 Apr 2023 08:27:14 -0700, Christoph Hellwig <hch at infradead.org> wrote:> On Mon, Apr 10, 2023 at 01:14:13PM +0800, Jason Wang wrote: > > > But rethink, this is unreliable. Some platforms have returned their own ops, > > > including X86. > > > > > > Because the priority of dev->dma_ops is higher than get_arch_dma_ops(), we > > > should not let dev->dma_ops be null. We should define a set of dma_ops to > > > actively implement direct dMA. > > > > Then this will duplicate with existing DMA API helpers. Could we tweak > > the sparc or introduce a new flag for the device structure then the > > DMA API knows it needs to use direct mapping? > > > > Adding Christoph for more comments. > > Code outside of the core kernel/dma/ code has no business doing > anything with the dma_ops.Do you mean we should not change the dma_ops from the outside of the core kernel/dma/? How about adding one new "dma_direct" to struct devive? --- a/include/linux/dma-map-ops.h +++ b/include/linux/dma-map-ops.h @@ -88,6 +88,9 @@ struct dma_map_ops { static inline const struct dma_map_ops *get_dma_ops(struct device *dev) { + if (dev->dma_direct) + return NULL; + if (dev->dma_ops) return dev->dma_ops; return get_arch_dma_ops(); Thanks.> WTF is going on?