From patchwork Fri Feb 9 10:38:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Robertson X-Patchwork-Id: 35086 X-Patchwork-Delegate: cristian.dumitrescu@intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id F0A831B84D; Fri, 9 Feb 2018 11:38:46 +0100 (CET) Received: from mail-wr0-f194.google.com (mail-wr0-f194.google.com [209.85.128.194]) by dpdk.org (Postfix) with ESMTP id 53E211B848 for ; Fri, 9 Feb 2018 11:38:45 +0100 (CET) Received: by mail-wr0-f194.google.com with SMTP id w50so7732691wrc.2 for ; Fri, 09 Feb 2018 02:38:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=DqEAeGksfzVRPSdHm0SYDCujefLwrnlV0hPJHP+k3i0=; b=mvEb77Yw8zTLBglTuFS9vAPo+EflPCN/JptM24rN3gVnEXOgyyHdHT60QiI7cFbocc qDEijRFb+OfE9FIIM8pYOFVcFC1YujkM/sw/w6JvyGVmPLOJDiF5H8nenaoxoikDCLzk TFjlp8lw61C56L0C4i/jxO8yToZR22MvnYBlnpj6Cms3s+Mf5aTenqqV/am0nBUynHAs vLZ14vWdUN/PAmisjL0PFO/o04sHzMy+C9o/AiknrQDUZftI6drSH4vfOYlSlJRxBQm8 xEs0DsaO2rIAnSTF6cIZV9iobwBl5yK/MkSgAFl7/HypORDM+VrJQ14OZeBiNcHZ2pTv g6MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=DqEAeGksfzVRPSdHm0SYDCujefLwrnlV0hPJHP+k3i0=; b=e1chyr/v1fLJCoFvhwFN/3azrr8SeurOUe+oIqpKyV/DIV54bSbryqFr0XK7bA0IYz a428AKEijhqem7lZ3Zd9aKTQxPhN4ItAToqeK8kusQ7XqhXCNQyUvBkPgFmuQi9vzqni FxqtDXqV7bc71o6Gf5S0E+qo2DWi/qeKoDFLiQnwRc8Rypn3IkShl5Kckk3ToAQZS8si NGOgFq77nFsB7pXnQP+5XCQJX9SFrk2h9MLI8If6fMCUW6gmOSDpSg2oF1fIBrmsvWC+ L06mvnt67AU8ZNI+kGp5Yo+YsQPuRGCM7Fj/lyGyUwhCqblkOee/NVrpFKHw02R0wN3/ uVNA== X-Gm-Message-State: APf1xPD37b5S8fjElcHbxMlredzGkq8Fz4Q00m04szO496J+s9zklAuS USfb/NPrB2DVb8W/YM/AmJuRwJ8p X-Google-Smtp-Source: AH8x2276IQlwua1jq2oWMxPraNenYAR62JwhIvsedl4rD2vzc0SY03B1DlRR6F9EVQStUR+nTnBG/g== X-Received: by 10.223.139.211 with SMTP id w19mr2053859wra.266.1518172724973; Fri, 09 Feb 2018 02:38:44 -0800 (PST) Received: from ar771e-Precision-7520.vyatta.net ([137.221.143.78]) by smtp.gmail.com with ESMTPSA id z1sm1865622wre.25.2018.02.09.02.38.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 09 Feb 2018 02:38:44 -0800 (PST) From: alanrobertsonatt@gmail.com To: cristian.dumitrescu@intel.com Cc: dev@dpdk.org, Alan Robertson , Alan Robertson Date: Fri, 9 Feb 2018 10:38:36 +0000 Message-Id: <1518172716-7649-1-git-send-email-alanrobertsonatt@gmail.com> X-Mailer: git-send-email 2.7.4 Subject: [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Alan Robertson There were 2 issues, the first was time could be lost whilst updating the traffic-class period, the second was a frame could be delayed if not enough tokens were available for the full frame. By allowing the shaper to borrow credit from the next period the throughput is improved. Signed-off-by: Alan Robertson --- lib/librte_sched/rte_sched.c | 60 +++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c index 634486c..7b06b0b 100644 --- a/lib/librte_sched/rte_sched.c +++ b/lib/librte_sched/rte_sched.c @@ -57,7 +57,7 @@ struct rte_sched_subport { /* Traffic classes (TCs) */ uint64_t tc_time; /* time of next update */ uint32_t tc_credits_per_period[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; - uint32_t tc_credits[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; + int32_t tc_credits[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; uint32_t tc_period; /* TC oversubscription */ @@ -98,7 +98,7 @@ struct rte_sched_pipe { /* Traffic classes (TCs) */ uint64_t tc_time; /* time of next update */ - uint32_t tc_credits[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; + int32_t tc_credits[RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE]; /* Weighted Round Robin (WRR) */ uint8_t wrr_tokens[RTE_SCHED_QUEUES_PER_PIPE]; @@ -1451,6 +1451,8 @@ grinder_credits_update(struct rte_sched_port *port, uint32_t pos) struct rte_sched_pipe *pipe = grinder->pipe; struct rte_sched_pipe_profile *params = grinder->pipe_params; uint64_t n_periods; + uint32_t tc; + uint64_t lapsed; /* Subport TB */ n_periods = (port->time - subport->tb_time) / subport->tb_period; @@ -1466,20 +1468,44 @@ grinder_credits_update(struct rte_sched_port *port, uint32_t pos) /* Subport TCs */ if (unlikely(port->time >= subport->tc_time)) { - subport->tc_credits[0] = subport->tc_credits_per_period[0]; - subport->tc_credits[1] = subport->tc_credits_per_period[1]; - subport->tc_credits[2] = subport->tc_credits_per_period[2]; - subport->tc_credits[3] = subport->tc_credits_per_period[3]; - subport->tc_time = port->time + subport->tc_period; + for (tc = 0; tc < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; tc++) { + if (subport->tc_credits[tc] < 0) + subport->tc_credits[tc] += + subport->tc_credits_per_period[tc]; + else + subport->tc_credits[tc] = + subport->tc_credits_per_period[tc]; + } + /* If we've run into the next period only update the clock to + * the time + tc_period so we'll replenish the tc tokens early + * in the next tc_period to compensate. + */ + lapsed = port->time - subport->tc_time; + if (lapsed < subport->tc_period) + subport->tc_time += subport->tc_period; + else + subport->tc_time = port->time + subport->tc_period; } /* Pipe TCs */ if (unlikely(port->time >= pipe->tc_time)) { - pipe->tc_credits[0] = params->tc_credits_per_period[0]; - pipe->tc_credits[1] = params->tc_credits_per_period[1]; - pipe->tc_credits[2] = params->tc_credits_per_period[2]; - pipe->tc_credits[3] = params->tc_credits_per_period[3]; - pipe->tc_time = port->time + params->tc_period; + for (tc = 0; tc < RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE; tc++) { + if (pipe->tc_credits[tc] < 0) + pipe->tc_credits[tc] += + params->tc_credits_per_period[tc]; + else + pipe->tc_credits[tc] = + params->tc_credits_per_period[tc]; + } + /* If we've run into the next period only update the clock to + * the time + tc_period so we'll replenish the tc tokens early + * in the next tc_period to compensate. + */ + lapsed = port->time - pipe->tc_time; + if (lapsed < params->tc_period) + pipe->tc_time += params->tc_period; + else + pipe->tc_time = port->time + params->tc_period; } } @@ -1586,16 +1612,16 @@ grinder_credits_check(struct rte_sched_port *port, uint32_t pos) uint32_t tc_index = grinder->tc_index; uint32_t pkt_len = pkt->pkt_len + port->frame_overhead; uint32_t subport_tb_credits = subport->tb_credits; - uint32_t subport_tc_credits = subport->tc_credits[tc_index]; + int32_t subport_tc_credits = subport->tc_credits[tc_index]; uint32_t pipe_tb_credits = pipe->tb_credits; - uint32_t pipe_tc_credits = pipe->tc_credits[tc_index]; + int32_t pipe_tc_credits = pipe->tc_credits[tc_index]; int enough_credits; /* Check queue credits */ enough_credits = (pkt_len <= subport_tb_credits) && - (pkt_len <= subport_tc_credits) && + (subport_tc_credits > 0) && (pkt_len <= pipe_tb_credits) && - (pkt_len <= pipe_tc_credits); + (pipe_tc_credits > 0); if (!enough_credits) return 0; @@ -1603,8 +1629,8 @@ grinder_credits_check(struct rte_sched_port *port, uint32_t pos) /* Update port credits */ subport->tb_credits -= pkt_len; subport->tc_credits[tc_index] -= pkt_len; - pipe->tb_credits -= pkt_len; pipe->tc_credits[tc_index] -= pkt_len; + pipe->tb_credits -= pkt_len; return 1; }