From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH 4/6] rte_sched: allow reading without clearing
Date: Mon, 11 May 2015 10:07:49 -0700 [thread overview]
Message-ID: <1431364071-27298-5-git-send-email-stephen@networkplumber.org> (raw)
In-Reply-To: <1431364071-27298-1-git-send-email-stephen@networkplumber.org>
The rte_sched statistics API should allow reading statistics without
clearing. Make auto-clear optional.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
app/test/test_sched.c | 4 ++--
examples/qos_sched/stats.c | 22 +++++++++++++++-------
lib/librte_sched/rte_sched.c | 44 ++++++++++++++++++++++----------------------
lib/librte_sched/rte_sched.h | 18 ++++++++++--------
4 files changed, 49 insertions(+), 39 deletions(-)
diff --git a/app/test/test_sched.c b/app/test/test_sched.c
index c7239f8..1526ad7 100644
--- a/app/test/test_sched.c
+++ b/app/test/test_sched.c
@@ -198,13 +198,13 @@ test_sched(void)
struct rte_sched_subport_stats subport_stats;
uint32_t tc_ov;
- rte_sched_subport_read_stats(port, SUBPORT, &subport_stats, &tc_ov);
+ rte_sched_subport_read_stats(port, SUBPORT, &subport_stats, &tc_ov, 1);
#if 0
TEST_ASSERT_EQUAL(subport_stats.n_pkts_tc[TC-1], 10, "Wrong subport stats\n");
#endif
struct rte_sched_queue_stats queue_stats;
uint16_t qlen;
- rte_sched_queue_read_stats(port, QUEUE, &queue_stats, &qlen);
+ rte_sched_queue_read_stats(port, QUEUE, &queue_stats, &qlen, 1);
#if 0
TEST_ASSERT_EQUAL(queue_stats.n_pkts, 10, "Wrong queue stats\n");
#endif
diff --git a/examples/qos_sched/stats.c b/examples/qos_sched/stats.c
index b4db7b5..a6d05ab 100644
--- a/examples/qos_sched/stats.c
+++ b/examples/qos_sched/stats.c
@@ -61,7 +61,7 @@ qavg_q(uint8_t port_id, uint32_t subport_id, uint32_t pipe_id, uint8_t tc, uint8
average = 0;
for (count = 0; count < qavg_ntimes; count++) {
- rte_sched_queue_read_stats(port, queue_id, &stats, &qlen);
+ rte_sched_queue_read_stats(port, queue_id, &stats, &qlen, 1);
average += qlen;
usleep(qavg_period);
}
@@ -99,7 +99,9 @@ qavg_tcpipe(uint8_t port_id, uint32_t subport_id, uint32_t pipe_id, uint8_t tc)
for (count = 0; count < qavg_ntimes; count++) {
part_average = 0;
for (i = 0; i < RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS; i++) {
- rte_sched_queue_read_stats(port, queue_id + (tc * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + i), &stats, &qlen);
+ rte_sched_queue_read_stats(port,
+ queue_id + (tc * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + i),
+ &stats, &qlen, 1);
part_average += qlen;
}
average += part_average / RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS;
@@ -138,7 +140,8 @@ qavg_pipe(uint8_t port_id, uint32_t subport_id, uint32_t pipe_id)
for (count = 0; count < qavg_ntimes; count++) {
part_average = 0;
for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS; i++) {
- rte_sched_queue_read_stats(port, queue_id + i, &stats, &qlen);
+ rte_sched_queue_read_stats(port, queue_id + i,
+ &stats, &qlen, 1);
part_average += qlen;
}
average += part_average / (RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS);
@@ -178,7 +181,9 @@ qavg_tcsubport(uint8_t port_id, uint32_t subport_id, uint8_t tc)
queue_id = RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS * (subport_id * port_params.n_pipes_per_subport + i);
for (j = 0; j < RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS; j++) {
- rte_sched_queue_read_stats(port, queue_id + (tc * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + j), &stats, &qlen);
+ rte_sched_queue_read_stats(port,
+ queue_id + (tc * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + j),
+ &stats, &qlen, 1);
part_average += qlen;
}
}
@@ -220,7 +225,8 @@ qavg_subport(uint8_t port_id, uint32_t subport_id)
queue_id = RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS * (subport_id * port_params.n_pipes_per_subport + i);
for (j = 0; j < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS; j++) {
- rte_sched_queue_read_stats(port, queue_id + j, &stats, &qlen);
+ rte_sched_queue_read_stats(port, queue_id + j,
+ &stats, &qlen, 1);
part_average += qlen;
}
}
@@ -254,7 +260,7 @@ subport_stat(uint8_t port_id, uint32_t subport_id)
port = qos_conf[i].sched_port;
memset (tc_ov, 0, sizeof(tc_ov));
- rte_sched_subport_read_stats(port, subport_id, &stats, tc_ov);
+ rte_sched_subport_read_stats(port, subport_id, &stats, tc_ov, 0);
printf("\n");
printf("+----+-------------+-------------+-------------+-------------+-------------+\n");
@@ -300,7 +306,9 @@ pipe_stat(uint8_t port_id, uint32_t subport_id, uint32_t pipe_id)
for (i = 0; i < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; i++) {
for (j = 0; j < RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS; j++) {
- rte_sched_queue_read_stats(port, queue_id + (i * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + j), &stats, &qlen);
+ rte_sched_queue_read_stats(port,
+ queue_id + (i * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + j),
+ &stats, &qlen, 0);
printf("| %d | %d | %11" PRIu32 " | %11" PRIu32 " | %11" PRIu32 " | %11" PRIu32 " | %11i |\n", i, j,
stats.n_pkts, stats.n_pkts_dropped, stats.n_bytes, stats.n_bytes_dropped, qlen);
diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
index c044c09..74b3111 100644
--- a/lib/librte_sched/rte_sched.c
+++ b/lib/librte_sched/rte_sched.c
@@ -909,56 +909,56 @@ rte_sched_pipe_config(struct rte_sched_port *port,
int
rte_sched_subport_read_stats(struct rte_sched_port *port,
- uint32_t subport_id,
- struct rte_sched_subport_stats *stats,
- uint32_t *tc_ov)
+ uint32_t subport_id,
+ struct rte_sched_subport_stats *stats,
+ uint32_t *tc_ov, int clear)
{
struct rte_sched_subport *s;
/* Check user parameters */
- if ((port == NULL) ||
- (subport_id >= port->n_subports_per_port) ||
- (stats == NULL) ||
- (tc_ov == NULL)) {
+ if (port == NULL || subport_id >= port->n_subports_per_port)
return -1;
- }
+
s = port->subport + subport_id;
/* Copy subport stats and clear */
- memcpy(stats, &s->stats, sizeof(struct rte_sched_subport_stats));
- memset(&s->stats, 0, sizeof(struct rte_sched_subport_stats));
+ if (stats)
+ *stats = s->stats;
+ if (clear)
+ memset(&s->stats, 0, sizeof(struct rte_sched_subport_stats));
/* Subport TC ovesubscription status */
- *tc_ov = s->tc_ov;
+ if (tc_ov)
+ *tc_ov = s->tc_ov;
return 0;
}
int
rte_sched_queue_read_stats(struct rte_sched_port *port,
- uint32_t queue_id,
- struct rte_sched_queue_stats *stats,
- uint16_t *qlen)
+ uint32_t queue_id,
+ struct rte_sched_queue_stats *stats,
+ uint16_t *qlen, int clear)
{
struct rte_sched_queue *q;
struct rte_sched_queue_extra *qe;
/* Check user parameters */
- if ((port == NULL) ||
- (queue_id >= rte_sched_port_queues_per_port(port)) ||
- (stats == NULL) ||
- (qlen == NULL)) {
+ if (port == NULL || queue_id >= rte_sched_port_queues_per_port(port))
return -1;
- }
+
q = port->queue + queue_id;
qe = port->queue_extra + queue_id;
/* Copy queue stats and clear */
- memcpy(stats, &qe->stats, sizeof(struct rte_sched_queue_stats));
- memset(&qe->stats, 0, sizeof(struct rte_sched_queue_stats));
+ if (stats)
+ *stats = qe->stats;
+ if (clear)
+ memset(&qe->stats, 0, sizeof(struct rte_sched_queue_stats));
/* Queue length */
- *qlen = q->qw - q->qr;
+ if (qlen)
+ *qlen = q->qw - q->qr;
return 0;
}
diff --git a/lib/librte_sched/rte_sched.h b/lib/librte_sched/rte_sched.h
index 3fd1fe1..dff7f85 100644
--- a/lib/librte_sched/rte_sched.h
+++ b/lib/librte_sched/rte_sched.h
@@ -308,14 +308,15 @@ rte_sched_port_get_memory_footprint(struct rte_sched_port_params *params);
* @param tc_ov
* Pointer to pre-allocated 4-entry array where the oversubscription status for
* each of the 4 subport traffic classes should be stored.
+ * @parm clear
+ * Reset statistics after read
* @return
* 0 upon success, error code otherwise
*/
int
-rte_sched_subport_read_stats(struct rte_sched_port *port,
- uint32_t subport_id,
- struct rte_sched_subport_stats *stats,
- uint32_t *tc_ov);
+rte_sched_subport_read_stats(struct rte_sched_port *port, uint32_t subport_id,
+ struct rte_sched_subport_stats *stats,
+ uint32_t *tc_ov, int clear);
/**
* Hierarchical scheduler queue statistics read
@@ -329,14 +330,15 @@ rte_sched_subport_read_stats(struct rte_sched_port *port,
* counters should be stored
* @param qlen
* Pointer to pre-allocated variable where the current queue length should be stored.
+ * @parm clear
+ * Reset statistics after read
* @return
* 0 upon success, error code otherwise
*/
int
-rte_sched_queue_read_stats(struct rte_sched_port *port,
- uint32_t queue_id,
- struct rte_sched_queue_stats *stats,
- uint16_t *qlen);
+rte_sched_queue_read_stats(struct rte_sched_port *port, uint32_t queue_id,
+ struct rte_sched_queue_stats *stats,
+ uint16_t *qlen, int clear);
/*
* Run-time
--
2.1.4
next prev parent reply other threads:[~2015-05-11 17:07 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-11 17:07 [dpdk-dev] [PATCH v3 0/6] rte_sched: cleanups and API changes Stephen Hemminger
2015-05-11 17:07 ` [dpdk-dev] [PATCH 1/6] rte_sched: make RED optional at runtime Stephen Hemminger
2015-05-11 17:07 ` [dpdk-dev] [PATCH 2/6] rte_sched: expand scheduler hierarchy for more VLAN's Stephen Hemminger
2015-05-11 17:20 ` Neil Horman
[not found] ` <8edea4c81f624728bb5f0476b680c410@BRMWP-EXMB11.corp.brocade.com>
2015-05-11 17:32 ` Stephen Hemminger
2015-05-11 17:43 ` Neil Horman
2015-05-11 17:07 ` [dpdk-dev] [PATCH 3/6] rte_sched: keep track of RED drops Stephen Hemminger
2015-05-11 17:07 ` Stephen Hemminger [this message]
2015-05-11 17:07 ` [dpdk-dev] [PATCH 5/6] rte_sched: don't put tabs in log messages Stephen Hemminger
2015-05-11 17:07 ` [dpdk-dev] [PATCH 6/6] rte_sched: use correct log level Stephen Hemminger
2015-05-12 13:20 ` [dpdk-dev] [PATCH v3 0/6] rte_sched: cleanups and API changes Thomas Monjalon
-- strict thread matches above, loose matches on Subject: below --
2015-04-29 17:04 [dpdk-dev] [PATCH 0/6] rte_sched: patches against 2.o Stephen Hemminger
2015-04-29 17:04 ` [dpdk-dev] [PATCH 4/6] rte_sched: allow reading without clearing Stephen Hemminger
2015-05-11 12:53 ` Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1431364071-27298-5-git-send-email-stephen@networkplumber.org \
--to=stephen@networkplumber.org \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).