On 2020/2/4 ??4:21, Zhu Lingshan wrote:>> +static const struct dma_map_ops vdpasim_dma_ops = { >> +??? .map_page = vdpasim_map_page, >> +??? .unmap_page = vdpasim_unmap_page, >> +??? .alloc = vdpasim_alloc_coherent, >> +??? .free = vdpasim_free_coherent, >> +}; >> + > > Hey Jason, > > IMHO, it would be nice if dma_ops of the parent device could be > re-used. vdpa_device is expecting to represent a physical device > except this simulator, however, there are not enough information in > vdpa_device.dev to indicating which kind physical device it attached > to. Namely get_arch_dma_ops(struct bus type) can not work on > vdpa_device.dev. Then it seems device drivers need to implement a wrap > of dma_ops of parent devices. Can this work be done in the vdpa > framework since it looks like a common task? Can > "vd_dev->vdev.dev.parent = vdpa->dev->parent;" in virtio_vdpa_probe() > do the work? > > Thanks, > BR > Zhu LingshanGood catch. I think we can. Thanks
On Tue, Feb 04, 2020 at 04:28:27PM +0800, Jason Wang wrote:> > On 2020/2/4 ??4:21, Zhu Lingshan wrote: > > > +static const struct dma_map_ops vdpasim_dma_ops = { > > > +??? .map_page = vdpasim_map_page, > > > +??? .unmap_page = vdpasim_unmap_page, > > > +??? .alloc = vdpasim_alloc_coherent, > > > +??? .free = vdpasim_free_coherent, > > > +}; > > > + > > > > Hey Jason, > > > > IMHO, it would be nice if dma_ops of the parent device could be re-used. > > vdpa_device is expecting to represent a physical device except this > > simulator, however, there are not enough information in vdpa_device.dev > > to indicating which kind physical device it attached to. Namely > > get_arch_dma_ops(struct bus type) can not work on vdpa_device.dev. Then > > it seems device drivers need to implement a wrap of dma_ops of parent > > devices. Can this work be done in the vdpa framework since it looks like > > a common task? Can "vd_dev->vdev.dev.parent = vdpa->dev->parent;" in > > virtio_vdpa_probe() do the work? > > > > Thanks, > > BR > > Zhu Lingshan > > > Good catch. > > I think we can.IMHO you need to specify some 'dma_device', not try and play tricks with dma_ops, or assuming the parent is always the device used for dma. Jason
On 2020/2/4 ??8:52, Jason Gunthorpe wrote:> On Tue, Feb 04, 2020 at 04:28:27PM +0800, Jason Wang wrote: >> On 2020/2/4 ??4:21, Zhu Lingshan wrote: >>>> +static const struct dma_map_ops vdpasim_dma_ops = { >>>> +??? .map_page = vdpasim_map_page, >>>> +??? .unmap_page = vdpasim_unmap_page, >>>> +??? .alloc = vdpasim_alloc_coherent, >>>> +??? .free = vdpasim_free_coherent, >>>> +}; >>>> + >>> Hey Jason, >>> >>> IMHO, it would be nice if dma_ops of the parent device could be re-used. >>> vdpa_device is expecting to represent a physical device except this >>> simulator, however, there are not enough information in vdpa_device.dev >>> to indicating which kind physical device it attached to. Namely >>> get_arch_dma_ops(struct bus type) can not work on vdpa_device.dev. Then >>> it seems device drivers need to implement a wrap of dma_ops of parent >>> devices. Can this work be done in the vdpa framework since it looks like >>> a common task? Can "vd_dev->vdev.dev.parent = vdpa->dev->parent;" in >>> virtio_vdpa_probe() do the work? >>> >>> Thanks, >>> BR >>> Zhu Lingshan >> >> Good catch. >> >> I think we can. > IMHO you need to specify some 'dma_device', not try and play tricks > with dma_ops, or assuming the parent is always the device used for > dma. > > JasonRight, this is what in my mind and discussed in the vhost-vdpa thread. Will go this way. Thanks