diff mbox

[net-next-2.6] net: copy_rtnl_link_stats64() simplification

Message ID 1282585624.1879.103.camel@Joe-Laptop
State Rejected, archived
Delegated to: David Miller
Headers show

Commit Message

Joe Perches Aug. 23, 2010, 5:47 p.m. UTC
On Mon, 2010-08-23 at 19:14 +0200, Eric Dumazet wrote:
> No need to use a temporary struct rtnl_link_stats64 variable,
> just copy the source to skb buffer.
> 
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>

Maybe it's better to use the same argument style as copy_rtnl_link_stats

 net/core/rtnetlink.c |   36 ++++--------------------------------
 1 files changed, 4 insertions(+), 32 deletions(-)



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Ben Hutchings Aug. 23, 2010, 6:14 p.m. UTC | #1
On Mon, 2010-08-23 at 10:47 -0700, Joe Perches wrote:
> On Mon, 2010-08-23 at 19:14 +0200, Eric Dumazet wrote:
> > No need to use a temporary struct rtnl_link_stats64 variable,
> > just copy the source to skb buffer.
> > 
> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> 
> Maybe it's better to use the same argument style as copy_rtnl_link_stats
[...]

I believe the destination pointer is typed as void * because it may not
be naturally aligned for u64.

Ben.
Eric Dumazet Aug. 23, 2010, 6:17 p.m. UTC | #2
Le lundi 23 août 2010 à 10:47 -0700, Joe Perches a écrit :
> On Mon, 2010-08-23 at 19:14 +0200, Eric Dumazet wrote:
> > No need to use a temporary struct rtnl_link_stats64 variable,
> > just copy the source to skb buffer.
> > 
> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> 
> Maybe it's better to use the same argument style as copy_rtnl_link_stats
> 
>  net/core/rtnetlink.c |   36 ++++--------------------------------
>  1 files changed, 4 insertions(+), 32 deletions(-)
> 
> diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
> index f78d821..f8781db 100644
> --- a/net/core/rtnetlink.c
> +++ b/net/core/rtnetlink.c
> @@ -610,38 +610,10 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a,
>  	a->tx_compressed = b->tx_compressed;
>  }
>  
> -static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b)
> +static void copy_rtnl_link_stats64(struct rtnl_link_stats64 *a,
> +				   const struct rtnl_link_stats64 *b)
>  {



Nope, we have no quarantee of v being aligned on a u64

If you tell compiler first argument is a pointer to rtnl_link_stats64,
it might use 64bit stores and trap.



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller Aug. 24, 2010, 3:44 a.m. UTC | #3
From: Ben Hutchings <bhutchings@solarflare.com>
Date: Mon, 23 Aug 2010 19:14:52 +0100

> On Mon, 2010-08-23 at 10:47 -0700, Joe Perches wrote:
>> On Mon, 2010-08-23 at 19:14 +0200, Eric Dumazet wrote:
>> > No need to use a temporary struct rtnl_link_stats64 variable,
>> > just copy the source to skb buffer.
>> > 
>> > Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
>> 
>> Maybe it's better to use the same argument style as copy_rtnl_link_stats
> [...]
> 
> I believe the destination pointer is typed as void * because it may not
> be naturally aligned for u64.

Exactly right.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index f78d821..f8781db 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -610,38 +610,10 @@  static void copy_rtnl_link_stats(struct rtnl_link_stats *a,
 	a->tx_compressed = b->tx_compressed;
 }
 
-static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b)
+static void copy_rtnl_link_stats64(struct rtnl_link_stats64 *a,
+				   const struct rtnl_link_stats64 *b)
 {
-	struct rtnl_link_stats64 a;
-
-	a.rx_packets = b->rx_packets;
-	a.tx_packets = b->tx_packets;
-	a.rx_bytes = b->rx_bytes;
-	a.tx_bytes = b->tx_bytes;
-	a.rx_errors = b->rx_errors;
-	a.tx_errors = b->tx_errors;
-	a.rx_dropped = b->rx_dropped;
-	a.tx_dropped = b->tx_dropped;
-
-	a.multicast = b->multicast;
-	a.collisions = b->collisions;
-
-	a.rx_length_errors = b->rx_length_errors;
-	a.rx_over_errors = b->rx_over_errors;
-	a.rx_crc_errors = b->rx_crc_errors;
-	a.rx_frame_errors = b->rx_frame_errors;
-	a.rx_fifo_errors = b->rx_fifo_errors;
-	a.rx_missed_errors = b->rx_missed_errors;
-
-	a.tx_aborted_errors = b->tx_aborted_errors;
-	a.tx_carrier_errors = b->tx_carrier_errors;
-	a.tx_fifo_errors = b->tx_fifo_errors;
-	a.tx_heartbeat_errors = b->tx_heartbeat_errors;
-	a.tx_window_errors = b->tx_window_errors;
-
-	a.rx_compressed = b->rx_compressed;
-	a.tx_compressed = b->tx_compressed;
-	memcpy(v, &a, sizeof(a));
+	memcpy(a, b, sizeof(*b));
 }
 
 /* All VF info */