Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Jun 2016 20:04:25 +0000 (UTC)
From:      Don Lewis <truckman@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r301162 - head/sys/netpfil/ipfw
Message-ID:  <201606012004.u51K4PIr012152@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606012004.u51K4PIr012152>