From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-f66.google.com (mail-lf1-f66.google.com [209.85.167.66]) by dpdk.org (Postfix) with ESMTP id A629C235 for ; Mon, 23 Jul 2018 14:33:13 +0200 (CEST) Received: by mail-lf1-f66.google.com with SMTP id m12-v6so329823lfc.10 for ; Mon, 23 Jul 2018 05:33:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=93/bBYttnrTF3RXpfkpwhYJrqZPXMzvTvlUbyEs7SiY=; b=UVCH/qS2usKNG/NOpHxo+txS3AtjbDDE5SdGN75/VcpB+g/xRhufOEL4FBMUWWXdXn krAUSAIHzhvhscmIzc1HFVM5rZ6Une0QdkwtZyM5wPCAyS/W2V4Edc6FC03pFuPydYE4 nCDZg84yhqs8lkeREx7NhGTi0CkY9CHD5cnWaVJoADB7fbkubcEPjw6BDg1T6J/c9QoW ALvSEAR81M+OM3gyHzdBt7Nkjrh+gdh0Dtydw4ouvm4Qk8ACeOjn4mNfqOIBhP6+GobC Bkf8RflealVbLk6W5L0TJk0X8/iwOq29/WIy/cQ/6sypLpaJtwVYsYhhZ3oUw7enABYd ZD3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=93/bBYttnrTF3RXpfkpwhYJrqZPXMzvTvlUbyEs7SiY=; b=l9IeiHEjnX11jYaAC9ipLBi7yWmlfGK2pR/y2El7UdQX2KFwgXbcv7OfJTXv8Gu+HB 1K3BEeSOuzCuyRJzlToxJGx5+yPV2dySd2U7WNwlIjYCrd7TCYqZLT9cocKLCD30DGLc CfzNksPmi02ttBOYRG6rki8r5V2F5lcPsLWpP8owjUbUMgy3XVJMX+X4VHcnUjPeyceE tByBjo5t4vkuLq8+WVE4Es666VIneC4QNrPHEKRjzUOLuWsx7Zbyb4Ev29dcx0UagoT+ T93grJKih54pa9VmgykAsZ4yznMqGKNrV1UkElMyNVdDKYzAWm6ZEPUQ/K5z7Jz+zLBO 8o0A== X-Gm-Message-State: AOUpUlH3JZrBIOuBYn7bbbDta/PHQiofDYVhB8rjt73aqWMEosaH3mmz iI4y3A4Z3tUEd3wKyEa6H9A/Dvp+N+JI9e72vLs= X-Google-Smtp-Source: AAOMgpftH7o5yhu4vdsmMhd22e0ioVxFdEKt2OKSoVEvhyRErrwd3MPmOJ4Sf1ImcGcbADluWQbC+C6F37xH0SoF81I= X-Received: by 2002:a19:17c2:: with SMTP id 63-v6mr7009684lfx.112.1532349193102; Mon, 23 Jul 2018 05:33:13 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a19:978f:0:0:0:0:0 with HTTP; Mon, 23 Jul 2018 05:33:12 -0700 (PDT) In-Reply-To: <1531925499-938-1-git-send-email-alan.dewar@att.com> References: <1531925499-938-1-git-send-email-alan.dewar@att.com> From: Alan Robertson Date: Mon, 23 Jul 2018 13:33:12 +0100 Message-ID: To: alangordondewar@gmail.com Cc: "Dumitrescu, Cristian" , dev@dpdk.org, Alan Dewar Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH] sched: add 64-bit counter retrieval API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Jul 2018 12:33:13 -0000 Looks good to me. Alan. On Wed, Jul 18, 2018 at 3:51 PM, wrote: > From: Alan Dewar > > Add new APIs to retrieve counters in 64-bit wide fields. > > Signed-off-by: Alan Dewar > --- > lib/librte_sched/rte_sched.c | 72 ++++++++++++++++++++++++++++++++ > lib/librte_sched/rte_sched.h | 76 ++++++++++++++++++++++++++++++++++ > lib/librte_sched/rte_sched_version.map | 2 + > 3 files changed, 150 insertions(+) > > diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c > index 9269e5c..4396366 100644 > --- a/lib/librte_sched/rte_sched.c > +++ b/lib/librte_sched/rte_sched.c > @@ -1070,6 +1070,43 @@ rte_sched_subport_read_stats(struct rte_sched_port *port, > return 0; > } > > +int __rte_experimental > +rte_sched_subport_read_stats64(struct rte_sched_port *port, > + uint32_t subport_id, > + struct rte_sched_subport_stats64 *stats64, > + uint32_t *tc_ov) > +{ > + struct rte_sched_subport *s; > + uint32_t tc; > + > + /* Check user parameters */ > + if (port == NULL || subport_id >= port->n_subports_per_port || > + stats64 == NULL || tc_ov == NULL) > + return -1; > + > + s = port->subport + subport_id; > + > + /* Copy subport stats and clear */ > + for (tc = 0; tc < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; tc++) { > + stats64->n_pkts_tc[tc] = s->stats.n_pkts_tc[tc]; > + stats64->n_pkts_tc_dropped[tc] = > + s->stats.n_pkts_tc_dropped[tc]; > + stats64->n_bytes_tc[tc] = s->stats.n_bytes_tc[tc]; > + stats64->n_bytes_tc_dropped[tc] = > + s->stats.n_bytes_tc_dropped[tc]; > +#ifdef RTE_SCHED_RED > + stats64->n_pkts_red_dropped[tc] = > + s->stats.n_pkts_red_dropped[tc]; > +#endif > + } > + memset(&s->stats, 0, sizeof(struct rte_sched_subport_stats)); > + > + /* Subport TC oversubscription status */ > + *tc_ov = s->tc_ov; > + > + return 0; > +} > + > int > rte_sched_queue_read_stats(struct rte_sched_port *port, > uint32_t queue_id, > @@ -1099,6 +1136,41 @@ rte_sched_queue_read_stats(struct rte_sched_port *port, > return 0; > } > > +int __rte_experimental > +rte_sched_queue_read_stats64(struct rte_sched_port *port, > + uint32_t queue_id, > + struct rte_sched_queue_stats64 *stats64, > + uint16_t *qlen) > +{ > + 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)) || > + (stats64 == NULL) || > + (qlen == NULL)) { > + return -1; > + } > + q = port->queue + queue_id; > + qe = port->queue_extra + queue_id; > + > + /* Copy queue stats and clear */ > + stats64->n_pkts = qe->stats.n_pkts; > + stats64->n_pkts_dropped = qe->stats.n_pkts_dropped; > + stats64->n_bytes = qe->stats.n_bytes; > + stats64->n_bytes_dropped = qe->stats.n_bytes_dropped; > +#ifdef RTE_SCHED_RED > + stats64->n_pkts_red_dropped = qe->stats.n_pkts_red_dropped; > +#endif > + memset(&qe->stats, 0, sizeof(struct rte_sched_queue_stats)); > + > + /* Queue length */ > + *qlen = q->qw - q->qr; > + > + 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 84fa896..f37a4d6 100644 > --- a/lib/librte_sched/rte_sched.h > +++ b/lib/librte_sched/rte_sched.h > @@ -141,6 +141,25 @@ struct rte_sched_subport_stats { > #endif > }; > > +struct rte_sched_subport_stats64 { > + /* Packets */ > + uint64_t n_pkts_tc[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; > + /**< Number of packets successfully written */ > + uint64_t n_pkts_tc_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; > + /**< Number of packets dropped */ > + > + /* Bytes */ > + uint64_t n_bytes_tc[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; > + /**< Number of bytes successfully written for each traffic class */ > + uint64_t n_bytes_tc_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; > + /**< Number of bytes dropped for each traffic class */ > + > +#ifdef RTE_SCHED_RED > + uint64_t n_pkts_red_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; > + /**< Number of packets dropped by red */ > +#endif > +}; > + > /* > * Pipe configuration parameters. The period and credits_per_period > * parameters are measured in bytes, with one byte meaning the time > @@ -182,6 +201,19 @@ struct rte_sched_queue_stats { > uint32_t n_bytes_dropped; /**< Bytes dropped */ > }; > > +struct rte_sched_queue_stats64 { > + /* Packets */ > + uint64_t n_pkts; /**< Packets successfully written */ > + uint64_t n_pkts_dropped; /**< Packets dropped */ > +#ifdef RTE_SCHED_RED > + uint64_t n_pkts_red_dropped; /**< Packets dropped by RED */ > +#endif > + > + /* Bytes */ > + uint64_t n_bytes; /**< Bytes successfully written */ > + uint64_t n_bytes_dropped; /**< Bytes dropped */ > +}; > + > /** Port configuration parameters. */ > struct rte_sched_port_params { > const char *name; /**< String to be associated */ > @@ -330,6 +362,28 @@ rte_sched_subport_read_stats(struct rte_sched_port *port, > uint32_t *tc_ov); > > /** > + * Hierarchical scheduler subport statistics 64-bit read > + * > + * @param port > + * Handle to port scheduler instance > + * @param subport_id > + * Subport ID > + * @param stats64 > + * Pointer to pre-allocated subport statistics structure where the 64-bit > + * statistics counters should be stored > + * @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. > + * @return > + * 0 upon success, error code otherwise > + */ > +int __rte_experimental > +rte_sched_subport_read_stats64(struct rte_sched_port *port, > + uint32_t subport_id, > + struct rte_sched_subport_stats64 *stats64, > + uint32_t *tc_ov); > + > +/** > * Hierarchical scheduler queue statistics read > * > * @param port > @@ -352,6 +406,28 @@ rte_sched_queue_read_stats(struct rte_sched_port *port, > uint16_t *qlen); > > /** > + * Hierarchical scheduler queue statistics 64-bit read > + * > + * @param port > + * Handle to port scheduler instance > + * @param queue_id > + * Queue ID within port scheduler > + * @param stats > + * Pointer to pre-allocated subport statistics structure where the > + * 64-bit statistics counters should be stored > + * @param qlen > + * Pointer to pre-allocated variable where the current queue length > + * should be stored. > + * @return > + * 0 upon success, error code otherwise > + */ > +int __rte_experimental > +rte_sched_queue_read_stats64(struct rte_sched_port *port, > + uint32_t queue_id, > + struct rte_sched_queue_stats64 *stats64, > + uint16_t *qlen); > + > +/** > * Scheduler hierarchy path write to packet descriptor. Typically > * called by the packet classification stage. > * > diff --git a/lib/librte_sched/rte_sched_version.map b/lib/librte_sched/rte_sched_version.map > index 7295887..01bf71a 100644 > --- a/lib/librte_sched/rte_sched_version.map > +++ b/lib/librte_sched/rte_sched_version.map > @@ -34,4 +34,6 @@ EXPERIMENTAL { > global: > > rte_sched_port_pipe_profile_add; > + rte_sched_subport_read_stats64; > + rte_sched_queue_read_stats64; > }; > -- > 2.7.4 >