diff options
Diffstat (limited to 'include/linux/netpoll.h')
-rw-r--r-- | include/linux/netpoll.h | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index c0d8b90c5202..bcd0ac33f592 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h | |||
@@ -16,14 +16,19 @@ struct netpoll; | |||
16 | struct netpoll { | 16 | struct netpoll { |
17 | struct net_device *dev; | 17 | struct net_device *dev; |
18 | char dev_name[16], *name; | 18 | char dev_name[16], *name; |
19 | int rx_flags; | ||
20 | void (*rx_hook)(struct netpoll *, int, char *, int); | 19 | void (*rx_hook)(struct netpoll *, int, char *, int); |
21 | void (*drop)(struct sk_buff *skb); | 20 | void (*drop)(struct sk_buff *skb); |
22 | u32 local_ip, remote_ip; | 21 | u32 local_ip, remote_ip; |
23 | u16 local_port, remote_port; | 22 | u16 local_port, remote_port; |
24 | unsigned char local_mac[6], remote_mac[6]; | 23 | unsigned char local_mac[6], remote_mac[6]; |
24 | }; | ||
25 | |||
26 | struct netpoll_info { | ||
25 | spinlock_t poll_lock; | 27 | spinlock_t poll_lock; |
26 | int poll_owner; | 28 | int poll_owner; |
29 | int rx_flags; | ||
30 | spinlock_t rx_lock; | ||
31 | struct netpoll *rx_np; /* netpoll that registered an rx_hook */ | ||
27 | }; | 32 | }; |
28 | 33 | ||
29 | void netpoll_poll(struct netpoll *np); | 34 | void netpoll_poll(struct netpoll *np); |
@@ -39,22 +44,35 @@ void netpoll_queue(struct sk_buff *skb); | |||
39 | #ifdef CONFIG_NETPOLL | 44 | #ifdef CONFIG_NETPOLL |
40 | static inline int netpoll_rx(struct sk_buff *skb) | 45 | static inline int netpoll_rx(struct sk_buff *skb) |
41 | { | 46 | { |
42 | return skb->dev->np && skb->dev->np->rx_flags && __netpoll_rx(skb); | 47 | struct netpoll_info *npinfo = skb->dev->npinfo; |
48 | unsigned long flags; | ||
49 | int ret = 0; | ||
50 | |||
51 | if (!npinfo || (!npinfo->rx_np && !npinfo->rx_flags)) | ||
52 | return 0; | ||
53 | |||
54 | spin_lock_irqsave(&npinfo->rx_lock, flags); | ||
55 | /* check rx_flags again with the lock held */ | ||
56 | if (npinfo->rx_flags && __netpoll_rx(skb)) | ||
57 | ret = 1; | ||
58 | spin_unlock_irqrestore(&npinfo->rx_lock, flags); | ||
59 | |||
60 | return ret; | ||
43 | } | 61 | } |
44 | 62 | ||
45 | static inline void netpoll_poll_lock(struct net_device *dev) | 63 | static inline void netpoll_poll_lock(struct net_device *dev) |
46 | { | 64 | { |
47 | if (dev->np) { | 65 | if (dev->npinfo) { |
48 | spin_lock(&dev->np->poll_lock); | 66 | spin_lock(&dev->npinfo->poll_lock); |
49 | dev->np->poll_owner = smp_processor_id(); | 67 | dev->npinfo->poll_owner = smp_processor_id(); |
50 | } | 68 | } |
51 | } | 69 | } |
52 | 70 | ||
53 | static inline void netpoll_poll_unlock(struct net_device *dev) | 71 | static inline void netpoll_poll_unlock(struct net_device *dev) |
54 | { | 72 | { |
55 | if (dev->np) { | 73 | if (dev->npinfo) { |
56 | spin_unlock(&dev->np->poll_lock); | 74 | dev->npinfo->poll_owner = -1; |
57 | dev->np->poll_owner = -1; | 75 | spin_unlock(&dev->npinfo->poll_lock); |
58 | } | 76 | } |
59 | } | 77 | } |
60 | 78 | ||