From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.tuxdriver.com (charlotte.tuxdriver.com [70.61.120.58]) by dpdk.org (Postfix) with ESMTP id 802312A61 for ; Sun, 1 Feb 2015 15:26:08 +0100 (CET) Received: from [2001:470:8:a08:215:ff:fecc:4872] (helo=localhost) by smtp.tuxdriver.com with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.63) (envelope-from ) id 1YHvTL-00087L-HN; Sun, 01 Feb 2015 09:26:06 -0500 Date: Sun, 1 Feb 2015 09:25:53 -0500 From: Neil Horman To: Stephen Hemminger Message-ID: <20150201142553.GB3141@localhost.localdomain> References: <1422785031-11494-1-git-send-email-stephen@networkplumber.org> <1422785031-11494-4-git-send-email-stephen@networkplumber.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422785031-11494-4-git-send-email-stephen@networkplumber.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Score: -2.9 (--) X-Spam-Status: No Cc: dev@dpdk.org, Stephen Hemminger Subject: Re: [dpdk-dev] [PATCH 4/7] rte_sched: don't clear statistics when read X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 01 Feb 2015 14:26:08 -0000 On Sun, Feb 01, 2015 at 10:03:48AM +0000, Stephen Hemminger wrote: > From: Stephen Hemminger > > Make rte_sched statistics API work like the ethernet statistics API. > Don't auto-clear statistics. > > Signed-off-by: Stephen Hemminger > --- > lib/librte_sched/rte_sched.c | 30 ++++++++++++++++++++++++++++++ > lib/librte_sched/rte_sched.h | 29 +++++++++++++++++++++++++++++ > 2 files changed, 59 insertions(+) > > diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c > index 8cb8bf1..d891e50 100644 > --- a/lib/librte_sched/rte_sched.c > +++ b/lib/librte_sched/rte_sched.c > @@ -935,6 +935,21 @@ rte_sched_subport_read_stats(struct rte_sched_port *port, > } > > int > +rte_sched_subport_stats_reset(struct rte_sched_port *port, > + uint32_t subport_id) > +{ > + struct rte_sched_subport *s; > + > + /* Check user parameters */ > + if (port == NULL || subport_id >= port->n_subports_per_port) > + return -1; > + > + s = port->subport + subport_id; > + memset(&s->stats, 0, sizeof(struct rte_sched_subport_stats)); Its like this in the current implementation as well, but isn't this a bit racy? Like if we're clearning the stats while another thread is polling the interface? Would it be worth implementing a toggle mechanism whereby a reset does an atomic cmpxch on the stats pointer between two stats copies, then zeroing the exchanged copy? Neil > + return 0; > +} > + > +int > rte_sched_queue_read_stats(struct rte_sched_port *port, > uint32_t queue_id, > struct rte_sched_queue_stats *stats, > @@ -963,6 +978,21 @@ rte_sched_queue_read_stats(struct rte_sched_port *port, > return 0; > } > > +int > +rte_sched_queue_stats_reset(struct rte_sched_port *port, > + uint32_t queue_id) > +{ > + struct rte_sched_queue_extra *qe; > + > + /* Check user parameters */ > + if (port == NULL || queue_id >= rte_sched_port_queues_per_port(port)) > + return -1; > + > + qe = port->queue_extra + queue_id; > + memset(&qe->stats, 0, sizeof(struct rte_sched_queue_stats)); > + return 0; > +} > + > static inline uint32_t > rte_sched_port_qindex(struct rte_sched_port *port, uint32_t subport, uint32_t pipe, uint32_t traffic_class, uint32_t queue) > { > diff --git a/lib/librte_sched/rte_sched.h b/lib/librte_sched/rte_sched.h > index d5a1d5b..64b4dd6 100644 > --- a/lib/librte_sched/rte_sched.h > +++ b/lib/librte_sched/rte_sched.h > @@ -316,6 +316,21 @@ rte_sched_subport_read_stats(struct rte_sched_port *port, > struct rte_sched_subport_stats *stats, > uint32_t *tc_ov); > > + > +/** > + * Hierarchical scheduler subport statistics reset > + * > + * @param port > + * Handle to port scheduler instance > + * @param subport_id > + * Subport ID > + * @return > + * 0 upon success, error code otherwise > + */ > +int > +rte_sched_subport_stats_reset(struct rte_sched_port *port, > + uint32_t subport_id); > + > /** > * Hierarchical scheduler queue statistics read > * > @@ -337,6 +352,20 @@ rte_sched_queue_read_stats(struct rte_sched_port *port, > struct rte_sched_queue_stats *stats, > uint16_t *qlen); > > +/** > + * Hierarchical scheduler queue statistics reset > + * > + * @param port > + * Handle to port scheduler instance > + * @param queue_id > + * Queue ID within port scheduler > + * @return > + * 0 upon success, error code otherwise > + */ > +int > +rte_sched_queue_stats_reset(struct rte_sched_port *port, > + uint32_t queue_id); > + > /* > * Run-time > * > -- > 2.1.4 > >