• Marek Szyprowski's avatar
    ARM: 8628/1: dma-mapping: preallocate DMA-debug hash tables in core_initcall · 256ff1cf
    Marek Szyprowski authored
    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: default avatarSeung-Woo Kim <sw0312.kim@samsung.com>
    Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    256ff1cf
dma-mapping.c 62.4 KB