On 7/2/25 23:30, Leon Romanovsky wrote:
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.
As Jason mentioned, It was intended to protect the kref_get against free
of cq and qp
in the destroy path.
But this pattern requires kref_get_unless_zero()
Jason
I will change it for kref_get_unless_zero().
Thanks,
Abhijit