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

Jean-Philippe Brucker
Thu, 22 Feb 2018 11:04:30 -0000

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