[dpdk-dev] [PATCH v2 3/7] rte_sched: keep track of RED drops

Dumitrescu, Cristian cristian.dumitrescu at intel.com
Fri Feb 20 19:22:11 CET 2015



> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Stephen
> Hemminger
> Sent: Thursday, February 5, 2015 6:05 AM
> To: dev at dpdk.org
> Cc: Stephen Hemminger
> Subject: [dpdk-dev] [PATCH v2 3/7] rte_sched: keep track of RED drops
> 
> From: Stephen Hemminger <shemming at brocade.com>
> 
> Add new statistic to keep track of drops due to RED.
> 
> Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
> ---
>  lib/librte_sched/rte_sched.c | 28 +++++++++++++++++++++++-----
>  lib/librte_sched/rte_sched.h |  6 ++++++
>  2 files changed, 29 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
> index 6928c98..8cb8bf1 100644
> --- a/lib/librte_sched/rte_sched.c
> +++ b/lib/librte_sched/rte_sched.c
> @@ -1028,7 +1028,9 @@ rte_sched_port_update_subport_stats(struct
> rte_sched_port *port, uint32_t qindex
>  }
> 
>  static inline void
> -rte_sched_port_update_subport_stats_on_drop(struct rte_sched_port
> *port, uint32_t qindex, struct rte_mbuf *pkt)
> +rte_sched_port_update_subport_stats_on_drop(struct rte_sched_port
> *port,
> +					    uint32_t qindex,
> +					    struct rte_mbuf *pkt, uint32_t red)
>  {
>  	struct rte_sched_subport *s = port->subport + (qindex /
> rte_sched_port_queues_per_subport(port));
>  	uint32_t tc_index = (qindex >> 2) & 0x3;
> @@ -1036,6 +1038,9 @@
> rte_sched_port_update_subport_stats_on_drop(struct rte_sched_port
> *port, uint32_
> 
>  	s->stats.n_pkts_tc_dropped[tc_index] += 1;
>  	s->stats.n_bytes_tc_dropped[tc_index] += pkt_len;
> +#ifdef RTE_SCHED_RED
> +	s->stats.n_pkts_red_dropped[tc_index] += red;
> +#endif
>  }
> 
>  static inline void
> @@ -1049,13 +1054,18 @@ rte_sched_port_update_queue_stats(struct
> rte_sched_port *port, uint32_t qindex,
>  }
> 
>  static inline void
> -rte_sched_port_update_queue_stats_on_drop(struct rte_sched_port
> *port, uint32_t qindex, struct rte_mbuf *pkt)
> +rte_sched_port_update_queue_stats_on_drop(struct rte_sched_port
> *port,
> +					  uint32_t qindex,
> +					  struct rte_mbuf *pkt, uint32_t red)
>  {
>  	struct rte_sched_queue_extra *qe = port->queue_extra + qindex;
>  	uint32_t pkt_len = pkt->pkt_len;
> 
>  	qe->stats.n_pkts_dropped += 1;
>  	qe->stats.n_bytes_dropped += pkt_len;
> +#ifdef RTE_SCHED_RED
> +	qe->stats.n_pkts_red_dropped += red;
> +#endif
>  }
> 
>  #endif /* RTE_SCHED_COLLECT_STATS */
> @@ -1206,12 +1216,20 @@ rte_sched_port_enqueue_qwa(struct
> rte_sched_port *port, uint32_t qindex, struct
>  	qlen = q->qw - q->qr;
> 
>  	/* Drop the packet (and update drop stats) when queue is full */
> -	if (unlikely(rte_sched_port_red_drop(port, pkt, qindex, qlen) ||
> (qlen >= qsize))) {
> +	if (unlikely(rte_sched_port_red_drop(port, pkt, qindex, qlen))) {
> +#ifdef RTE_SCHED_COLLECT_STATS
> +		rte_sched_port_update_subport_stats_on_drop(port,
> qindex, pkt, 1);
> +		rte_sched_port_update_queue_stats_on_drop(port,
> qindex, pkt, 1);
> +#endif
>  		rte_pktmbuf_free(pkt);
> +	}
> +
> +	if (qlen >= qsize) {
>  #ifdef RTE_SCHED_COLLECT_STATS
> -		rte_sched_port_update_subport_stats_on_drop(port,
> qindex, pkt);
> -		rte_sched_port_update_queue_stats_on_drop(port,
> qindex, pkt);
> +		rte_sched_port_update_subport_stats_on_drop(port,
> qindex, pkt, 0);
> +		rte_sched_port_update_queue_stats_on_drop(port,
> qindex, pkt, 0);
>  #endif
> +		rte_pktmbuf_free(pkt);
>  		return 0;
>  	}
> 
> diff --git a/lib/librte_sched/rte_sched.h b/lib/librte_sched/rte_sched.h
> index dda287f..e9bf18a 100644
> --- a/lib/librte_sched/rte_sched.h
> +++ b/lib/librte_sched/rte_sched.h
> @@ -140,6 +140,9 @@ struct rte_sched_subport_stats {
>  	                                      subport for each traffic class*/
>  	uint32_t
> n_bytes_tc_dropped[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; /**<
> Number of bytes dropped by the current
>                                            subport for each traffic class due to subport queues
> being full or congested */
> +#ifdef RTE_SCHED_RED
> +	uint32_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
> @@ -168,6 +171,9 @@ struct rte_sched_queue_stats {
>  	/* Packets */
>  	uint32_t n_pkts;                 /**< Number of packets successfully
> written to current queue */
>  	uint32_t n_pkts_dropped;         /**< Number of packets dropped due
> to current queue being full or congested */
> +#ifdef RTE_SCHED_RED
> +	uint32_t n_pkts_red_dropped;
> +#endif
> 
>  	/* Bytes */
>  	uint32_t n_bytes;                /**< Number of bytes successfully written
> to current queue */
> --
> 2.1.4

Acked by: Cristian Dumitrescu <cristian.dumitrescu at intel.com>

--------------------------------------------------------------
Intel Shannon Limited
Registered in Ireland
Registered Office: Collinstown Industrial Park, Leixlip, County Kildare
Registered Number: 308263
Business address: Dromore House, East Park, Shannon, Co. Clare

This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.




More information about the dev mailing list