[PATCH v5 32/54] common/clock: Move delay and timeout functions to lib/

Andrey Smirnov andrew.smirnov at gmail.com
Wed Jun 13 05:26:59 PDT 2018


On Wed, Jun 13, 2018 at 1:19 AM Sascha Hauer <s.hauer at pengutronix.de> wrote:
>
> On Tue, Jun 12, 2018 at 01:52:48PM -0700, Andrey Smirnov wrote:
> > Move delay and timeout functions to lib/ in order to share them with
> > PBL. Currently only the most trivial implementation of get_time_ns()
> > usefull to implement never-expiring timeouts is provided. More work is
> > needed to allow board specific overrides.
> >
> > Signed-off-by: Andrey Smirnov <andrew.smirnov at gmail.com>
> > ---
> >  common/clock.c | 52 ------------------------------------
> >  lib/Makefile   |  1 +
> >  lib/clock.c    | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 73 insertions(+), 52 deletions(-)
> >  create mode 100644 lib/clock.c
> >
> > +#if defined(__PBL__)
> > +/*
> > + * Poller infrastructure is not available in PBL, so we just define
> > + * is_timeout to be a synonym for is_timeout_non_interruptible
> > + */
> > +int is_timeout(uint64_t start_ns, uint64_t time_offset_ns)
> > +     __alias(is_timeout_non_interruptible);
> > +#else
> > +#include <poller.h>
> > +
> > +int is_timeout(uint64_t start_ns, uint64_t time_offset_ns)
> > +{
> > +
> > +     if (time_offset_ns >= 100 * USECOND)
> > +             poller_call();
> > +
> > +     return is_timeout_non_interruptible(start_ns, time_offset_ns);
> > +}
> > +#endif
> > +EXPORT_SYMBOL(is_timeout);
> > +
> > +void ndelay(unsigned long nsecs)
> > +{
> > +     uint64_t start = get_time_ns();
> > +
> > +     while(!is_timeout_non_interruptible(start, nsecs));
> > +}
> > +EXPORT_SYMBOL(ndelay);
> > +
> > +void udelay(unsigned long usecs)
> > +{
> > +     uint64_t start = get_time_ns();
> > +
> > +     while(!is_timeout(start, usecs * USECOND));
> > +}
> > +EXPORT_SYMBOL(udelay);
> > +
> > +void mdelay(unsigned long msecs)
> > +{
> > +     uint64_t start = get_time_ns();
> > +
> > +     while(!is_timeout(start, msecs * MSECOND));
> > +}
> > +EXPORT_SYMBOL(mdelay);
> > +
> > +void mdelay_non_interruptible(unsigned long msecs)
> > +{
> > +     uint64_t start = get_time_ns();
> > +
> > +     while (!is_timeout_non_interruptible(start, msecs * MSECOND))
> > +             ;
> > +}
> > +EXPORT_SYMBOL(mdelay_non_interruptible);
> > +
> > +__weak uint64_t get_time_ns(void)
> > +{
> > +     return 0;
> > +}
>
> So in PBL we now have [num]delay functions which will lockup the system
> forever when called. This is not good.
>
> Given that you only need is_timeout() to implement the iopoll.h functions
> and this patch is only a complicated way to shortcircuit the timeout, I
> think it would be better to just put a #ifndef __PBL__ around the call
> to is_timeout() in readx_poll_timeout(). This would at least make it
> clearer to the reader that there actually is no timeout in the PBL
> case.
>

OK, sure, will do in v6.

Thanks,
Andrey Smirnov



More information about the barebox mailing list