diff options
author | Tejun Heo <tj@kernel.org> | 2010-02-16 10:21:08 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-17 02:05:38 -0500 |
commit | 47d742752df4c1088589d4424840bc761613ab2a (patch) | |
tree | 186eec2c69a1f7149e08d354c36a34c21b58fa4f /drivers/net/loopback.c | |
parent | 7d720c3e4f0c4fc152a6bf17e24244a3c85412d2 (diff) |
percpu: add __percpu sparse annotations to net drivers
Add __percpu sparse annotations to net drivers.
These annotations are to make sparse consider percpu variables to be
in a different address space and warn if accessed without going
through percpu accessors. This patch doesn't affect normal builds.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: David S. Miller <davem@davemloft.net>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/loopback.c')
-rw-r--r-- | drivers/net/loopback.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c index b9fcc9819837..72b7949c91b1 100644 --- a/drivers/net/loopback.c +++ b/drivers/net/loopback.c | |||
@@ -72,7 +72,8 @@ struct pcpu_lstats { | |||
72 | static netdev_tx_t loopback_xmit(struct sk_buff *skb, | 72 | static netdev_tx_t loopback_xmit(struct sk_buff *skb, |
73 | struct net_device *dev) | 73 | struct net_device *dev) |
74 | { | 74 | { |
75 | struct pcpu_lstats *pcpu_lstats, *lb_stats; | 75 | struct pcpu_lstats __percpu *pcpu_lstats; |
76 | struct pcpu_lstats *lb_stats; | ||
76 | int len; | 77 | int len; |
77 | 78 | ||
78 | skb_orphan(skb); | 79 | skb_orphan(skb); |
@@ -80,7 +81,7 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb, | |||
80 | skb->protocol = eth_type_trans(skb, dev); | 81 | skb->protocol = eth_type_trans(skb, dev); |
81 | 82 | ||
82 | /* it's OK to use per_cpu_ptr() because BHs are off */ | 83 | /* it's OK to use per_cpu_ptr() because BHs are off */ |
83 | pcpu_lstats = dev->ml_priv; | 84 | pcpu_lstats = (void __percpu __force *)dev->ml_priv; |
84 | lb_stats = this_cpu_ptr(pcpu_lstats); | 85 | lb_stats = this_cpu_ptr(pcpu_lstats); |
85 | 86 | ||
86 | len = skb->len; | 87 | len = skb->len; |
@@ -95,14 +96,14 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb, | |||
95 | 96 | ||
96 | static struct net_device_stats *loopback_get_stats(struct net_device *dev) | 97 | static struct net_device_stats *loopback_get_stats(struct net_device *dev) |
97 | { | 98 | { |
98 | const struct pcpu_lstats *pcpu_lstats; | 99 | const struct pcpu_lstats __percpu *pcpu_lstats; |
99 | struct net_device_stats *stats = &dev->stats; | 100 | struct net_device_stats *stats = &dev->stats; |
100 | unsigned long bytes = 0; | 101 | unsigned long bytes = 0; |
101 | unsigned long packets = 0; | 102 | unsigned long packets = 0; |
102 | unsigned long drops = 0; | 103 | unsigned long drops = 0; |
103 | int i; | 104 | int i; |
104 | 105 | ||
105 | pcpu_lstats = dev->ml_priv; | 106 | pcpu_lstats = (void __percpu __force *)dev->ml_priv; |
106 | for_each_possible_cpu(i) { | 107 | for_each_possible_cpu(i) { |
107 | const struct pcpu_lstats *lb_stats; | 108 | const struct pcpu_lstats *lb_stats; |
108 | 109 | ||
@@ -135,19 +136,20 @@ static const struct ethtool_ops loopback_ethtool_ops = { | |||
135 | 136 | ||
136 | static int loopback_dev_init(struct net_device *dev) | 137 | static int loopback_dev_init(struct net_device *dev) |
137 | { | 138 | { |
138 | struct pcpu_lstats *lstats; | 139 | struct pcpu_lstats __percpu *lstats; |
139 | 140 | ||
140 | lstats = alloc_percpu(struct pcpu_lstats); | 141 | lstats = alloc_percpu(struct pcpu_lstats); |
141 | if (!lstats) | 142 | if (!lstats) |
142 | return -ENOMEM; | 143 | return -ENOMEM; |
143 | 144 | ||
144 | dev->ml_priv = lstats; | 145 | dev->ml_priv = (void __force *)lstats; |
145 | return 0; | 146 | return 0; |
146 | } | 147 | } |
147 | 148 | ||
148 | static void loopback_dev_free(struct net_device *dev) | 149 | static void loopback_dev_free(struct net_device *dev) |
149 | { | 150 | { |
150 | struct pcpu_lstats *lstats = dev->ml_priv; | 151 | struct pcpu_lstats __percpu *lstats = |
152 | (void __percpu __force *)dev->ml_priv; | ||
151 | 153 | ||
152 | free_percpu(lstats); | 154 | free_percpu(lstats); |
153 | free_netdev(dev); | 155 | free_netdev(dev); |