diff options
| author | Soheil Hassas Yeganeh <soheil@google.com> | 2020-12-18 14:02:03 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-12-19 11:18:38 -0800 | 
| commit | 00b27634bc471e0198f93d48694171121af2e159 (patch) | |
| tree | ea67bbb4f3ff5eff143c79603990dd7d6338f0a8 | |
| parent | e8c85328b1e88f4ee7f84a1fdbff2f2c7965e026 (diff) | |
epoll: replace gotos with a proper loop
The existing loop is pointless, and the labels make it really hard to
follow the structure.
Replace that control structure with a simple loop that returns when there
are new events, there is a signal, or the thread has timed out.
Link: https://lkml.kernel.org/r/20201106231635.3528496-8-soheil.kdev@gmail.com
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Reviewed-by: Khazhismel Kumykov <khazhy@google.com>
Cc: Guantao Liu <guantaol@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | fs/eventpoll.c | 42 | 
1 files changed, 21 insertions, 21 deletions
diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 63a7a6e13dfc..1e0030cb805b 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -1743,7 +1743,7 @@ static inline struct timespec64 ep_set_mstimeout(long ms)  static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,  		   int maxevents, long timeout)  { -	int res, eavail, timed_out = 0; +	int res, eavail = 0, timed_out = 0;  	u64 slack = 0;  	wait_queue_entry_t wait;  	ktime_t expires, *to = NULL; @@ -1769,18 +1769,30 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,  		write_lock_irq(&ep->lock);  		eavail = ep_events_available(ep);  		write_unlock_irq(&ep->lock); - -		goto send_events;  	} -fetch_events: -	do { +	while (1) { +		if (eavail) { +			/* +			 * Try to transfer events to user space. In case we get +			 * 0 events and there's still timeout left over, we go +			 * trying again in search of more luck. +			 */ +			res = ep_send_events(ep, events, maxevents); +			if (res) +				return res; +		} + +		if (timed_out) +			return 0; +  		eavail = ep_events_available(ep); -		if (!eavail) -			eavail = ep_busy_loop(ep, timed_out); +		if (eavail) +			continue; +		eavail = ep_busy_loop(ep, timed_out);  		if (eavail) -			goto send_events; +			continue;  		if (signal_pending(current))  			return -EINTR; @@ -1845,19 +1857,7 @@ fetch_events:  			__remove_wait_queue(&ep->wq, &wait);  			write_unlock_irq(&ep->lock);  		} -	} while (0); - -send_events: -	/* -	 * Try to transfer events to user space. In case we get 0 events and -	 * there's still timeout left over, we go trying again in search of -	 * more luck. -	 */ -	if (eavail && -	    !(res = ep_send_events(ep, events, maxevents)) && !timed_out) -		goto fetch_events; - -	return res; +	}  }  /**  | 
