tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Per-cpu stats for network interfaces
> On Jan 27, 2020, at 1:57 AM, Kengo NAKAHARA <k-nakahara%iij.ad.jp@localhost> wrote:
>
> I think it is better for device drivers to use new API such as
> ====================
> uint64_t *stats = IF_STAT_GETREF(ifp);
> if_statadd_ref(stats, if_collisions, CSR_READ(sc, WMREG_COLC)); // new API
> // some more code
> IF_STAT_PUTREF(ifp);
> ====================
> instead of such as
> ====================
> uint64_t *stats = IF_STAT_GETREF(ifp);
> stats[IF_STAT_COLLISIONS] += CSR_READ(sc, WMREG_COLC);
> // some more code
> IF_STAT_PUTREF(ifp);
> ====================
> code, because that can hide both 64bit counter in 32bit architecture
> atomicity issue and memory ordering issue from device drivers.
>
> It seems "__IF_STATS_PERCPU" is not defined. "__IF_STATS_PERCPU" is
> defined when MULTIPROCESSOR is defined, isn't it?
>
> For other parts, looks good to me. Thank you for your reworks!
>
> By the way, it would be helpful to add new API which add both packets
> counter and bytes counter. Thought?
Thanks for your feedback! I've incorporated your suggestions. The pattern now actually looks like:
net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
if_statinc_ref(nsr, if_opackets);
// ...etc.
IF_STAT_PUTREF(ifp);
net_stat_ref_t is a new opaque type declared in <sys/net_stats.h> to prevent anything subscripting it directly.
I have also added if_statadd2() for handling the very common pattern of bytes & packets in several places, e.g. instead of this:
net_stat_ref_t nsr = IF_STAT_GETREF(ifp);
if_statinc_ref(nsr, if_ipackets);
if_statadd_ref(nsr, if_ibytes, m0->m_pkthdr.len);
IF_STAT_PUTREF(ifp);
...it's just this:
if_statadd2(ifp, if_ipackets, 1, if_ibytes, m0->m_pkthdr.len);
I also simplified a few other bits, but other than the mechanical changes noted here, it's basically unchanged and I think ready to go.
My integration plan:
1- Check in the basic if_stats.[ch] and if.[ch] changes. Leave percpu stats *disabled* for now.
2- Check in covered drivers a few at a time, testing as many as I can for correct behavior. The changes are very mechanical, and so easy to audit.
3- Finish converting some of the harder drivers that play nasty tricks with the existing if_data stats.
4- Verify all ports build releases correctly.
5- Flip the switch to enable percpu counters.
-- thorpej
Home |
Main Index |
Thread Index |
Old Index