diff options
Diffstat (limited to 'fs/eventpoll.c')
| -rw-r--r-- | fs/eventpoll.c | 52 | 
1 files changed, 13 insertions, 39 deletions
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index c4159bcc05d9..67a395039268 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -551,28 +551,23 @@ out_unlock:   */  #ifdef CONFIG_DEBUG_LOCK_ALLOC -static struct nested_calls poll_safewake_ncalls; - -static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests) -{ -	unsigned long flags; -	wait_queue_head_t *wqueue = (wait_queue_head_t *)cookie; - -	spin_lock_irqsave_nested(&wqueue->lock, flags, call_nests + 1); -	wake_up_locked_poll(wqueue, EPOLLIN); -	spin_unlock_irqrestore(&wqueue->lock, flags); - -	return 0; -} +static DEFINE_PER_CPU(int, wakeup_nest);  static void ep_poll_safewake(wait_queue_head_t *wq)  { -	int this_cpu = get_cpu(); - -	ep_call_nested(&poll_safewake_ncalls, -		       ep_poll_wakeup_proc, NULL, wq, (void *) (long) this_cpu); +	unsigned long flags; +	int subclass; -	put_cpu(); +	local_irq_save(flags); +	preempt_disable(); +	subclass = __this_cpu_read(wakeup_nest); +	spin_lock_nested(&wq->lock, subclass + 1); +	__this_cpu_inc(wakeup_nest); +	wake_up_locked_poll(wq, POLLIN); +	__this_cpu_dec(wakeup_nest); +	spin_unlock(&wq->lock); +	local_irq_restore(flags); +	preempt_enable();  }  #else @@ -671,7 +666,6 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep,  			      void *priv, int depth, bool ep_locked)  {  	__poll_t res; -	int pwake = 0;  	struct epitem *epi, *nepi;  	LIST_HEAD(txlist); @@ -738,26 +732,11 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep,  	 */  	list_splice(&txlist, &ep->rdllist);  	__pm_relax(ep->ws); - -	if (!list_empty(&ep->rdllist)) { -		/* -		 * Wake up (if active) both the eventpoll wait list and -		 * the ->poll() wait list (delayed after we release the lock). -		 */ -		if (waitqueue_active(&ep->wq)) -			wake_up(&ep->wq); -		if (waitqueue_active(&ep->poll_wait)) -			pwake++; -	}  	write_unlock_irq(&ep->lock);  	if (!ep_locked)  		mutex_unlock(&ep->mtx); -	/* We have to call this outside the lock */ -	if (pwake) -		ep_poll_safewake(&ep->poll_wait); -  	return res;  } @@ -2370,11 +2349,6 @@ static int __init eventpoll_init(void)  	 */  	ep_nested_calls_init(&poll_loop_ncalls); -#ifdef CONFIG_DEBUG_LOCK_ALLOC -	/* Initialize the structure used to perform safe poll wait head wake ups */ -	ep_nested_calls_init(&poll_safewake_ncalls); -#endif -  	/*  	 * We can have many thousands of epitems, so prevent this from  	 * using an extra cache line on 64-bit (and smaller) CPUs  |