--- y/kernel/watch_queue.c +++ w/kernel/watch_queue.c @@ -83,10 +83,10 @@ static bool post_one_notification(struct if (!pipe) return false; - spin_lock_irq(&pipe->rd_wait.lock); - + spin_lock_bh(&wqueue->lock); if (wqueue->defunct) - goto out; + goto unlock; + spin_lock_irq(&pipe->rd_wait.lock); mask = pipe->ring_size - 1; head = pipe->head; @@ -126,6 +126,8 @@ out: spin_unlock_irq(&pipe->rd_wait.lock); if (done) kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); +unlock: + spin_unlock_bh(&wqueue->lock); return done; lost: