From patchwork Sun Feb 1 10:03:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 2887 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 2F75E2AA6; Sun, 1 Feb 2015 11:04:08 +0100 (CET) Received: from mail-la0-f47.google.com (mail-la0-f47.google.com [209.85.215.47]) by dpdk.org (Postfix) with ESMTP id 728EC2AA3 for ; Sun, 1 Feb 2015 11:04:07 +0100 (CET) Received: by mail-la0-f47.google.com with SMTP id hz20so32726620lab.6 for ; Sun, 01 Feb 2015 02:04:07 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=71JmWCxnmtbcyXWwPLNTCC39+GTrEp0SK+BGwelMPFY=; b=MbB8JOUcBIq42I/6V262gSWi8UCXaDyKK+boFmfEwn6C7UCS5LMDdbCdb2eveQ3mlY hnCC7ffg8vylyjLZwyv5eD4MRN7lplmJlkobM+xNAwsqTBKEXIIRsPzo9E0EFE4BOIq0 DhDB3VvjZAJFTEL0WK3ESKtzZST2l/59Nm5Jw0CeRNetpF9qguYKH2Ok88+/ONbwoYE7 7X0Ge5RSz4qrjxFRosHim7+xMdSX9m8gRZMyHjemhRysCSJq9kKJ4ufocTsRaxpsjsg0 J8nnmt7nKpLv1upvJ1x6dI/mIV18KtcARJIpIosDoYrxFC92o7ICWGjpPUAAR5lWG0Vo QMpA== X-Gm-Message-State: ALoCoQn6OMnS+sB4/X8grMK4/r/8ci2mPvPkP93ONcz//mjx4SxqTgp7D8lezCAIbrhW9KnCW0RZ X-Received: by 10.112.159.195 with SMTP id xe3mr14264601lbb.64.1422785047306; Sun, 01 Feb 2015 02:04:07 -0800 (PST) Received: from uryu.fosdem.net. ([2001:67c:1810:f0ff:c685:8ff:feca:841f]) by mx.google.com with ESMTPSA id c4sm1608100lbp.32.2015.02.01.02.04.04 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 01 Feb 2015 02:04:06 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Date: Sun, 1 Feb 2015 10:03:47 +0000 Message-Id: <1422785031-11494-3-git-send-email-stephen@networkplumber.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1422785031-11494-1-git-send-email-stephen@networkplumber.org> References: <1422785031-11494-1-git-send-email-stephen@networkplumber.org> Cc: Stephen Hemminger Subject: [dpdk-dev] [PATCH 3/7] rte_sched: keep track of RED drops 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Stephen Hemminger Add new statistic to keep track of drops due to RED. Signed-off-by: Stephen Hemminger --- 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 0688422..d5a1d5b 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 */