svn commit: r301162 - head/sys/netpfil/ipfw

Don Lewis truckman at FreeBSD.org
Wed Jun 1 20:04:26 UTC 2016


Author: truckman
Date: Wed Jun  1 20:04:24 2016
New Revision: 301162
URL: https://svnweb.freebsd.org/changeset/base/301162

Log:
  Replace constant expressions that contain multiplications by
  fractional floating point values with integer divides.  This will
  eliminate any chance that the compiler will generate code to evaluate
  the expression using floating point at runtime.
  
  Suggested by:	bde
  Submitted by:	Rasool Al-Saadi <ralsaadi at swin.edu.au>
  MFC after:	8 days (with r300779 and r300949)

Modified:
  head/sys/netpfil/ipfw/dn_aqm_pie.c
  head/sys/netpfil/ipfw/dn_aqm_pie.h
  head/sys/netpfil/ipfw/dn_sched_fq_pie.c

Modified: head/sys/netpfil/ipfw/dn_aqm_pie.c
==============================================================================
--- head/sys/netpfil/ipfw/dn_aqm_pie.c	Wed Jun  1 19:54:17 2016	(r301161)
+++ head/sys/netpfil/ipfw/dn_aqm_pie.c	Wed Jun  1 20:04:24 2016	(r301162)
@@ -244,20 +244,20 @@ calculate_drop_prob(void *x)
 	p *= (PIE_MAX_PROB << 12) / AQM_TIME_1S;
 
 	/* auto-tune drop probability */
-	if (prob < (int64_t)(PIE_MAX_PROB * 0.000001))
-		p >>= 11 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.00001))
-		p >>= 9 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.0001))
-		p >>= 7 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.001))
-		p >>= 5 + PIE_FIX_POINT_BITS+12;
-	else	if (prob < (int64_t)(PIE_MAX_PROB * 0.01))
-		p >>= 3 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.1))
-		p >>= 1 + PIE_FIX_POINT_BITS+12;
+	if (prob < (PIE_MAX_PROB / 1000000)) /* 0.000001 */
+		p >>= 11 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 100000)) /* 0.00001 */
+		p >>= 9 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 10000)) /* 0.0001 */
+		p >>= 7 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 1000)) /* 0.001 */
+		p >>= 5 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 100)) /* 0.01 */
+		p >>= 3 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 10)) /* 0.1 */
+		p >>= 1 + PIE_FIX_POINT_BITS + 12;
 	else
-		p >>= PIE_FIX_POINT_BITS+12;
+		p >>= PIE_FIX_POINT_BITS + 12;
 
 	oldprob = prob;
 

Modified: head/sys/netpfil/ipfw/dn_aqm_pie.h
==============================================================================
--- head/sys/netpfil/ipfw/dn_aqm_pie.h	Wed Jun  1 19:54:17 2016	(r301161)
+++ head/sys/netpfil/ipfw/dn_aqm_pie.h	Wed Jun  1 20:04:24 2016	(r301162)
@@ -132,11 +132,13 @@ drop_early(struct pie_status *pst, uint3
 	 * if accu_prob < 0.85 -> enqueue
 	 * if accu_prob>8.5 ->drop
 	 * between 0.85 and 8.5 || !De-randomize --> drop on prob
+	 * 
+	 * (0.85 = 17/20 ,8.5 = 17/2)
 	 */
 	if (pprms->flags & PIE_DERAND_ENABLED) {
-		if(pst->accu_prob < (uint64_t) (PIE_MAX_PROB * 0.85))
+		if(pst->accu_prob < (uint64_t) (PIE_MAX_PROB * 17 / 20))
 			return ENQUE;
-		 if( pst->accu_prob >= (uint64_t) (PIE_MAX_PROB * 8.5))
+		 if( pst->accu_prob >= (uint64_t) (PIE_MAX_PROB * 17 / 2))
 			return DROP;
 	}
 

Modified: head/sys/netpfil/ipfw/dn_sched_fq_pie.c
==============================================================================
--- head/sys/netpfil/ipfw/dn_sched_fq_pie.c	Wed Jun  1 19:54:17 2016	(r301161)
+++ head/sys/netpfil/ipfw/dn_sched_fq_pie.c	Wed Jun  1 20:04:24 2016	(r301162)
@@ -407,20 +407,20 @@ fq_calculate_drop_prob(void *x)
 	p *= (PIE_MAX_PROB << 12) / AQM_TIME_1S;
 
 	/* auto-tune drop probability */
-	if (prob < (int64_t)(PIE_MAX_PROB * 0.000001))
-		p >>= 11 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.00001))
-		p >>= 9 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.0001))
-		p >>= 7 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.001))
-		p >>= 5 + PIE_FIX_POINT_BITS+12;
-	else	if (prob < (int64_t)(PIE_MAX_PROB * 0.01))
-		p >>= 3 + PIE_FIX_POINT_BITS+12;
-	else if (prob < (int64_t)(PIE_MAX_PROB * 0.1))
-		p >>= 1 + PIE_FIX_POINT_BITS+12;
+	if (prob < (PIE_MAX_PROB / 1000000)) /* 0.000001 */
+		p >>= 11 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 100000)) /* 0.00001 */
+		p >>= 9 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 10000)) /* 0.0001 */
+		p >>= 7 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 1000)) /* 0.001 */
+		p >>= 5 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 100)) /* 0.01 */
+		p >>= 3 + PIE_FIX_POINT_BITS + 12;
+	else if (prob < (PIE_MAX_PROB / 10)) /* 0.1 */
+		p >>= 1 + PIE_FIX_POINT_BITS + 12;
 	else
-		p >>= PIE_FIX_POINT_BITS+12;
+		p >>= PIE_FIX_POINT_BITS + 12;
 
 	oldprob = prob;
 


More information about the svn-src-head mailing list