gianfar: convert u64 status counters to atomic64_t
While looking at some asm dump for an unrelated change, Eric noticed in the following stats count increment code: 50b8: 81 3c 01 f8 lwz r9,504(r28) 50bc: 81 5c 01 fc lwz r10,508(r28) 50c0: 31 4a 00 01 addic r10,r10,1 50c4: 7d 29 01 94 addze r9,r9 50c8: 91 3c 01 f8 stw r9,504(r28) 50cc: 91 5c 01 fc stw r10,508(r28) that a 64 bit counter was used on ppc-32 without sync and hence the "ethtool -S" output was racy. Here we convert all the values to use atomic64_t so that the output will always be consistent. Reported-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
This commit is contained in:
@@ -627,24 +627,25 @@ struct rmon_mib
|
||||
};
|
||||
|
||||
struct gfar_extra_stats {
|
||||
u64 kernel_dropped;
|
||||
u64 rx_large;
|
||||
u64 rx_short;
|
||||
u64 rx_nonoctet;
|
||||
u64 rx_crcerr;
|
||||
u64 rx_overrun;
|
||||
u64 rx_bsy;
|
||||
u64 rx_babr;
|
||||
u64 rx_trunc;
|
||||
u64 eberr;
|
||||
u64 tx_babt;
|
||||
u64 tx_underrun;
|
||||
u64 rx_skbmissing;
|
||||
u64 tx_timeout;
|
||||
atomic64_t kernel_dropped;
|
||||
atomic64_t rx_large;
|
||||
atomic64_t rx_short;
|
||||
atomic64_t rx_nonoctet;
|
||||
atomic64_t rx_crcerr;
|
||||
atomic64_t rx_overrun;
|
||||
atomic64_t rx_bsy;
|
||||
atomic64_t rx_babr;
|
||||
atomic64_t rx_trunc;
|
||||
atomic64_t eberr;
|
||||
atomic64_t tx_babt;
|
||||
atomic64_t tx_underrun;
|
||||
atomic64_t rx_skbmissing;
|
||||
atomic64_t tx_timeout;
|
||||
};
|
||||
|
||||
#define GFAR_RMON_LEN ((sizeof(struct rmon_mib) - 16)/sizeof(u32))
|
||||
#define GFAR_EXTRA_STATS_LEN (sizeof(struct gfar_extra_stats)/sizeof(u64))
|
||||
#define GFAR_EXTRA_STATS_LEN \
|
||||
(sizeof(struct gfar_extra_stats)/sizeof(atomic64_t))
|
||||
|
||||
/* Number of stats exported via ethtool */
|
||||
#define GFAR_STATS_LEN (GFAR_RMON_LEN + GFAR_EXTRA_STATS_LEN)
|
||||
|
Reference in New Issue
Block a user