Use of rcu_read_lock solves this problem. Rcu_read_lock and spinlock on same data can Co-exist at the same time. That is the whole point. All this is going away soon. Bob -----Original Message----- From: yanjun.zhu@xxxxxxxxx <yanjun.zhu@xxxxxxxxx> Sent: Friday, April 22, 2022 2:44 PM To: jgg@xxxxxxxx; leon@xxxxxxxxxx; linux-rdma@xxxxxxxxxxxxxxx; yanjun.zhu@xxxxxxxxx Cc: Yi Zhang <yi.zhang@xxxxxxxxxx> Subject: [PATCHv6 1/4] RDMA/rxe: Fix dead lock caused by __rxe_add_to_pool interrupted by rxe_pool_get_index From: Zhu Yanjun <yanjun.zhu@xxxxxxxxx> This is a dead lock problem. The ah_pool xa_lock first is acquired in this: {SOFTIRQ-ON-W} state was registered at: lock_acquire+0x1d2/0x5a0 _raw_spin_lock+0x33/0x80 __rxe_add_to_pool+0x183/0x230 [rdma_rxe] Then ah_pool xa_lock is acquired in this: {IN-SOFTIRQ-W}: Call Trace: <TASK> dump_stack_lvl+0x44/0x57 mark_lock.part.52.cold.79+0x3c/0x46 __lock_acquire+0x1565/0x34a0 lock_acquire+0x1d2/0x5a0 _raw_spin_lock_irqsave+0x42/0x90 rxe_pool_get_index+0x72/0x1d0 [rdma_rxe] rxe_get_av+0x168/0x2a0 [rdma_rxe] </TASK>