From: "Dumitrescu, Cristian" <cristian.dumitrescu@intel.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: "dev@dpdk.org" <dev@dpdk.org>, Stephen Hemminger <shemming@brocade.com>
Subject: Re: [dpdk-dev] [PATCH v2 5/6] rte_sched: allow reading statistics without clearing
Date: Mon, 16 Mar 2015 20:00:00 +0000 [thread overview]
Message-ID: <3EB4FA525960D640B5BDFFD6A3D8912632323558@IRSMSX108.ger.corp.intel.com> (raw)
In-Reply-To: <1426004018-25948-6-git-send-email-stephen@networkplumber.org>
> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Tuesday, March 10, 2015 4:14 PM
> To: Dumitrescu, Cristian
> Cc: dev@dpdk.org; Stephen Hemminger; Stephen Hemminger
> Subject: [PATCH v2 5/6] rte_sched: allow reading statistics without clearing
>
> From: Stephen Hemminger <shemming@brocade.com>
>
> The rte_sched statistics API should allow reading statistics without
> clearing. Make auto-clear optional.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> v2 -- change to flag for clear from separate read/clear
>
> app/test/test_sched.c | 4 ++--
> examples/qos_sched/stats.c | 16 +++++++++++-----
> lib/librte_sched/rte_sched.c | 44 ++++++++++++++++++++++-----------------
> -----
> lib/librte_sched/rte_sched.h | 18 ++++++++++--------
> 4 files changed, 45 insertions(+), 37 deletions(-)
>
> diff --git a/app/test/test_sched.c b/app/test/test_sched.c
> index 60c62de..3c9c9e3 100644
> --- a/app/test/test_sched.c
> +++ b/app/test/test_sched.c
> @@ -208,13 +208,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..88caa54 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;
> }
> }
> diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
> index 2071414..74d0e0a 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 e9bf18a..f0bf088 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
Acked by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
next prev parent reply other threads:[~2015-03-16 20:00 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-10 16:13 [dpdk-dev] [PATCH v2 0/6] sched: bugfixes and enhancements Stephen Hemminger
2015-03-10 16:13 ` [dpdk-dev] [PATCH v2 1/6] rte_sched: don't put tabs in log messages Stephen Hemminger
2015-03-10 16:13 ` [dpdk-dev] [PATCH v2 2/6] rte_sched: make RED optional at runtime Stephen Hemminger
2015-03-10 16:13 ` [dpdk-dev] [PATCH v2 3/6] rte_sched: expand scheduler hierarchy for more VLAN's Stephen Hemminger
2015-03-10 16:13 ` [dpdk-dev] [PATCH v2 4/6] rte_sched: keep track of RED drops Stephen Hemminger
2015-03-10 16:13 ` [dpdk-dev] [PATCH v2 5/6] rte_sched: allow reading statistics without clearing Stephen Hemminger
2015-03-12 19:28 ` Dumitrescu, Cristian
2015-03-12 23:06 ` Stephen Hemminger
2015-03-16 19:58 ` Dumitrescu, Cristian
2015-03-16 20:11 ` Stephen Hemminger
2015-03-16 20:21 ` Dumitrescu, Cristian
2015-03-16 20:33 ` Stephen Hemminger
2015-03-16 20:00 ` Dumitrescu, Cristian [this message]
2015-03-10 16:13 ` [dpdk-dev] [PATCH v2 6/6] rte_sched: eliminate floating point in calculating byte clock Stephen Hemminger
2015-03-12 19:06 ` Dumitrescu, Cristian
2015-03-12 23:09 ` Stephen Hemminger
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=3EB4FA525960D640B5BDFFD6A3D8912632323558@IRSMSX108.ger.corp.intel.com \
--to=cristian.dumitrescu@intel.com \
--cc=dev@dpdk.org \
--cc=shemming@brocade.com \
--cc=stephen@networkplumber.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).