Subject: Re: [PATCH net] bonding: fix bond_get_stats()

From: Nikolay Aleksandrov <[email-masked]>
Date: Fri, 18 Mar 2016 12:26:44 +0100

On 03/18/2016 01:23 AM, Eric Dumazet wrote:
> From: Eric Dumazet <[email-masked]>
> 
> bond_get_stats() can be called from rtnetlink (with RTNL held)
> or from /proc/net/dev seq handler (with RCU held)
> 
> The logic added in commit 5f0c5f73e5ef ("bonding: make global bonding
> stats more reliable") kind of assumed only one cpu could run there.
> 
> If multiple threads are reading /proc/net/dev, stats can be really
> messed up after a while.
> 
> A second problem is that some fields are 32bit, so we need to properly
> handle the wrap around problem.
> 
> Given that RTNL is not always held, we need to use
> bond_for_each_slave_rcu().
> 
> Fixes: 5f0c5f73e5ef ("bonding: make global bonding stats more reliable")
> Signed-off-by: Eric Dumazet <[email-masked]>
> Cc: Andy Gospodarek <[email-masked]>
> Cc: Jay Vosburgh <[email-masked]>
> Cc: Veaceslav Falico <[email-masked]>
> ---
>  drivers/net/bonding/bond_main.c |   66 +++++++++++++++---------------
>  include/net/bonding.h           |    1 
>  2 files changed, 36 insertions(+), 31 deletions(-)
> 

Good catches! And the dev_get_stats() in bond_enslave is fine because the slave
is not yet linked thus can't collide with reading/updating the stats via procfs.

Reviewed-by: Nikolay Aleksandrov <[email-masked]>