net: loopback driver cleanup
authorEric Dumazet <eric.dumazet@gmail.com>
Thu, 23 Sep 2010 23:51:51 +0000 (23:51 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 27 Sep 2010 02:04:08 +0000 (19:04 -0700)
loopback driver uses dev->ml_priv to store its percpu stats pointer.
It uses ugly casts "(void __percpu __force *)" to shut up sparse
complains.

Define an union to better document we use ml_priv in loopback driver and
define a lstats field with appropriate types.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/loopback.c
include/linux/netdevice.h

index 9a0996795321b327353e7a6d28cf94a308876c01..4b0e30b564e55fc0809a542b861747e1f354c19b 100644 (file)
@@ -74,7 +74,6 @@ struct pcpu_lstats {
 static netdev_tx_t loopback_xmit(struct sk_buff *skb,
                                 struct net_device *dev)
 {
-       struct pcpu_lstats __percpu *pcpu_lstats;
        struct pcpu_lstats *lb_stats;
        int len;
 
@@ -83,8 +82,7 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb,
        skb->protocol = eth_type_trans(skb, dev);
 
        /* it's OK to use per_cpu_ptr() because BHs are off */
-       pcpu_lstats = (void __percpu __force *)dev->ml_priv;
-       lb_stats = this_cpu_ptr(pcpu_lstats);
+       lb_stats = this_cpu_ptr(dev->lstats);
 
        len = skb->len;
        if (likely(netif_rx(skb) == NET_RX_SUCCESS)) {
@@ -101,19 +99,17 @@ static netdev_tx_t loopback_xmit(struct sk_buff *skb,
 static struct rtnl_link_stats64 *loopback_get_stats64(struct net_device *dev,
                                                      struct rtnl_link_stats64 *stats)
 {
-       const struct pcpu_lstats __percpu *pcpu_lstats;
        u64 bytes = 0;
        u64 packets = 0;
        u64 drops = 0;
        int i;
 
-       pcpu_lstats = (void __percpu __force *)dev->ml_priv;
        for_each_possible_cpu(i) {
                const struct pcpu_lstats *lb_stats;
                u64 tbytes, tpackets;
                unsigned int start;
 
-               lb_stats = per_cpu_ptr(pcpu_lstats, i);
+               lb_stats = per_cpu_ptr(dev->lstats, i);
                do {
                        start = u64_stats_fetch_begin(&lb_stats->syncp);
                        tbytes = lb_stats->bytes;
@@ -147,22 +143,16 @@ static const struct ethtool_ops loopback_ethtool_ops = {
 
 static int loopback_dev_init(struct net_device *dev)
 {
-       struct pcpu_lstats __percpu *lstats;
-
-       lstats = alloc_percpu(struct pcpu_lstats);
-       if (!lstats)
+       dev->lstats = alloc_percpu(struct pcpu_lstats);
+       if (!dev->lstats)
                return -ENOMEM;
 
-       dev->ml_priv = (void __force *)lstats;
        return 0;
 }
 
 static void loopback_dev_free(struct net_device *dev)
 {
-       struct pcpu_lstats __percpu *lstats =
-               (void __percpu __force *)dev->ml_priv;
-
-       free_percpu(lstats);
+       free_percpu(dev->lstats);
        free_netdev(dev);
 }
 
index 45dcda5bfda9d3db2d56969a4f2521687f4835bc..01bd4c82d982a525fc0e8de915e668c975ce9560 100644 (file)
@@ -1050,8 +1050,10 @@ struct net_device {
 #endif
 
        /* mid-layer private */
-       void                    *ml_priv;
-
+       union {
+               void                            *ml_priv;
+               struct pcpu_lstats __percpu     *lstats; /* loopback stats */
+       };
        /* GARP */
        struct garp_port        *garp_port;