DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets
@ 2018-02-09 10:38 alanrobertsonatt
  2019-04-05 15:54 ` Ferruh Yigit
  0 siblings, 1 reply; 7+ messages in thread
From: alanrobertsonatt @ 2018-02-09 10:38 UTC (permalink / raw)
  To: cristian.dumitrescu; +Cc: dev, Alan Robertson, Alan Robertson

From: Alan Robertson <ar771e@att.com>

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 <alan.robertson@att.com>
---
 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;
 }
-- 
2.7.4

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets
  2018-02-09 10:38 [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets alanrobertsonatt
@ 2019-04-05 15:54 ` Ferruh Yigit
  2019-04-05 15:54   ` Ferruh Yigit
  2019-04-08 13:36   ` Dumitrescu, Cristian
  0 siblings, 2 replies; 7+ messages in thread
From: Ferruh Yigit @ 2019-04-05 15:54 UTC (permalink / raw)
  To: cristian.dumitrescu
  Cc: alanrobertsonatt, dev, Alan Robertson, Alan Robertson, Thomas Monjalon

On 2/9/2018 10:38 AM, alanrobertsonatt@gmail.com wrote:
> From: Alan Robertson <ar771e@att.com>
> 
> 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 <alan.robertson@att.com>


Hi Cristian,

Another 'librte_sched' patch waiting for a review for almost a year now, do you
know status of this patch?

Thanks,
ferruh

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets
  2019-04-05 15:54 ` Ferruh Yigit
@ 2019-04-05 15:54   ` Ferruh Yigit
  2019-04-08 13:36   ` Dumitrescu, Cristian
  1 sibling, 0 replies; 7+ messages in thread
From: Ferruh Yigit @ 2019-04-05 15:54 UTC (permalink / raw)
  To: cristian.dumitrescu
  Cc: alanrobertsonatt, dev, Alan Robertson, Alan Robertson, Thomas Monjalon

On 2/9/2018 10:38 AM, alanrobertsonatt@gmail.com wrote:
> From: Alan Robertson <ar771e@att.com>
> 
> 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 <alan.robertson@att.com>


Hi Cristian,

Another 'librte_sched' patch waiting for a review for almost a year now, do you
know status of this patch?

Thanks,
ferruh

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets
  2019-04-05 15:54 ` Ferruh Yigit
  2019-04-05 15:54   ` Ferruh Yigit
@ 2019-04-08 13:36   ` Dumitrescu, Cristian
  2019-04-08 13:36     ` Dumitrescu, Cristian
  2023-06-11  2:45     ` Stephen Hemminger
  1 sibling, 2 replies; 7+ messages in thread
From: Dumitrescu, Cristian @ 2019-04-08 13:36 UTC (permalink / raw)
  To: Yigit, Ferruh
  Cc: alanrobertsonatt, dev, Alan Robertson, Alan Robertson,
	Thomas Monjalon, Singh, Jasvinder



> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Friday, April 5, 2019 4:54 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: alanrobertsonatt@gmail.com; dev@dpdk.org; Alan Robertson
> <ar771e@att.com>; Alan Robertson <alan.robertson@att.com>; Thomas
> Monjalon <thomas@monjalon.net>
> Subject: Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large
> packets
> 
> On 2/9/2018 10:38 AM, alanrobertsonatt@gmail.com wrote:
> > From: Alan Robertson <ar771e@att.com>
> >
> > 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 <alan.robertson@att.com>
> 
> 
> Hi Cristian,
> 
> Another 'librte_sched' patch waiting for a review for almost a year now, do
> you
> know status of this patch?
> 
> Thanks,
> ferruh

As previously announced, we are planning to do some improvements on this part of the code [1] and we are planning improve this behavior in a way that is less intrusive and has slightly better performance (due to no branches).

Regards,
Cristian

