On Tue, Jul 01, 2025 at 01:38:44PM +0300, Leon Romanovsky wrote: > > +static void ionic_flush_qs(struct ionic_ibdev *dev) > > +{ > > + struct ionic_qp *qp, *qp_tmp; > > + struct ionic_cq *cq, *cq_tmp; > > + LIST_HEAD(flush_list); > > + unsigned long index; > > + > > + /* Flush qp send and recv */ > > + rcu_read_lock(); > > + xa_for_each(&dev->qp_tbl, index, qp) { > > + kref_get(&qp->qp_kref); > > + list_add_tail(&qp->ibkill_flush_ent, &flush_list); > > + } > > + rcu_read_unlock(); > > Same question as for CQ. What does RCU lock protect here? It should protect the kref_get against free of qp. The qp memory must be RCU freed. But this pattern requires kref_get_unless_zero() Jason