]> Pileus Git - ~andy/linux/commitdiff
etherdevice: Use ether_addr_copy to copy an Ethernet address
authorJoe Perches <joe@perches.com>
Tue, 14 Jan 2014 23:18:47 +0000 (15:18 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Jan 2014 23:39:33 +0000 (15:39 -0800)
Some systems can use the normally known u16 alignment of
Ethernet addresses to save some code/text bytes and cycles.

This does not change currently emitted code on x86 by gcc 4.8.

Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/etherdevice.h

index f344ac04f858bc7fa8789827fed9d02770b12fab..9c5529dc6d0776b83888a3e77c0268e00e8f6585 100644 (file)
@@ -217,6 +217,28 @@ static inline void eth_hw_addr_random(struct net_device *dev)
        eth_random_addr(dev->dev_addr);
 }
 
+/**
+ * ether_addr_copy - Copy an Ethernet address
+ * @dst: Pointer to a six-byte array Ethernet address destination
+ * @src: Pointer to a six-byte array Ethernet address source
+ *
+ * Please note: dst & src must both be aligned to u16.
+ */
+static inline void ether_addr_copy(u8 *dst, const u8 *src)
+{
+#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
+       *(u32 *)dst = *(const u32 *)src;
+       *(u16 *)(dst + 4) = *(const u16 *)(src + 4);
+#else
+       u16 *a = (u16 *)dst;
+       const u16 *b = (const u16 *)src;
+
+       a[0] = b[0];
+       a[1] = b[1];
+       a[2] = b[2];
+#endif
+}
+
 /**
  * eth_hw_addr_inherit - Copy dev_addr from another net_device
  * @dst: pointer to net_device to copy dev_addr to
@@ -229,7 +251,7 @@ static inline void eth_hw_addr_inherit(struct net_device *dst,
                                       struct net_device *src)
 {
        dst->addr_assign_type = src->addr_assign_type;
-       memcpy(dst->dev_addr, src->dev_addr, ETH_ALEN);
+       ether_addr_copy(dst->dev_addr, src->dev_addr);
 }
 
 /**