blob: b82d6ba70a1484d8b661f3a0f4993af9610f7278 [file] [log] [blame]
Eliezer Tamir06021292013-06-10 11:39:50 +03001/*
Eliezer Tamir8b80cda2013-07-10 17:13:26 +03002 * net busy poll support
Eliezer Tamir06021292013-06-10 11:39:50 +03003 * Copyright(c) 2013 Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Author: Eliezer Tamir
19 *
20 * Contact Information:
21 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
22 */
23
Eliezer Tamir8b80cda2013-07-10 17:13:26 +030024#ifndef _LINUX_NET_BUSY_POLL_H
25#define _LINUX_NET_BUSY_POLL_H
Eliezer Tamir06021292013-06-10 11:39:50 +030026
27#include <linux/netdevice.h>
Ingo Molnare6017572017-02-01 16:36:40 +010028#include <linux/sched/clock.h>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010029#include <linux/sched/signal.h>
Eliezer Tamir06021292013-06-10 11:39:50 +030030#include <net/ip.h>
31
Cong Wange0d10952013-08-01 11:10:25 +080032#ifdef CONFIG_NET_RX_BUSY_POLL
Eliezer Tamir06021292013-06-10 11:39:50 +030033
34struct napi_struct;
Eliezer Tamir64b0dc52013-07-10 17:13:36 +030035extern unsigned int sysctl_net_busy_read __read_mostly;
36extern unsigned int sysctl_net_busy_poll __read_mostly;
Eliezer Tamir06021292013-06-10 11:39:50 +030037
Alexander Duyck545cd5e2017-03-24 10:07:53 -070038/* 0 - Reserved to indicate value not set
39 * 1..NR_CPUS - Reserved for sender_cpu
40 * NR_CPUS+1..~0 - Region available for NAPI IDs
41 */
42#define MIN_NAPI_ID ((unsigned int)(NR_CPUS + 1))
43
Eliezer Tamircbf55002013-07-08 16:20:34 +030044static inline bool net_busy_loop_on(void)
Eliezer Tamir91e2fd332013-06-28 15:59:35 +030045{
Eliezer Tamir64b0dc52013-07-10 17:13:36 +030046 return sysctl_net_busy_poll;
Eliezer Tamir91e2fd332013-06-28 15:59:35 +030047}
48
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030049static inline u64 busy_loop_us_clock(void)
Eliezer Tamirad6276e2013-06-28 15:59:26 +030050{
Peter Zijlstra37089832013-11-19 16:13:38 +010051 return local_clock() >> 10;
Eliezer Tamirad6276e2013-06-28 15:59:26 +030052}
Eliezer Tamirad6276e2013-06-28 15:59:26 +030053
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030054static inline unsigned long sk_busy_loop_end_time(struct sock *sk)
Eliezer Tamir06021292013-06-10 11:39:50 +030055{
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030056 return busy_loop_us_clock() + ACCESS_ONCE(sk->sk_ll_usec);
Eliezer Tamir2d48d672013-06-24 10:28:03 +030057}
Eliezer Tamir9a3c71a2013-06-14 16:33:35 +030058
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030059/* in poll/select we use the global sysctl_net_ll_poll value */
60static inline unsigned long busy_loop_end_time(void)
Eliezer Tamir2d48d672013-06-24 10:28:03 +030061{
Eliezer Tamir64b0dc52013-07-10 17:13:36 +030062 return busy_loop_us_clock() + ACCESS_ONCE(sysctl_net_busy_poll);
Eliezer Tamir06021292013-06-10 11:39:50 +030063}
64
Eric Dumazet21cb84c2016-11-15 10:15:12 -080065static inline bool sk_can_busy_loop(const struct sock *sk)
Eliezer Tamir06021292013-06-10 11:39:50 +030066{
Alexander Duyck545cd5e2017-03-24 10:07:53 -070067 return sk->sk_ll_usec && !signal_pending(current);
Eliezer Tamir06021292013-06-10 11:39:50 +030068}
69
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030070static inline bool busy_loop_timeout(unsigned long end_time)
71{
72 unsigned long now = busy_loop_us_clock();
73
74 return time_after(now, end_time);
Eliezer Tamir06021292013-06-10 11:39:50 +030075}
76
Eric Dumazet02d62e82015-11-18 06:30:52 -080077bool sk_busy_loop(struct sock *sk, int nonblock);
Eliezer Tamir06021292013-06-10 11:39:50 +030078
Cong Wange0d10952013-08-01 11:10:25 +080079#else /* CONFIG_NET_RX_BUSY_POLL */
Eliezer Tamircbf55002013-07-08 16:20:34 +030080static inline unsigned long net_busy_loop_on(void)
Eliezer Tamir91e2fd332013-06-28 15:59:35 +030081{
82 return 0;
83}
Eliezer Tamir06021292013-06-10 11:39:50 +030084
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030085static inline unsigned long busy_loop_end_time(void)
Eliezer Tamir06021292013-06-10 11:39:50 +030086{
87 return 0;
88}
89
Eliezer Tamircbf55002013-07-08 16:20:34 +030090static inline bool sk_can_busy_loop(struct sock *sk)
Eliezer Tamir06021292013-06-10 11:39:50 +030091{
92 return false;
93}
94
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030095static inline bool busy_loop_timeout(unsigned long end_time)
Eliezer Tamir06021292013-06-10 11:39:50 +030096{
Eliezer Tamir76b1e9b2013-07-09 13:09:21 +030097 return true;
Eliezer Tamir06021292013-06-10 11:39:50 +030098}
99
Cong Wangdfcefb02013-08-01 11:10:24 +0800100static inline bool sk_busy_loop(struct sock *sk, int nonblock)
101{
102 return false;
103}
104
Cong Wange0d10952013-08-01 11:10:25 +0800105#endif /* CONFIG_NET_RX_BUSY_POLL */
Eric Dumazete68b6e52016-11-16 09:10:42 -0800106
Alexander Duyckd2e64db2017-03-24 10:08:06 -0700107/* used in the NIC receive handler to mark the skb */
108static inline void skb_mark_napi_id(struct sk_buff *skb,
109 struct napi_struct *napi)
110{
111#ifdef CONFIG_NET_RX_BUSY_POLL
112 skb->napi_id = napi->napi_id;
113#endif
114}
115
Eric Dumazete68b6e52016-11-16 09:10:42 -0800116/* used in the protocol hanlder to propagate the napi_id to the socket */
117static inline void sk_mark_napi_id(struct sock *sk, const struct sk_buff *skb)
118{
119#ifdef CONFIG_NET_RX_BUSY_POLL
120 sk->sk_napi_id = skb->napi_id;
121#endif
122}
123
124/* variant used for unconnected sockets */
125static inline void sk_mark_napi_id_once(struct sock *sk,
126 const struct sk_buff *skb)
127{
128#ifdef CONFIG_NET_RX_BUSY_POLL
129 if (!sk->sk_napi_id)
130 sk->sk_napi_id = skb->napi_id;
131#endif
132}
133
Eliezer Tamir8b80cda2013-07-10 17:13:26 +0300134#endif /* _LINUX_NET_BUSY_POLL_H */