On 28/09/2021 2:04, Jason Gunthorpe wrote: > On Mon, Sep 13, 2021 at 03:04:04PM +0300, Gal Pressman wrote: > >> @@ -993,15 +1002,24 @@ int efa_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata) >> "Destroy cq[%d] virt[0x%p] freed: size[%lu], dma[%pad]\n", >> cq->cq_idx, cq->cpu_addr, cq->size, &cq->dma_addr); >> >> - rdma_user_mmap_entry_remove(cq->mmap_entry); >> + efa_cq_user_mmap_entries_remove(cq); >> efa_destroy_cq_idx(dev, cq->cq_idx); >> + xa_erase(&dev->cqs_xa, cq->cq_idx); >> + if (cq->eq) >> + synchronize_irq(cq->eq->irq.irqn); > > Why is this conditional? The whole thing should be conditional, > including putting it in the XA in the first place if that is the > intention > > A comment on the xa_load would also be good to explain that it is safe > because this must be a irq and snychronize_irq() manages lifetime Will do, thanks.