• Saeed Mahameed's avatar
    RDMA/cm: Fix IRQ restore in ib_send_cm_sidr_rep · 221384df
    Saeed Mahameed authored
    ib_send_cm_sidr_rep() {
    	spin_lock_irqsave()
            cm_send_sidr_rep_locked() {
                    ...
            	spin_lock_irq()
                    ....
                    spin_unlock_irq() <--- this will enable interrupts
            }
            spin_unlock_irqrestore()
    }
    
    spin_unlock_irqrestore() expects interrupts to be disabled but the
    internal spin_unlock_irq() will always enable hard interrupts.
    
    Fix this by replacing the internal spin_{lock,unlock}_irq() with
    irqsave/restore variants.
    
    It fixes the following kernel trace:
    
     raw_local_irq_restore() called with IRQs enabled
     WARNING: CPU: 2 PID: 20001 at kernel/locking/irqflag-debug.c:10 warn_bogus_irq_restore+0x1d/0x20
    
     Call Trace:
      _raw_spin_unlock_irqrestore+0x4e/0x50
      ib_send_cm_sidr_rep+0x3a/0x50 [ib_cm]
      cma_send_sidr_rep+0xa1/0x160 [rdma_cm]
      rdma_accept+0x25e/0x350 [rdma_cm]
      ucma_accept+0x132/0x1cc [rdma_ucm]
      ucma_write+0xbf/0x140 [rdma_ucm]
      vfs_write+0xc1/0x340
      ksys_write+0xb3/0xe0
      do_syscall_64+0x2d/0x40
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    Fixes: 87c4c774 ("RDMA/cm: Protect access to remote_sidr_table")
    Link: https://lore.kernel.org/r/20210301081844.445823-1-leon@kernel.orgSigned-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
    Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    221384df
cm.c 129 KB