• Geert Uytterhoeven's avatar
    iommu/ipmmu-vmsa: Fix allocation in atomic context · 46583e8c
    Geert Uytterhoeven authored
    When attaching a device to an IOMMU group with
    CONFIG_DEBUG_ATOMIC_SLEEP=y:
    
        BUG: sleeping function called from invalid context at mm/slab.h:421
        in_atomic(): 1, irqs_disabled(): 128, pid: 61, name: kworker/1:1
        ...
        Call trace:
         ...
         arm_lpae_alloc_pgtable+0x114/0x184
         arm_64_lpae_alloc_pgtable_s1+0x2c/0x128
         arm_32_lpae_alloc_pgtable_s1+0x40/0x6c
         alloc_io_pgtable_ops+0x60/0x88
         ipmmu_attach_device+0x140/0x334
    
    ipmmu_attach_device() takes a spinlock, while arm_lpae_alloc_pgtable()
    allocates memory using GFP_KERNEL.  Originally, the ipmmu-vmsa driver
    had its own custom page table allocation implementation using
    GFP_ATOMIC, hence the spinlock was fine.
    
    Fix this by replacing the spinlock by a mutex, like the arm-smmu driver
    does.
    
    Fixes: f20ed39f ("iommu/ipmmu-vmsa: Use the ARM LPAE page table allocator")
    Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    46583e8c
ipmmu-vmsa.c 29.1 KB