On 25/10/2019 18:46, Ian Lepore wrote: > On Fri, 2019-10-25 at 15:38 +0000, Andriy Gapon wrote: >> Author: avg >> Date: Fri Oct 25 15:38:09 2019 >> New Revision: 354076 >> URL: https://svnweb.freebsd.org/changeset/base/354076 >> >> Log: >> owc_gpiobus_read_data: compare times in sbintime_t units >> >> Previously the code used sbttous() before microseconds comparison >> in one >> place, sbttons() and nanoseconds in another, division by SBT_1US >> and >> microseconds in yet another. >> >> Now the code consistently uses multiplication by SBT_1US to convert >> microseconds to sbintime_t before comparing them with periods >> between >> calls to sbinuptime(). This is fast, this is precise enough (below >> 0.03%) and the periods defined by the protocol cannot overflow. >> >> Reviewed by: imp (D22108) >> MFC after: 2 weeks >> >> Modified: >> head/sys/dev/ow/owc_gpiobus.c >> >> Modified: head/sys/dev/ow/owc_gpiobus.c >> ===================================================================== >> ========= >> --- head/sys/dev/ow/owc_gpiobus.c Fri Oct 25 15:02:50 2019 (r354 >> 075) >> +++ head/sys/dev/ow/owc_gpiobus.c Fri Oct 25 15:38:09 2019 (r354 >> 076) >> @@ -296,10 +296,10 @@ owc_gpiobus_read_data(device_t dev, struct >> ow_timing * >> do { >> now = sbinuptime(); >> GETPIN(sc, &sample); >> - } while (sbttous(now - then) < t->t_rdv + 2 && sample == 0); >> + } while (now - then < (t->t_rdv + 2) * SBT_1US && sample == 0); >> critical_exit(); >> >> - if (sbttons(now - then) < t->t_rdv * 1000) >> + if (now - then < t->t_rdv * SBT_1US) >> *bit = 1; >> else >> *bit = 0; >> @@ -307,7 +307,7 @@ owc_gpiobus_read_data(device_t dev, struct >> ow_timing * >> /* Wait out the rest of t_slot */ >> do { >> now = sbinuptime(); >> - } while ((now - then) / SBT_1US < t->t_slot); >> + } while (now - then < t->t_slot * SBT_1US); >> >> RELBUS(sc); >> > > Unit conversions with sbt times should be done using the macros that > carefully avoid roundoff errors. I don't understand why you've changed > the code that correctly did use those macros to inline math.
I think that the commit message explains it: This is fast, this is precise enough (below 0.03%) and the periods defined by the protocol cannot overflow. Do you disagree? Could you please explain in which of the three lines changed the new code is worse and why? -- Andriy Gapon _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"