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

Commit b9809552 authored by Theodore Ts'o's avatar Theodore Ts'o
Browse files

random: fix locking dependency with the tasklist_lock



Commit 61337054 introduced a circular lock dependency because
posix_cpu_timers_exit() is called by release_task(), which is holding
a writer lock on tasklist_lock, and this can cause a deadlock since
kill_fasync() gets called with nonblocking_pool.lock taken.

There's no reason why kill_fasync() needs to be taken while the random
pool is locked, so move it out to fix this locking dependency.

Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
Reported-by: default avatarRuss Dill <Russ.Dill@gmail.com>
Cc: stable@kernel.org
parent 19f949f5
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -852,6 +852,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
		      int reserved)
{
	unsigned long flags;
	int wakeup_write = 0;

	/* Hold lock while accounting */
	spin_lock_irqsave(&r->lock, flags);
@@ -873,10 +874,8 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
		else
			r->entropy_count = reserved;

		if (r->entropy_count < random_write_wakeup_thresh) {
			wake_up_interruptible(&random_write_wait);
			kill_fasync(&fasync, SIGIO, POLL_OUT);
		}
		if (r->entropy_count < random_write_wakeup_thresh)
			wakeup_write = 1;
	}

	DEBUG_ENT("debiting %zu entropy credits from %s%s\n",
@@ -884,6 +883,11 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,

	spin_unlock_irqrestore(&r->lock, flags);

	if (wakeup_write) {
		wake_up_interruptible(&random_write_wait);
		kill_fasync(&fasync, SIGIO, POLL_OUT);
	}

	return nbytes;
}