diff options
author | Jeff Moyer <jmoyer@redhat.com> | 2005-06-23 01:05:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-23 01:05:31 -0400 |
commit | 115c1d6e61b70851d9a363328c3b8d4c2559a1d3 (patch) | |
tree | 3bc37b036fd3ef72d188ff73da94472b40c05a44 /include | |
parent | 6ca4f65e6b390d09e1de7280cf9fd4f5d8e4b48b (diff) |
[NETPOLL]: Introduce a netpoll_info struct
This patch introduces a netpoll_info structure, which the struct net_device
will now point to instead of pointing to a struct netpoll. The reason for
this is two-fold: 1) fields such as the rx_flags, poll_owner, and poll_lock
should be maintained per net_device, not per netpoll; and 2) this is a first
step in providing support for multiple netpoll clients to register against the
same net_device.
The struct netpoll is now pointed to by the netpoll_info structure. As
such, the previous behaviour of the code is preserved.
Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/netdevice.h | 4 | ||||
-rw-r--r-- | include/linux/netpoll.h | 25 |
2 files changed, 19 insertions, 10 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ba5d1236aa17..d6afd440cf7b 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -41,7 +41,7 @@ | |||
41 | struct divert_blk; | 41 | struct divert_blk; |
42 | struct vlan_group; | 42 | struct vlan_group; |
43 | struct ethtool_ops; | 43 | struct ethtool_ops; |
44 | struct netpoll; | 44 | struct netpoll_info; |
45 | /* source back-compat hooks */ | 45 | /* source back-compat hooks */ |
46 | #define SET_ETHTOOL_OPS(netdev,ops) \ | 46 | #define SET_ETHTOOL_OPS(netdev,ops) \ |
47 | ( (netdev)->ethtool_ops = (ops) ) | 47 | ( (netdev)->ethtool_ops = (ops) ) |
@@ -468,7 +468,7 @@ struct net_device | |||
468 | unsigned char *haddr); | 468 | unsigned char *haddr); |
469 | int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); | 469 | int (*neigh_setup)(struct net_device *dev, struct neigh_parms *); |
470 | #ifdef CONFIG_NETPOLL | 470 | #ifdef CONFIG_NETPOLL |
471 | struct netpoll *np; | 471 | struct netpoll_info *npinfo; |
472 | #endif | 472 | #endif |
473 | #ifdef CONFIG_NET_POLL_CONTROLLER | 473 | #ifdef CONFIG_NET_POLL_CONTROLLER |
474 | void (*poll_controller)(struct net_device *dev); | 474 | void (*poll_controller)(struct net_device *dev); |
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index 449a4fde6587..388cd91bc7a6 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h | |||
@@ -16,14 +16,18 @@ 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 | struct netpoll *np; | ||
27 | }; | 31 | }; |
28 | 32 | ||
29 | void netpoll_poll(struct netpoll *np); | 33 | void netpoll_poll(struct netpoll *np); |
@@ -39,22 +43,27 @@ void netpoll_queue(struct sk_buff *skb); | |||
39 | #ifdef CONFIG_NETPOLL | 43 | #ifdef CONFIG_NETPOLL |
40 | static inline int netpoll_rx(struct sk_buff *skb) | 44 | static inline int netpoll_rx(struct sk_buff *skb) |
41 | { | 45 | { |
42 | return skb->dev->np && skb->dev->np->rx_flags && __netpoll_rx(skb); | 46 | struct netpoll_info *npinfo = skb->dev->npinfo; |
47 | |||
48 | if (!npinfo || !npinfo->rx_flags) | ||
49 | return 0; | ||
50 | |||
51 | return npinfo->np && __netpoll_rx(skb); | ||
43 | } | 52 | } |
44 | 53 | ||
45 | static inline void netpoll_poll_lock(struct net_device *dev) | 54 | static inline void netpoll_poll_lock(struct net_device *dev) |
46 | { | 55 | { |
47 | if (dev->np) { | 56 | if (dev->npinfo) { |
48 | spin_lock(&dev->np->poll_lock); | 57 | spin_lock(&dev->npinfo->poll_lock); |
49 | dev->np->poll_owner = smp_processor_id(); | 58 | dev->npinfo->poll_owner = smp_processor_id(); |
50 | } | 59 | } |
51 | } | 60 | } |
52 | 61 | ||
53 | static inline void netpoll_poll_unlock(struct net_device *dev) | 62 | static inline void netpoll_poll_unlock(struct net_device *dev) |
54 | { | 63 | { |
55 | if (dev->np) { | 64 | if (dev->npinfo) { |
56 | dev->np->poll_owner = -1; | 65 | dev->npinfo->poll_owner = -1; |
57 | spin_unlock(&dev->np->poll_lock); | 66 | spin_unlock(&dev->npinfo->poll_lock); |
58 | } | 67 | } |
59 | } | 68 | } |
60 | 69 | ||