Module Name:    src
Committed By:   martin
Date:           Wed Jul  3 19:15:08 UTC 2024

Modified Files:
        src/sys/altq [netbsd-10]: altq_rmclass.c

Log Message:
Pull up following revision(s) (requested by ozaki-r in ticket #736):

        sys/altq/altq_rmclass.c: revision 1.31

altq, cbq: take care of borrowed classes on sleeping

rmc_under_limit() determines if we can send a packet by checking
that a target class (or borrowing classes) is ready to send a
packet.  cl->undertime_ indicates a time that the class can send
packets after the time.  So if cl->undertime_ has passed
(i.e., now >=3D cl->undertime_), we can send packets through the class.

The treatment is important when a required delay period is shorten
than the minimum delay on the system (a tick), because in that case
the delay handler is too late to wake up to send a packet in time.

If there are traffic, rmc_under_limit() can save such a case.

Unfortunately, the old code didn't take care of bandwidth borrowing
on sleeping.  So bandwidth borrowing didn't work well with high
bandwidths that require short delay actions.


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.29.10.1 src/sys/altq/altq_rmclass.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/altq/altq_rmclass.c
diff -u src/sys/altq/altq_rmclass.c:1.29 src/sys/altq/altq_rmclass.c:1.29.10.1
--- src/sys/altq/altq_rmclass.c:1.29	Wed Jul 21 07:34:44 2021
+++ src/sys/altq/altq_rmclass.c	Wed Jul  3 19:15:07 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: altq_rmclass.c,v 1.29 2021/07/21 07:34:44 ozaki-r Exp $	*/
+/*	$NetBSD: altq_rmclass.c,v 1.29.10.1 2024/07/03 19:15:07 martin Exp $	*/
 /*	$KAME: altq_rmclass.c,v 1.19 2005/04/13 03:44:25 suz Exp $	*/
 
 /*
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: altq_rmclass.c,v 1.29 2021/07/21 07:34:44 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: altq_rmclass.c,v 1.29.10.1 2024/07/03 19:15:07 martin Exp $");
 
 /* #ident "@(#)rm_class.c  1.48     97/12/05 SMI" */
 
@@ -879,6 +879,7 @@ rmc_under_limit(struct rm_class *cl, str
 	rm_class_t	*p = cl;
 	rm_class_t	*top;
 	struct rm_ifdat	*ifd = cl->ifdat_;
+	int sleeping = cl->sleeping_;
 
 	ifd->borrowed_[ifd->qi_] = NULL;
 	/*
@@ -888,20 +889,23 @@ rmc_under_limit(struct rm_class *cl, str
 	if (cl->parent_ == NULL)
 		return (1);
 
-	if (cl->sleeping_) {
-		if (TS_LT(now, &cl->undertime_))
-			return (0);
-
-		CALLOUT_STOP(&cl->callout_);
-		cl->sleeping_ = 0;
-		cl->undertime_.tv_sec = 0;
+	if (!TS_LT(now, &cl->undertime_)) {
+		/* Fast path: the given class is allowed to send packets */
+		if (sleeping) {
+			CALLOUT_STOP(&cl->callout_);
+			cl->sleeping_ = 0;
+			cl->undertime_.tv_sec = 0;
+		}
 		return (1);
 	}
 
 	top = NULL;
-	while (cl->undertime_.tv_sec && TS_LT(now, &cl->undertime_)) {
+	do {
 		if (((cl = cl->borrow_) == NULL) ||
 		    (cl->depth_ > ifd->cutoff_)) {
+			/* No need to call the delay action */
+			if (sleeping)
+				return (0);
 #ifdef ADJUST_CUTOFF
 			if (cl != NULL)
 				/* cutoff is taking effect, just
@@ -931,7 +935,7 @@ rmc_under_limit(struct rm_class *cl, str
 			return (0);
 		}
 		top = cl;
-	}
+	} while (cl->undertime_.tv_sec && TS_LT(now, &cl->undertime_));
 
 	if (cl != p)
 		ifd->borrowed_[ifd->qi_] = cl;

Reply via email to