fs_initcall is definitely too late to initialize DMA-debug hash tables,
because some drivers might get probed and use DMA mapping framework
already in core_initcall. Late initialization of DMA-debug results in
false warning about accessing memory, that was not allocated, like this
one:
------------[ cut here ]------------
WARNING: CPU: 5 PID: 1 at lib/dma-debug.c:1104 check_unmap+0xa1c/0xe50
exynos-sysmmu
10a60000.sysmmu: DMA-API: device driver tries to free DMA memory it has not allocated [device
address=0x000000006ebd0000] [size=16384 bytes]
Modules linked in:
CPU: 5 PID: 1 Comm: swapper/0 Not tainted
4.9.0-rc5-00028-g39dde3d-dirty #44
Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[<
c0119dd4>] (unwind_backtrace) from [<
c01122bc>] (show_stack+0x20/0x24)
[<
c01122bc>] (show_stack) from [<
c062714c>] (dump_stack+0x84/0xa0)
[<
c062714c>] (dump_stack) from [<
c0132560>] (__warn+0x14c/0x180)
[<
c0132560>] (__warn) from [<
c01325dc>] (warn_slowpath_fmt+0x48/0x50)
[<
c01325dc>] (warn_slowpath_fmt) from [<
c06814f8>] (check_unmap+0xa1c/0xe50)
[<
c06814f8>] (check_unmap) from [<
c06819c4>] (debug_dma_unmap_page+0x98/0xc8)
[<
c06819c4>] (debug_dma_unmap_page) from [<
c076c3e8>] (exynos_iommu_domain_free+0x158/0x380)
[<
c076c3e8>] (exynos_iommu_domain_free) from [<
c0764a30>] (iommu_domain_free+0x34/0x60)
[<
c0764a30>] (iommu_domain_free) from [<
c011f168>] (release_iommu_mapping+0x30/0xb8)
[<
c011f168>] (release_iommu_mapping) from [<
c011f23c>] (arm_iommu_release_mapping+0x4c/0x50)
[<
c011f23c>] (arm_iommu_release_mapping) from [<
c0b061ac>] (s5p_mfc_probe+0x640/0x80c)
[<
c0b061ac>] (s5p_mfc_probe) from [<
c07e6750>] (platform_drv_probe+0x70/0x148)
[<
c07e6750>] (platform_drv_probe) from [<
c07e25c0>] (driver_probe_device+0x12c/0x6b0)
[<
c07e25c0>] (driver_probe_device) from [<
c07e2c6c>] (__driver_attach+0x128/0x17c)
[<
c07e2c6c>] (__driver_attach) from [<
c07df74c>] (bus_for_each_dev+0x88/0xc8)
[<
c07df74c>] (bus_for_each_dev) from [<
c07e1b6c>] (driver_attach+0x34/0x58)
[<
c07e1b6c>] (driver_attach) from [<
c07e1350>] (bus_add_driver+0x18c/0x32c)
[<
c07e1350>] (bus_add_driver) from [<
c07e4198>] (driver_register+0x98/0x148)
[<
c07e4198>] (driver_register) from [<
c07e5cb0>] (__platform_driver_register+0x58/0x74)
[<
c07e5cb0>] (__platform_driver_register) from [<
c174cb30>] (s5p_mfc_driver_init+0x1c/0x20)
[<
c174cb30>] (s5p_mfc_driver_init) from [<
c0102690>] (do_one_initcall+0x64/0x258)
[<
c0102690>] (do_one_initcall) from [<
c17014c0>] (kernel_init_freeable+0x3d0/0x4d0)
[<
c17014c0>] (kernel_init_freeable) from [<
c116eeb4>] (kernel_init+0x18/0x134)
[<
c116eeb4>] (kernel_init) from [<
c010bbd8>] (ret_from_fork+0x14/0x3c)
---[ end trace
dc54c54bd3581296 ]---
This patch moves initialization of DMA-debug to core_initcall. This is
safe from the initialization perspective. dma_debug_do_init() internally calls
debugfs functions and debugfs also gets initialised at core_initcall(), and
that is earlier than arch code in the link order, so it will get initialized
just before the DMA-debug.
Reported-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>