• Mark Bloch's avatar
    IB/mlx5: Fix cleanup order on unload · 42cea83f
    Mark Bloch authored
    On load we create private CQ/QP/PD in order to be used by UMR, we create
    those resources after we register ourself as an IB device, and we destroy
    them after we unregister as an IB device. This was changed by commit
    16c1975f ("IB/mlx5: Create profile infrastructure to add and remove
    stages") which moved the destruction before we unregistration. This
    allowed to trigger an invalid memory access when unloading mlx5_ib while
    there are open resources:
    BUG: unable to handle kernel paging request at 00000001002c012c
    Call Trace:
     mlx5_ib_post_send_wait+0x75/0x110 [mlx5_ib]
     delay_time_func+0x10/0x10 [mlx5_ib]
     unreg_umr.isra.15+0x4b/0x50 [mlx5_ib]
     mlx5_mr_cache_free+0x46/0x150 [mlx5_ib]
     clean_mr+0xc9/0x190 [mlx5_ib]
     dereg_mr+0xba/0xf0 [mlx5_ib]
     ib_dereg_mr+0x13/0x20 [ib_core]
     remove_commit_idr_uobject+0x16/0x70 [ib_uverbs]
     uverbs_cleanup_ucontext+0xe8/0x1a0 [ib_uverbs]
     ib_uverbs_cleanup_ucontext.isra.9+0x19/0x40 [ib_uverbs]
     ib_uverbs_remove_one+0x162/0x2e0 [ib_uverbs]
     ib_unregister_device+0xd4/0x190 [ib_core]
     __mlx5_ib_remove+0x2e/0x40 [mlx5_ib]
     mlx5_remove_device+0xf5/0x120 [mlx5_core]
     mlx5_unregister_interface+0x37/0x90 [mlx5_core]
     mlx5_ib_cleanup+0xc/0x225 [mlx5_ib]
    We restore the original behavior by breaking the UMR stage into two parts,
    pre and post IB registration stages, this way we can restore the original
    functionality and maintain clean separation of logic between stages.
    Fixes: 16c1975f
     ("IB/mlx5: Create profile infrastructure to add and remove stages")
    Signed-off-by: default avatarMark Bloch <markb@mellanox.com>
    Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>