net/core: Add new basic hardware counter
Add a new hardware specific basic counter, TCA_STATS_BASIC_HW. This can be used to count packets/bytes processed by hardware offload. Signed-off-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7ff2ea0bbf
commit
5e111210a4
|
@ -44,6 +44,10 @@ void __gnet_stats_copy_basic(const seqcount_t *running,
|
|||
struct gnet_stats_basic_packed *bstats,
|
||||
struct gnet_stats_basic_cpu __percpu *cpu,
|
||||
struct gnet_stats_basic_packed *b);
|
||||
int gnet_stats_copy_basic_hw(const seqcount_t *running,
|
||||
struct gnet_dump *d,
|
||||
struct gnet_stats_basic_cpu __percpu *cpu,
|
||||
struct gnet_stats_basic_packed *b);
|
||||
int gnet_stats_copy_rate_est(struct gnet_dump *d,
|
||||
struct net_rate_estimator __rcu **ptr);
|
||||
int gnet_stats_copy_queue(struct gnet_dump *d,
|
||||
|
|
|
@ -12,6 +12,7 @@ enum {
|
|||
TCA_STATS_APP,
|
||||
TCA_STATS_RATE_EST64,
|
||||
TCA_STATS_PAD,
|
||||
TCA_STATS_BASIC_HW,
|
||||
__TCA_STATS_MAX,
|
||||
};
|
||||
#define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
|
||||
|
|
|
@ -162,6 +162,34 @@ __gnet_stats_copy_basic(const seqcount_t *running,
|
|||
}
|
||||
EXPORT_SYMBOL(__gnet_stats_copy_basic);
|
||||
|
||||
int
|
||||
___gnet_stats_copy_basic(const seqcount_t *running,
|
||||
struct gnet_dump *d,
|
||||
struct gnet_stats_basic_cpu __percpu *cpu,
|
||||
struct gnet_stats_basic_packed *b,
|
||||
int type)
|
||||
{
|
||||
struct gnet_stats_basic_packed bstats = {0};
|
||||
|
||||
__gnet_stats_copy_basic(running, &bstats, cpu, b);
|
||||
|
||||
if (d->compat_tc_stats && type == TCA_STATS_BASIC) {
|
||||
d->tc_stats.bytes = bstats.bytes;
|
||||
d->tc_stats.packets = bstats.packets;
|
||||
}
|
||||
|
||||
if (d->tail) {
|
||||
struct gnet_stats_basic sb;
|
||||
|
||||
memset(&sb, 0, sizeof(sb));
|
||||
sb.bytes = bstats.bytes;
|
||||
sb.packets = bstats.packets;
|
||||
return gnet_stats_copy(d, type, &sb, sizeof(sb),
|
||||
TCA_STATS_PAD);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* gnet_stats_copy_basic - copy basic statistics into statistic TLV
|
||||
* @running: seqcount_t pointer
|
||||
|
@ -181,28 +209,35 @@ gnet_stats_copy_basic(const seqcount_t *running,
|
|||
struct gnet_stats_basic_cpu __percpu *cpu,
|
||||
struct gnet_stats_basic_packed *b)
|
||||
{
|
||||
struct gnet_stats_basic_packed bstats = {0};
|
||||
|
||||
__gnet_stats_copy_basic(running, &bstats, cpu, b);
|
||||
|
||||
if (d->compat_tc_stats) {
|
||||
d->tc_stats.bytes = bstats.bytes;
|
||||
d->tc_stats.packets = bstats.packets;
|
||||
}
|
||||
|
||||
if (d->tail) {
|
||||
struct gnet_stats_basic sb;
|
||||
|
||||
memset(&sb, 0, sizeof(sb));
|
||||
sb.bytes = bstats.bytes;
|
||||
sb.packets = bstats.packets;
|
||||
return gnet_stats_copy(d, TCA_STATS_BASIC, &sb, sizeof(sb),
|
||||
TCA_STATS_PAD);
|
||||
}
|
||||
return 0;
|
||||
return ___gnet_stats_copy_basic(running, d, cpu, b,
|
||||
TCA_STATS_BASIC);
|
||||
}
|
||||
EXPORT_SYMBOL(gnet_stats_copy_basic);
|
||||
|
||||
/**
|
||||
* gnet_stats_copy_basic_hw - copy basic hw statistics into statistic TLV
|
||||
* @running: seqcount_t pointer
|
||||
* @d: dumping handle
|
||||
* @cpu: copy statistic per cpu
|
||||
* @b: basic statistics
|
||||
*
|
||||
* Appends the basic statistics to the top level TLV created by
|
||||
* gnet_stats_start_copy().
|
||||
*
|
||||
* Returns 0 on success or -1 with the statistic lock released
|
||||
* if the room in the socket buffer was not sufficient.
|
||||
*/
|
||||
int
|
||||
gnet_stats_copy_basic_hw(const seqcount_t *running,
|
||||
struct gnet_dump *d,
|
||||
struct gnet_stats_basic_cpu __percpu *cpu,
|
||||
struct gnet_stats_basic_packed *b)
|
||||
{
|
||||
return ___gnet_stats_copy_basic(running, d, cpu, b,
|
||||
TCA_STATS_BASIC_HW);
|
||||
}
|
||||
EXPORT_SYMBOL(gnet_stats_copy_basic_hw);
|
||||
|
||||
/**
|
||||
* gnet_stats_copy_rate_est - copy rate estimator statistics into statistics TLV
|
||||
* @d: dumping handle
|
||||
|
|
Loading…
Reference in New Issue