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>