1
linux/drivers/infiniband
Roland Dreier a3285aa4ee IB/mthca: Fix race in reference counting
Fix races in in destroying various objects.  If a destroy routine
waits for an object to become free by doing

	wait_event(&obj->wait, !atomic_read(&obj->refcount));
	/* now clean up and destroy the object */

and another place drops a reference to the object by doing

	if (atomic_dec_and_test(&obj->refcount))
		wake_up(&obj->wait);

then this is susceptible to a race where the wait_event() and final
freeing of the object occur between the atomic_dec_and_test() and the
wake_up().  And this is a use-after-free, since wake_up() will be
called on part of the already-freed object.

Fix this in mthca by replacing the atomic_t refcounts with plain old
integers protected by a spinlock.  This makes it possible to do the
decrement of the reference count and the wake_up() so that it appears
as a single atomic operation to the code waiting on the wait queue.

While touching this code, also simplify mthca_cq_clean(): the CQ being
cleaned cannot go away, because it still has a QP attached to it.  So
there's no reason to be paranoid and look up the CQ by number; it's
perfectly safe to use the pointer that the callers already have.

Signed-off-by: Roland Dreier <rolandd@cisco.com>
2006-05-09 10:50:29 -07:00
..
core IB: Fix display of 4-bit port counters in sysfs 2006-05-09 10:50:28 -07:00
hw IB/mthca: Fix race in reference counting 2006-05-09 10:50:29 -07:00
ulp IB/srp: Fix tracking of pending requests during error handling 2006-05-09 10:50:28 -07:00
Kconfig IB/ipath: kbuild infrastructure 2006-03-31 13:14:21 -08:00
Makefile IB/ipath: kbuild infrastructure 2006-03-31 13:14:21 -08:00