• Max Gurtovoy's avatar
    nvme-rdma: use dynamic dma mapping per command · 62f99b62
    Max Gurtovoy authored
    Commit 87fd1253 ("nvme-rdma: remove redundant reference between
    ib_device and tagset") caused a kernel panic when disconnecting from an
    inaccessible controller (disconnect during re-connection).
    
    --
    nvme nvme0: Removing ctrl: NQN "testnqn1"
    nvme_rdma: nvme_rdma_exit_request: hctx 0 queue_idx 1
    BUG: unable to handle kernel paging request at 0000000080000228
    PGD 0 P4D 0
    Oops: 0000 [#1] SMP PTI
    ...
    Call Trace:
     blk_mq_exit_hctx+0x5c/0xf0
     blk_mq_exit_queue+0xd4/0x100
     blk_cleanup_queue+0x9a/0xc0
     nvme_rdma_destroy_io_queues+0x52/0x60 [nvme_rdma]
     nvme_rdma_shutdown_ctrl+0x3e/0x80 [nvme_rdma]
     nvme_do_delete_ctrl+0x53/0x80 [nvme_core]
     nvme_sysfs_delete+0x45/0x60 [nvme_core]
     kernfs_fop_write+0x105/0x180
     vfs_write+0xad/0x1a0
     ksys_write+0x5a/0xd0
     do_syscall_64+0x55/0x110
     entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x7fa215417154
    --
    
    The reason for this crash is accessing an already freed ib_device for
    performing dma_unmap during exit_request commands. The root cause for
    that is that during re-connection all the queues are destroyed and
    re-created (and the ib_device is reference counted by the queues and
    freed as well) but the tagset stays alive and all the DMA mappings (that
    we perform in init_request) kept in the request context. The original
    commit fixed a different bug that was introduced during bonding (aka nic
    teaming) tests that for some scenarios change the underlying ib_device
    and caused memory leakage and possible segmentation fault. This commit
    is a complementary commit that also changes the wrong DMA mappings that
    were saved in the request context and making the request sqe dma
    mappings dynamic with the command lifetime (i.e. mapped in .queue_rq and
    unmapped in .complete). It also fixes the above crash of accessing freed
    ib_device during destruction of the tagset.
    
    Fixes: 87fd1253 ("nvme-rdma: remove redundant reference between ib_device and tagset")
    Reported-by: default avatarJim Harris <james.r.harris@intel.com>
    Suggested-by: default avatarSagi Grimberg <sagi@grimberg.me>
    Tested-by: default avatarJim Harris <james.r.harris@intel.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarMax Gurtovoy <maxg@mellanox.com>
    Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
    62f99b62
rdma.c 53.6 KB