在 2022/4/11 19:50, Jason Gunthorpe 写道:
On Mon, Apr 11, 2022 at 04:00:18PM -0400, yanjun.zhu@xxxxxxxxx wrote:
@@ -138,8 +139,10 @@ void *rxe_alloc(struct rxe_pool *pool)
elem->obj = obj;
kref_init(&elem->ref_cnt);
- err = xa_alloc_cyclic(&pool->xa, &elem->index, elem, pool->limit,
- &pool->next, GFP_KERNEL);
+ xa_lock_irqsave(&pool->xa, flags);
+ err = __xa_alloc_cyclic(&pool->xa, &elem->index, elem, pool->limit,
+ &pool->next, GFP_ATOMIC);
+ xa_unlock_irqrestore(&pool->xa, flags);
No to using atomics, this needs to be either the _irq or _bh varient
If I understand you correctly, you mean that we should use
xa_lock_irq/xa_unlock_irq or xa_lock_bh/xa_unlock_bh instead of
xa_unlock_irqrestore?
If so, xa_lock_irq/xa_unlock_irq or xa_lock_bh/xa_unlock_bh is used
here, the warning as below will appear. This means that
__rxe_add_to_pool disables softirq, but fpu_clone enables softirq.
"
Apr 12 16:24:53 kernel: softirqs last enabled at (13086):
[<ffffffff91830d26>] fpu_clone+0xf6/0x570
Apr 12 16:24:53 kernel: softirqs last disabled at (13129):
[<ffffffffc077f319>] __rxe_add_to_pool+0x49/0xa0 [rdma_rxe]
"
As such, it is better to use xa_unlock_irqrestore +
__xa_alloc(...,GFP_ATOMIC/GFP_NOWAIT).
Zhu Yanjun
Jason