Commit 5e111210 authored by Eelco Chaudron's avatar Eelco Chaudron Committed by David S. Miller

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: default avatarEelco Chaudron <echaudro@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7ff2ea0b
...@@ -44,6 +44,10 @@ void __gnet_stats_copy_basic(const seqcount_t *running, ...@@ -44,6 +44,10 @@ void __gnet_stats_copy_basic(const seqcount_t *running,
struct gnet_stats_basic_packed *bstats, struct gnet_stats_basic_packed *bstats,
struct gnet_stats_basic_cpu __percpu *cpu, struct gnet_stats_basic_cpu __percpu *cpu,
struct gnet_stats_basic_packed *b); 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, int gnet_stats_copy_rate_est(struct gnet_dump *d,
struct net_rate_estimator __rcu **ptr); struct net_rate_estimator __rcu **ptr);
int gnet_stats_copy_queue(struct gnet_dump *d, int gnet_stats_copy_queue(struct gnet_dump *d,
......
...@@ -12,6 +12,7 @@ enum { ...@@ -12,6 +12,7 @@ enum {
TCA_STATS_APP, TCA_STATS_APP,
TCA_STATS_RATE_EST64, TCA_STATS_RATE_EST64,
TCA_STATS_PAD, TCA_STATS_PAD,
TCA_STATS_BASIC_HW,
__TCA_STATS_MAX, __TCA_STATS_MAX,
}; };
#define TCA_STATS_MAX (__TCA_STATS_MAX - 1) #define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
......
...@@ -162,30 +162,18 @@ __gnet_stats_copy_basic(const seqcount_t *running, ...@@ -162,30 +162,18 @@ __gnet_stats_copy_basic(const seqcount_t *running,
} }
EXPORT_SYMBOL(__gnet_stats_copy_basic); EXPORT_SYMBOL(__gnet_stats_copy_basic);
/**
* gnet_stats_copy_basic - copy basic 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 int
gnet_stats_copy_basic(const seqcount_t *running, ___gnet_stats_copy_basic(const seqcount_t *running,
struct gnet_dump *d, struct gnet_dump *d,
struct gnet_stats_basic_cpu __percpu *cpu, struct gnet_stats_basic_cpu __percpu *cpu,
struct gnet_stats_basic_packed *b) struct gnet_stats_basic_packed *b,
int type)
{ {
struct gnet_stats_basic_packed bstats = {0}; struct gnet_stats_basic_packed bstats = {0};
__gnet_stats_copy_basic(running, &bstats, cpu, b); __gnet_stats_copy_basic(running, &bstats, cpu, b);
if (d->compat_tc_stats) { if (d->compat_tc_stats && type == TCA_STATS_BASIC) {
d->tc_stats.bytes = bstats.bytes; d->tc_stats.bytes = bstats.bytes;
d->tc_stats.packets = bstats.packets; d->tc_stats.packets = bstats.packets;
} }
...@@ -196,13 +184,60 @@ gnet_stats_copy_basic(const seqcount_t *running, ...@@ -196,13 +184,60 @@ gnet_stats_copy_basic(const seqcount_t *running,
memset(&sb, 0, sizeof(sb)); memset(&sb, 0, sizeof(sb));
sb.bytes = bstats.bytes; sb.bytes = bstats.bytes;
sb.packets = bstats.packets; sb.packets = bstats.packets;
return gnet_stats_copy(d, TCA_STATS_BASIC, &sb, sizeof(sb), return gnet_stats_copy(d, type, &sb, sizeof(sb),
TCA_STATS_PAD); TCA_STATS_PAD);
} }
return 0; return 0;
} }
/**
* gnet_stats_copy_basic - copy basic 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(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);
}
EXPORT_SYMBOL(gnet_stats_copy_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 * gnet_stats_copy_rate_est - copy rate estimator statistics into statistics TLV
* @d: dumping handle * @d: dumping handle
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment