[PATCH 1/4] iommu: Add virtio-iommu driver

Michael S. Tsirkin
Tue, 27 Feb 2018 14:47:22 -0000

On Thu, Feb 22, 2018 at 11:04:30AM +0000, Jean-Philippe Brucker
wrote:
> On 21/02/18 20:12, kbuild test robot wrote:
> [...]
> > config: arm64-allmodconfig (attached as .config)
> [...]
> >    aarch64-linux-gnu-ld: arch/arm64/kernel/head.o: relocation
R_AARCH64_ABS32 against `_kernel_offset_le_lo32' can not be used when making
a shared object
> >    arch/arm64/kernel/head.o: In function `kimage_vaddr':
> >    (.idmap.text+0x0): dangerous relocation: unsupported relocation
>
> Is this related?
>
> >    arch/arm64/kernel/head.o: In function `__primary_switch':
> >    (.idmap.text+0x340): dangerous relocation: unsupported relocation
> >    (.idmap.text+0x348): dangerous relocation: unsupported relocation
> >    drivers/iommu/virtio-iommu.o: In function `viommu_probe':
> >    virtio-iommu.c:(.text+0xbdc): undefined reference to
`virtio_check_driver_offered_feature'
> >    virtio-iommu.c:(.text+0xcfc): undefined reference to
`virtio_check_driver_offered_feature'
> >    virtio-iommu.c:(.text+0xe10): undefined reference to
`virtio_check_driver_offered_feature'
> >    drivers/iommu/virtio-iommu.o: In function
`viommu_send_reqs_sync':
> >    virtio-iommu.c:(.text+0x130c): undefined reference to
`virtqueue_add_sgs'
> >    virtio-iommu.c:(.text+0x1398): undefined reference to
`virtqueue_kick'
> >    virtio-iommu.c:(.text+0x14d4): undefined reference to
`virtqueue_get_buf'
> >    drivers/iommu/virtio-iommu.o: In function
`virtio_iommu_drv_init':
> >    virtio-iommu.c:(.init.text+0x1c): undefined reference to
`register_virtio_driver'
> >    drivers/iommu/virtio-iommu.o: In function
`virtio_iommu_drv_exit':
> >>> virtio-iommu.c:(.exit.text+0x14): undefined reference to
`unregister_virtio_driver'
>
> Right. At the moment CONFIG_VIRTIO_IOMMU is a bool instead of tristate,
> because the IOMMU subsystem isn't entirely ready to have IOMMU drivers
> built as modules. In addition to exporting symbols it would also needs to
> hold off probing endpoints behind the IOMMU until the IOMMU driver is
> loaded. At the moment (I think) it gives up once userspace is reached (see
> of_iommu_driver_present).
>
> The above report is due to VIRTIO=m and VIRTIO_IOMMU=y. To solve it we
could:
>
> a) Allow VIRTIO_IOMMU to be built as module by exporting a dozen IOMMU
> symbols. It would be a lie. The driver wouldn't be usable because of
the
> probe issue discussed above, but it would build.
>
> b) Actually make any IOMMU driver work as module. Whilst it would
> certainly be a nice feature, it's a bigger problem and I don't
think it
> has its place in this series.
>
> c) Make VIRTIO_IOMMU depend on VIRTIO_MMIO=y instead of VIRTIO_MMIO, which
> I think is the sanest for now (and does work), even though distro kernels
> probably all have VIRTIO=m.
>
> I prefer doing c) now and experiment with b) once I got some time.
>
> Thanks,
> Jean

It kind of means it's a toy for now though. So fine as long
as it's out of tree.

--
MST