On Wed, Jul 02, 2025 at 10:18:03AM -0300, Jason Gunthorpe wrote: > 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. I'm not sure that this was intension here. Let's wait for an answer from the author. > > But this pattern requires kref_get_unless_zero() > > Jason