Delay QP destroy completion until all siw references to QP are
dropped. The calling RDMA core will free QP structure after
successful return from siw_qp_destroy() call, so siw must not
hold any remaining reference to the QP upon return.
A use-after-free was encountered in xfstest generic/460, while
testing NFSoRDMA. Here, after a TCP connection drop by peer,
the triggered siw_cm_work_handler got delayed until after
QP destroy call, referencing a QP which has already freed.
Fixes: 303ae1cdfdf7 ("rdma/siw: application interface")
Reported-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Bernard Metzler <bmt@zurich.ibm.com>
Link: https://lore.kernel.org/r/20220920082503.224189-1-bmt@zurich.ibm.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
        struct ib_qp base_qp;
        struct siw_device *sdev;
        struct kref ref;
+       struct completion qp_free;
        struct list_head devq;
        int tx_cpu;
        struct siw_qp_attrs attrs;
 
        vfree(qp->orq);
 
        siw_put_tx_cpu(qp->tx_cpu);
-
+       complete(&qp->qp_free);
        atomic_dec(&sdev->num_qp);
 }
 
        list_add_tail(&qp->devq, &sdev->qp_list);
        spin_unlock_irqrestore(&sdev->lock, flags);
 
+       init_completion(&qp->qp_free);
+
        return 0;
 
 err_out_xa:
        qp->scq = qp->rcq = NULL;
 
        siw_qp_put(qp);
+       wait_for_completion(&qp->qp_free);
 
        return 0;
 }