diff options
Diffstat (limited to 'include/linux/netpoll.h')
-rw-r--r-- | include/linux/netpoll.h | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index 29930b71a9aa..08dcc39ec18d 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h | |||
@@ -25,8 +25,6 @@ struct netpoll { | |||
25 | 25 | ||
26 | struct netpoll_info { | 26 | struct netpoll_info { |
27 | atomic_t refcnt; | 27 | atomic_t refcnt; |
28 | spinlock_t poll_lock; | ||
29 | int poll_owner; | ||
30 | int rx_flags; | 28 | int rx_flags; |
31 | spinlock_t rx_lock; | 29 | spinlock_t rx_lock; |
32 | struct netpoll *rx_np; /* netpoll that registered an rx_hook */ | 30 | struct netpoll *rx_np; /* netpoll that registered an rx_hook */ |
@@ -64,32 +62,61 @@ static inline int netpoll_rx(struct sk_buff *skb) | |||
64 | return ret; | 62 | return ret; |
65 | } | 63 | } |
66 | 64 | ||
67 | static inline void *netpoll_poll_lock(struct net_device *dev) | 65 | static inline int netpoll_receive_skb(struct sk_buff *skb) |
68 | { | 66 | { |
67 | if (!list_empty(&skb->dev->napi_list)) | ||
68 | return netpoll_rx(skb); | ||
69 | return 0; | ||
70 | } | ||
71 | |||
72 | static inline void *netpoll_poll_lock(struct napi_struct *napi) | ||
73 | { | ||
74 | struct net_device *dev = napi->dev; | ||
75 | |||
69 | rcu_read_lock(); /* deal with race on ->npinfo */ | 76 | rcu_read_lock(); /* deal with race on ->npinfo */ |
70 | if (dev->npinfo) { | 77 | if (dev && dev->npinfo) { |
71 | spin_lock(&dev->npinfo->poll_lock); | 78 | spin_lock(&napi->poll_lock); |
72 | dev->npinfo->poll_owner = smp_processor_id(); | 79 | napi->poll_owner = smp_processor_id(); |
73 | return dev->npinfo; | 80 | return napi; |
74 | } | 81 | } |
75 | return NULL; | 82 | return NULL; |
76 | } | 83 | } |
77 | 84 | ||
78 | static inline void netpoll_poll_unlock(void *have) | 85 | static inline void netpoll_poll_unlock(void *have) |
79 | { | 86 | { |
80 | struct netpoll_info *npi = have; | 87 | struct napi_struct *napi = have; |
81 | 88 | ||
82 | if (npi) { | 89 | if (napi) { |
83 | npi->poll_owner = -1; | 90 | napi->poll_owner = -1; |
84 | spin_unlock(&npi->poll_lock); | 91 | spin_unlock(&napi->poll_lock); |
85 | } | 92 | } |
86 | rcu_read_unlock(); | 93 | rcu_read_unlock(); |
87 | } | 94 | } |
88 | 95 | ||
96 | static inline void netpoll_netdev_init(struct net_device *dev) | ||
97 | { | ||
98 | INIT_LIST_HEAD(&dev->napi_list); | ||
99 | } | ||
100 | |||
89 | #else | 101 | #else |
90 | #define netpoll_rx(a) 0 | 102 | static inline int netpoll_rx(struct sk_buff *skb) |
91 | #define netpoll_poll_lock(a) NULL | 103 | { |
92 | #define netpoll_poll_unlock(a) | 104 | return 0; |
105 | } | ||
106 | static inline int netpoll_receive_skb(struct sk_buff *skb) | ||
107 | { | ||
108 | return 0; | ||
109 | } | ||
110 | static inline void *netpoll_poll_lock(struct napi_struct *napi) | ||
111 | { | ||
112 | return NULL; | ||
113 | } | ||
114 | static inline void netpoll_poll_unlock(void *have) | ||
115 | { | ||
116 | } | ||
117 | static inline void netpoll_netdev_init(struct net_device *dev) | ||
118 | { | ||
119 | } | ||
93 | #endif | 120 | #endif |
94 | 121 | ||
95 | #endif | 122 | #endif |