forked from mirrors/linux
		
	net: Change return type of sk_busy_loop from bool to void
checking the return value of sk_busy_loop. As there are only a few consumers of that data, and the data being checked for can be replaced with a check for !skb_queue_empty() we might as well just pull the code out of sk_busy_loop and place it in the spots that actually need it. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									d2e64dbbe9
								
							
						
					
					
						commit
						2b5cd0dfa3
					
				
					 4 changed files with 25 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -74,7 +74,7 @@ static inline bool busy_loop_timeout(unsigned long end_time)
 | 
			
		|||
	return time_after(now, end_time);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool sk_busy_loop(struct sock *sk, int nonblock);
 | 
			
		||||
void sk_busy_loop(struct sock *sk, int nonblock);
 | 
			
		||||
 | 
			
		||||
#else /* CONFIG_NET_RX_BUSY_POLL */
 | 
			
		||||
static inline unsigned long net_busy_loop_on(void)
 | 
			
		||||
| 
						 | 
				
			
			@ -97,9 +97,8 @@ static inline bool busy_loop_timeout(unsigned long end_time)
 | 
			
		|||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline bool sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		||||
static inline void sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		||||
{
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* CONFIG_NET_RX_BUSY_POLL */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -256,8 +256,12 @@ struct sk_buff *__skb_try_recv_datagram(struct sock *sk, unsigned int flags,
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		spin_unlock_irqrestore(&queue->lock, cpu_flags);
 | 
			
		||||
	} while (sk_can_busy_loop(sk) &&
 | 
			
		||||
		 sk_busy_loop(sk, flags & MSG_DONTWAIT));
 | 
			
		||||
 | 
			
		||||
		if (!sk_can_busy_loop(sk))
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		sk_busy_loop(sk, flags & MSG_DONTWAIT);
 | 
			
		||||
	} while (!skb_queue_empty(&sk->sk_receive_queue));
 | 
			
		||||
 | 
			
		||||
	error = -EAGAIN;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5060,21 +5060,19 @@ static void busy_poll_stop(struct napi_struct *napi, void *have_poll_lock)
 | 
			
		|||
		do_softirq();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		||||
void sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long end_time = !nonblock ? sk_busy_loop_end_time(sk) : 0;
 | 
			
		||||
	int (*napi_poll)(struct napi_struct *napi, int budget);
 | 
			
		||||
	void *have_poll_lock = NULL;
 | 
			
		||||
	struct napi_struct *napi;
 | 
			
		||||
	unsigned int napi_id;
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
restart:
 | 
			
		||||
	napi_id = READ_ONCE(sk->sk_napi_id);
 | 
			
		||||
	if (napi_id < MIN_NAPI_ID)
 | 
			
		||||
		return 0;
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	rc = false;
 | 
			
		||||
	napi_poll = NULL;
 | 
			
		||||
 | 
			
		||||
	rcu_read_lock();
 | 
			
		||||
| 
						 | 
				
			
			@ -5085,7 +5083,8 @@ bool sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		|||
 | 
			
		||||
	preempt_disable();
 | 
			
		||||
	for (;;) {
 | 
			
		||||
		rc = 0;
 | 
			
		||||
		int work = 0;
 | 
			
		||||
 | 
			
		||||
		local_bh_disable();
 | 
			
		||||
		if (!napi_poll) {
 | 
			
		||||
			unsigned long val = READ_ONCE(napi->state);
 | 
			
		||||
| 
						 | 
				
			
			@ -5103,12 +5102,12 @@ bool sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		|||
			have_poll_lock = netpoll_poll_lock(napi);
 | 
			
		||||
			napi_poll = napi->poll;
 | 
			
		||||
		}
 | 
			
		||||
		rc = napi_poll(napi, BUSY_POLL_BUDGET);
 | 
			
		||||
		trace_napi_poll(napi, rc, BUSY_POLL_BUDGET);
 | 
			
		||||
		work = napi_poll(napi, BUSY_POLL_BUDGET);
 | 
			
		||||
		trace_napi_poll(napi, work, BUSY_POLL_BUDGET);
 | 
			
		||||
count:
 | 
			
		||||
		if (rc > 0)
 | 
			
		||||
		if (work > 0)
 | 
			
		||||
			__NET_ADD_STATS(sock_net(sk),
 | 
			
		||||
					LINUX_MIB_BUSYPOLLRXPACKETS, rc);
 | 
			
		||||
					LINUX_MIB_BUSYPOLLRXPACKETS, work);
 | 
			
		||||
		local_bh_enable();
 | 
			
		||||
 | 
			
		||||
		if (nonblock || !skb_queue_empty(&sk->sk_receive_queue) ||
 | 
			
		||||
| 
						 | 
				
			
			@ -5121,9 +5120,9 @@ bool sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		|||
			preempt_enable();
 | 
			
		||||
			rcu_read_unlock();
 | 
			
		||||
			cond_resched();
 | 
			
		||||
			rc = !skb_queue_empty(&sk->sk_receive_queue);
 | 
			
		||||
			if (rc || busy_loop_timeout(end_time))
 | 
			
		||||
				return rc;
 | 
			
		||||
			if (!skb_queue_empty(&sk->sk_receive_queue) ||
 | 
			
		||||
			    busy_loop_timeout(end_time))
 | 
			
		||||
				return;
 | 
			
		||||
			goto restart;
 | 
			
		||||
		}
 | 
			
		||||
		cpu_relax();
 | 
			
		||||
| 
						 | 
				
			
			@ -5131,10 +5130,8 @@ bool sk_busy_loop(struct sock *sk, int nonblock)
 | 
			
		|||
	if (napi_poll)
 | 
			
		||||
		busy_poll_stop(napi, have_poll_lock);
 | 
			
		||||
	preempt_enable();
 | 
			
		||||
	rc = !skb_queue_empty(&sk->sk_receive_queue);
 | 
			
		||||
out:
 | 
			
		||||
	rcu_read_unlock();
 | 
			
		||||
	return rc;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(sk_busy_loop);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7518,9 +7518,12 @@ struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags,
 | 
			
		|||
		if (sk->sk_shutdown & RCV_SHUTDOWN)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		if (sk_can_busy_loop(sk) &&
 | 
			
		||||
		    sk_busy_loop(sk, noblock))
 | 
			
		||||
		if (sk_can_busy_loop(sk)) {
 | 
			
		||||
			sk_busy_loop(sk, noblock);
 | 
			
		||||
 | 
			
		||||
			if (!skb_queue_empty(&sk->sk_receive_queue))
 | 
			
		||||
				continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* User doesn't want to wait.  */
 | 
			
		||||
		error = -EAGAIN;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue