All of lore.kernel.org
 help / color / mirror / Atom feed
* [net-next PATCH 0/5] HFSC patches, part 1
@ 2016-06-30  0:26 Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 1/5] net/sched/sch_hfsc.c: handle corner cases where head may change invalidating calculated deadline Michal Soltys
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Michal Soltys @ 2016-06-30  0:26 UTC (permalink / raw)
  To: davem; +Cc: netdev, kaber

Hi,

It's revised version of part of the patches I submitted really, really long
time ago (back then I asked Patrick to ignore them as I found some issues
shortly after submitting).

Anyway this is the first set with very simple fixes/changes though some of them
relatively subtle (I tried to do very exhaustive commit messages explaining what
and why with those).

The patches are against net-next tree.

The second set will be heavier - or rather with more complex explanations, among those I have:

- a fix to subtle issue introduced in
  http://permalink.gmane.org/gmane.linux.kernel.commits.2-4/8281
  along with simplifying related stuff
- update times to 96 bits (which allows to "just" use 32 bit shifts and
  improves curve definition accuracy at more extreme low/high speeds)
- add curve "merging" instead of just selecting in convex case (computations
  mirror those from concave intersection)

But these are eventually for later.

Michal Soltys (5):
  net/sched/sch_hfsc.c: handle corner cases where head may change invalidating calculated deadline
  net/sched/sch_hfsc.c: add unlikely() in qdisc_peek_len()
  net/sched/sch_hfsc.c: remove leftover dlist and droplist
  net/sched/sch_hfsc.c: go passive after vt update
  net/sched/sch_hfsc.c: anchor virtual curve at proper vt in hfsc_change_fsc()

 net/sched/sch_hfsc.c | 54 ++++++++++++++++++++++++++--------------------------
 1 file changed, 27 insertions(+), 27 deletions(-)

-- 
2.1.3

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

* [net-next PATCH 1/5] net/sched/sch_hfsc.c: handle corner cases where head may change invalidating calculated deadline
  2016-06-30  0:26 [net-next PATCH 0/5] HFSC patches, part 1 Michal Soltys
@ 2016-06-30  0:26 ` Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 2/5] net/sched/sch_hfsc.c: add unlikely() in qdisc_peek_len() Michal Soltys
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Michal Soltys @ 2016-06-30  0:26 UTC (permalink / raw)
  To: davem; +Cc: netdev, kaber

Realtime scheduling implemented in HFSC uses head of the queue to make
the decision about which packet to schedule next. But in case of any
head drop, the deadline calculated for the previous head is not
necessarily correct for the next head (unless both packets have the same
length).

Thanks to peek() function used during dequeue - which internally is a
dequeue operation - hfsc is almost safe from this issue, as peek()
dequeues and isolates the head storing it temporarily until the real
dequeue happens.

But there is one exception: if after the class activation a drop happens
before the first dequeue operation, there's never a chance to do the
peek().

Adding peek() call in enqueue - if this is the first packet in a new
backlog period AND the scheduler has realtime curve defined - fixes that
one corner case. The 1st hfsc_dequeue() will use that peeked packet,
similarly as every subsequent hfsc_dequeue() call uses packet peeked by
the previous call.

Signed-off-by: Michal Soltys <soltys@ziu.info>
---
 net/sched/sch_hfsc.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index 8cb5eff..6d6df6b 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -1594,8 +1594,17 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free)
 		return err;
 	}
 
-	if (cl->qdisc->q.qlen == 1)
+	if (cl->qdisc->q.qlen == 1) {
 		set_active(cl, qdisc_pkt_len(skb));
+		/*
+		 * If this is the first packet, isolate the head so an eventual
+		 * head drop before the first dequeue operation has no chance
+		 * to invalidate the deadline.
+		 */
+		if (cl->cl_flags & HFSC_RSC)
+			cl->qdisc->ops->peek(cl->qdisc);
+
+	}
 
 	qdisc_qstats_backlog_inc(sch, skb);
 	sch->q.qlen++;
-- 
2.1.3

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

* [net-next PATCH 2/5] net/sched/sch_hfsc.c: add unlikely() in qdisc_peek_len()
  2016-06-30  0:26 [net-next PATCH 0/5] HFSC patches, part 1 Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 1/5] net/sched/sch_hfsc.c: handle corner cases where head may change invalidating calculated deadline Michal Soltys
@ 2016-06-30  0:26 ` Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 3/5] net/sched/sch_hfsc.c: remove leftover dlist and droplist Michal Soltys
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Michal Soltys @ 2016-06-30  0:26 UTC (permalink / raw)
  To: davem; +Cc: netdev, kaber

The condition can only succeed on wrong configurations.

Signed-off-by: Michal Soltys <soltys@ziu.info>
---
 net/sched/sch_hfsc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index 6d6df6b..e2244bb 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -882,7 +882,7 @@ qdisc_peek_len(struct Qdisc *sch)
 	unsigned int len;
 
 	skb = sch->ops->peek(sch);
-	if (skb == NULL) {
+	if (unlikely(skb == NULL)) {
 		qdisc_warn_nonwc("qdisc_peek_len", sch);
 		return 0;
 	}
-- 
2.1.3

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

* [net-next PATCH 3/5] net/sched/sch_hfsc.c: remove leftover dlist and droplist
  2016-06-30  0:26 [net-next PATCH 0/5] HFSC patches, part 1 Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 1/5] net/sched/sch_hfsc.c: handle corner cases where head may change invalidating calculated deadline Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 2/5] net/sched/sch_hfsc.c: add unlikely() in qdisc_peek_len() Michal Soltys
@ 2016-06-30  0:26 ` Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 4/5] net/sched/sch_hfsc.c: go passive after vt update Michal Soltys
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Michal Soltys @ 2016-06-30  0:26 UTC (permalink / raw)
  To: davem; +Cc: netdev, kaber

This is update to:
commit a09ceb0e08140a ("sched: remove qdisc->drop")

That commit removed qdisc->drop, but left alone dlist and droplist
that no longer serve any meaningful purpose.

Signed-off-by: Michal Soltys <soltys@ziu.info>
---
 net/sched/sch_hfsc.c | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index e2244bb..df07f06 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -130,7 +130,6 @@ struct hfsc_class {
 	struct rb_node vt_node;		/* parent's vt_tree member */
 	struct rb_root cf_tree;		/* active children sorted by cl_f */
 	struct rb_node cf_node;		/* parent's cf_heap member */
-	struct list_head dlist;		/* drop list member */
 
 	u64	cl_total;		/* total work in bytes */
 	u64	cl_cumul;		/* cumulative work in bytes done by
@@ -177,8 +176,6 @@ struct hfsc_sched {
 	struct hfsc_class root;			/* root class */
 	struct Qdisc_class_hash clhash;		/* class hash */
 	struct rb_root eligible;		/* eligible tree */
-	struct list_head droplist;		/* active leaf class list (for
-						   dropping) */
 	struct qdisc_watchdog watchdog;		/* watchdog timer */
 };
 
@@ -858,7 +855,6 @@ set_active(struct hfsc_class *cl, unsigned int len)
 	if (cl->cl_flags & HFSC_FSC)
 		init_vf(cl, len);
 
-	list_add_tail(&cl->dlist, &cl->sched->droplist);
 }
 
 static void
@@ -867,8 +863,6 @@ set_passive(struct hfsc_class *cl)
 	if (cl->cl_flags & HFSC_RSC)
 		eltree_remove(cl);
 
-	list_del(&cl->dlist);
-
 	/*
 	 * vttree is now handled in update_vf() so that update_vf(cl, 0, 0)
 	 * needs to be called explicitly to remove a class from vttree.
@@ -1443,7 +1437,6 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt)
 	if (err < 0)
 		return err;
 	q->eligible = RB_ROOT;
-	INIT_LIST_HEAD(&q->droplist);
 
 	q->root.cl_common.classid = sch->handle;
 	q->root.refcnt  = 1;
@@ -1527,7 +1520,6 @@ hfsc_reset_qdisc(struct Qdisc *sch)
 			hfsc_reset_class(cl);
 	}
 	q->eligible = RB_ROOT;
-	INIT_LIST_HEAD(&q->droplist);
 	qdisc_watchdog_cancel(&q->watchdog);
 	sch->qstats.backlog = 0;
 	sch->q.qlen = 0;
-- 
2.1.3

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

* [net-next PATCH 4/5] net/sched/sch_hfsc.c: go passive after vt update
  2016-06-30  0:26 [net-next PATCH 0/5] HFSC patches, part 1 Michal Soltys
                   ` (2 preceding siblings ...)
  2016-06-30  0:26 ` [net-next PATCH 3/5] net/sched/sch_hfsc.c: remove leftover dlist and droplist Michal Soltys
@ 2016-06-30  0:26 ` Michal Soltys
  2016-06-30  0:26 ` [net-next PATCH 5/5] net/sched/sch_hfsc.c: anchor virtual curve at proper vt in hfsc_change_fsc() Michal Soltys
  2016-07-01  9:07 ` [net-next PATCH 0/5] HFSC patches, part 1 David Miller
  5 siblings, 0 replies; 7+ messages in thread
From: Michal Soltys @ 2016-06-30  0:26 UTC (permalink / raw)
  To: davem; +Cc: netdev, kaber

When a class is going passive, it should update its cl_vt first
to be consistent with the last dequeue operation.

Otherwise its cl_vt will be one packet behind and parent's cvtmax might
not be updated as well.

One possible side effect is if some class goes passive and subsequently
goes active /without/ its parent going passive - with cl_vt lagging one
packet behind - comparison made in init_vf() will be affected (same
period).

Signed-off-by: Michal Soltys <soltys@ziu.info>
---
 net/sched/sch_hfsc.c | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index df07f06..4eef857 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -778,6 +778,20 @@ update_vf(struct hfsc_class *cl, unsigned int len, u64 cur_time)
 		else
 			go_passive = 0;
 
+		/* update vt */
+		cl->cl_vt = rtsc_y2x(&cl->cl_virtual, cl->cl_total)
+			    - cl->cl_vtoff + cl->cl_vtadj;
+
+		/*
+		 * if vt of the class is smaller than cvtmin,
+		 * the class was skipped in the past due to non-fit.
+		 * if so, we need to adjust vtadj.
+		 */
+		if (cl->cl_vt < cl->cl_parent->cl_cvtmin) {
+			cl->cl_vtadj += cl->cl_parent->cl_cvtmin - cl->cl_vt;
+			cl->cl_vt = cl->cl_parent->cl_cvtmin;
+		}
+
 		if (go_passive) {
 			/* no more active child, going passive */
 
@@ -794,25 +808,10 @@ update_vf(struct hfsc_class *cl, unsigned int len, u64 cur_time)
 			continue;
 		}
 
-		/*
-		 * update vt and f
-		 */
-		cl->cl_vt = rtsc_y2x(&cl->cl_virtual, cl->cl_total)
-			    - cl->cl_vtoff + cl->cl_vtadj;
-
-		/*
-		 * if vt of the class is smaller than cvtmin,
-		 * the class was skipped in the past due to non-fit.
-		 * if so, we need to adjust vtadj.
-		 */
-		if (cl->cl_vt < cl->cl_parent->cl_cvtmin) {
-			cl->cl_vtadj += cl->cl_parent->cl_cvtmin - cl->cl_vt;
-			cl->cl_vt = cl->cl_parent->cl_cvtmin;
-		}
-
 		/* update the vt tree */
 		vttree_update(cl);
 
+		/* update f */
 		if (cl->cl_flags & HFSC_USC) {
 			cl->cl_myf = cl->cl_myfadj + rtsc_y2x(&cl->cl_ulimit,
 							      cl->cl_total);
-- 
2.1.3

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

* [net-next PATCH 5/5] net/sched/sch_hfsc.c: anchor virtual curve at proper vt in hfsc_change_fsc()
  2016-06-30  0:26 [net-next PATCH 0/5] HFSC patches, part 1 Michal Soltys
                   ` (3 preceding siblings ...)
  2016-06-30  0:26 ` [net-next PATCH 4/5] net/sched/sch_hfsc.c: go passive after vt update Michal Soltys
@ 2016-06-30  0:26 ` Michal Soltys
  2016-07-01  9:07 ` [net-next PATCH 0/5] HFSC patches, part 1 David Miller
  5 siblings, 0 replies; 7+ messages in thread
From: Michal Soltys @ 2016-06-30  0:26 UTC (permalink / raw)
  To: davem; +Cc: netdev, kaber

cl->cl_vt alone is relative only to the current backlog period, while
the curve operates on cumulative virtual time. This patch adds missing
cl->cl_vtoff.

Signed-off-by: Michal Soltys <soltys@ziu.info>
---
 net/sched/sch_hfsc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index 4eef857..dff92ea 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -940,7 +940,7 @@ static void
 hfsc_change_fsc(struct hfsc_class *cl, struct tc_service_curve *fsc)
 {
 	sc2isc(fsc, &cl->cl_fsc);
-	rtsc_init(&cl->cl_virtual, &cl->cl_fsc, cl->cl_vt, cl->cl_total);
+	rtsc_init(&cl->cl_virtual, &cl->cl_fsc, cl->cl_vtoff + cl->cl_vt, cl->cl_total);
 	cl->cl_flags |= HFSC_FSC;
 }
 
-- 
2.1.3

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

* Re: [net-next PATCH 0/5] HFSC patches, part 1
  2016-06-30  0:26 [net-next PATCH 0/5] HFSC patches, part 1 Michal Soltys
                   ` (4 preceding siblings ...)
  2016-06-30  0:26 ` [net-next PATCH 5/5] net/sched/sch_hfsc.c: anchor virtual curve at proper vt in hfsc_change_fsc() Michal Soltys
@ 2016-07-01  9:07 ` David Miller
  5 siblings, 0 replies; 7+ messages in thread
From: David Miller @ 2016-07-01  9:07 UTC (permalink / raw)
  To: soltys; +Cc: netdev, kaber

From: Michal Soltys <soltys@ziu.info>
Date: Thu, 30 Jun 2016 02:26:43 +0200

> It's revised version of part of the patches I submitted really, really long
> time ago (back then I asked Patrick to ignore them as I found some issues
> shortly after submitting).
> 
> Anyway this is the first set with very simple fixes/changes though some of them
> relatively subtle (I tried to do very exhaustive commit messages explaining what
> and why with those).
> 
> The patches are against net-next tree.
> 
> The second set will be heavier - or rather with more complex explanations, among those I have:
> 
> - a fix to subtle issue introduced in
>   http://permalink.gmane.org/gmane.linux.kernel.commits.2-4/8281
>   along with simplifying related stuff
> - update times to 96 bits (which allows to "just" use 32 bit shifts and
>   improves curve definition accuracy at more extreme low/high speeds)
> - add curve "merging" instead of just selecting in convex case (computations
>   mirror those from concave intersection)
> 
> But these are eventually for later.

Series applied, thanks.

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

end of thread, other threads:[~2016-07-01  9:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-30  0:26 [net-next PATCH 0/5] HFSC patches, part 1 Michal Soltys
2016-06-30  0:26 ` [net-next PATCH 1/5] net/sched/sch_hfsc.c: handle corner cases where head may change invalidating calculated deadline Michal Soltys
2016-06-30  0:26 ` [net-next PATCH 2/5] net/sched/sch_hfsc.c: add unlikely() in qdisc_peek_len() Michal Soltys
2016-06-30  0:26 ` [net-next PATCH 3/5] net/sched/sch_hfsc.c: remove leftover dlist and droplist Michal Soltys
2016-06-30  0:26 ` [net-next PATCH 4/5] net/sched/sch_hfsc.c: go passive after vt update Michal Soltys
2016-06-30  0:26 ` [net-next PATCH 5/5] net/sched/sch_hfsc.c: anchor virtual curve at proper vt in hfsc_change_fsc() Michal Soltys
2016-07-01  9:07 ` [net-next PATCH 0/5] HFSC patches, part 1 David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.