Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85cbb7c7 authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Roland Dreier
Browse files

IB/qib: Correct reference counting in debugfs qp_stats



This particular reference count is not needed with the rcu protection,
and the current code leaks a reference count, causing a hang in
qib_qp_destroy().

Cc: <stable@vger.kernel.org>
Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent f5c4984e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos)
	struct qib_qp_iter *iter;
	loff_t n = *pos;

	rcu_read_lock();
	iter = qib_qp_iter_init(s->private);
	if (!iter)
		return NULL;
@@ -224,7 +225,7 @@ static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr,

static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr)
{
	/* nothing for now */
	rcu_read_unlock();
}

static int _qp_stats_seq_show(struct seq_file *s, void *iter_ptr)
+0 −8
Original line number Diff line number Diff line
@@ -1325,7 +1325,6 @@ int qib_qp_iter_next(struct qib_qp_iter *iter)
	struct qib_qp *pqp = iter->qp;
	struct qib_qp *qp;

	rcu_read_lock();
	for (; n < dev->qp_table_size; n++) {
		if (pqp)
			qp = rcu_dereference(pqp->next);
@@ -1333,18 +1332,11 @@ int qib_qp_iter_next(struct qib_qp_iter *iter)
			qp = rcu_dereference(dev->qp_table[n]);
		pqp = qp;
		if (qp) {
			if (iter->qp)
				atomic_dec(&iter->qp->refcount);
			atomic_inc(&qp->refcount);
			rcu_read_unlock();
			iter->qp = qp;
			iter->n = n;
			return 0;
		}
	}
	rcu_read_unlock();
	if (iter->qp)
		atomic_dec(&iter->qp->refcount);
	return ret;
}