[1] https://mails.dpdk.org/archives/dev/2018-November/120035.html


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets
  2019-04-08 13:36   ` Dumitrescu, Cristian
@ 2019-04-08 13:36     ` Dumitrescu, Cristian
  2023-06-11  2:45     ` Stephen Hemminger
  1 sibling, 0 replies; 7+ messages in thread
From: Dumitrescu, Cristian @ 2019-04-08 13:36 UTC (permalink / raw)
  To: Yigit, Ferruh
  Cc: alanrobertsonatt, dev, Alan Robertson, Alan Robertson,
	Thomas Monjalon, Singh, Jasvinder



> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Friday, April 5, 2019 4:54 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: alanrobertsonatt@gmail.com; dev@dpdk.org; Alan Robertson
> <ar771e@att.com>; Alan Robertson <alan.robertson@att.com>; Thomas
> Monjalon <thomas@monjalon.net>
> Subject: Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large
> packets
> 
> On 2/9/2018 10:38 AM, alanrobertsonatt@gmail.com wrote:
> > From: Alan Robertson <ar771e@att.com>
> >
> > 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 <alan.robertson@att.com>
> 
> 
> Hi Cristian,
> 
> Another 'librte_sched' patch waiting for a review for almost a year now, do
> you
> know status of this patch?
> 
> Thanks,
> ferruh

As previously announced, we are planning to do some improvements on this part of the code [1] and we are planning improve this behavior in a way that is less intrusive and has slightly better performance (due to no branches).

Regards,
Cristian

[1] https://mails.dpdk.org/archives/dev/2018-November/120035.html


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets
  2019-04-08 13:36   ` Dumitrescu, Cristian
  2019-04-08 13:36     ` Dumitrescu, Cristian
@ 2023-06-11  2:45     ` Stephen Hemminger
  1 sibling, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2023-06-11  2:45 UTC (permalink / raw)
  To: Dumitrescu, Cristian
  Cc: Yigit, Ferruh, alanrobertsonatt, dev, Alan Robertson,
	Alan Robertson, Thomas Monjalon, Singh, Jasvinder

On Mon, 8 Apr 2019 13:36:14 +0000
"Dumitrescu, Cristian" <cristian.dumitrescu@intel.com> wrote:

> > -----Original Message-----
> > From: Yigit, Ferruh
> > Sent: Friday, April 5, 2019 4:54 PM
> > To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> > Cc: alanrobertsonatt@gmail.com; dev@dpdk.org; Alan Robertson
> > <ar771e@att.com>; Alan Robertson <alan.robertson@att.com>; Thomas
> > Monjalon <thomas@monjalon.net>
> > Subject: Re: [dpdk-dev] [PATCH] Improve the shaper accuracy for large
> > packets
> > 
> > On 2/9/2018 10:38 AM, alanrobertsonatt@gmail.com wrote:  
> > > From: Alan Robertson <ar771e@att.com>
> > >
> > > 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 <alan.robertson@att.com>  
> > 
> > 
> > Hi Cristian,
> > 
> > Another 'librte_sched' patch waiting for a review for almost a year now, do
> > you
> > know status of this patch?
> > 
> > Thanks,
> > ferruh  
> 
> As previously announced, we are planning to do some improvements on this part of the code [1] and we are planning improve this behavior in a way that is less intrusive and has slightly better performance (due to no branches).
> 
> Regards,
> Cristian
> 
> [1] https://mails.dpdk.org/archives/dev/2018-November/120035.html
> 

This patch is quite old. It looks the original issue was that rte_sched_port_dequeue
is racy if port is shared by multiple lcore's.  The only update to port->time
happens in rte_sched_port_time_resync() frin rte_sched_port_dequeue().

The warnings about thread safety in qos_framework.rst could be improved, but that
is something for another patch in future.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets
@ 2018-02-09 10:26 alanrobertsonatt
  0 siblings, 0 replies; 7+ messages in thread
From: alanrobertsonatt @ 2018-02-09 10:26 UTC (permalink / raw)
  To: cristian.dumitrescu; +Cc: dev, Alan Robertson

From: Alan Robertson <ar771e@att.com>

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.
---
 lib/librte_sched/rte_sched.c | 58 +++++++++++++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 17 deletions(-)

diff --git a/lib/librte_sched/rte_sched.c b/lib/librte_sched/rte_sched.c
index 634486c..e53a424 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,42 @@ 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 +1610,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 +1627,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;
 }
-- 
2.7.4

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-06-11  2:45 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-09 10:38 [dpdk-dev] [PATCH] Improve the shaper accuracy for large packets alanrobertsonatt
2019-04-05 15:54 ` Ferruh Yigit
2019-04-05 15:54   ` Ferruh Yigit
2019-04-08 13:36   ` Dumitrescu, Cristian
2019-04-08 13:36     ` Dumitrescu, Cristian
2023-06-11  2:45     ` Stephen Hemminger
  -- strict thread matches above, loose matches on Subject: below --
2018-02-09 10:26 alanrobertsonatt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).