Should this be a tacked bug in
https://bugs.linaro.org/enter_bug.cgi?product=OpenDataPlane ?

Mike

On 14 January 2015 at 06:10, Ola Liljedahl <[email protected]> wrote:

> On 14 January 2015 at 11:23, Ola Dahl <[email protected]> wrote:
> > Hi,
> >
> > when I run the ODP timer test on 32-bit Ubuntu, it fails.
> >
> > I use ODP commit
> >
> > commit 68c7b7e88b1b948868d35497e715cf5077e90e40
> > Author: Mike Holmes <[email protected]>
> > Date:   Fri Jan 2 16:30:16 2015 -0500
> >
> >     api: odp_coremask: Improve documentation
> >
> > and the timer test fails as
> >
> > ubuntu@ubuntu:~/odp$ ./example/timer/odp_timer_test
> >
> > ODP timer example starts
> > odp_buffer_pool.c:90:odp_buffer_pool_init_global():
> > Buffer pool init global
> > odp_buffer_pool.c:91:odp_buffer_pool_init_global():  pool_entry_s size
> > 256
> > odp_buffer_pool.c:92:odp_buffer_pool_init_global():  pool_entry_t size
> > 256
> > odp_buffer_pool.c:93:odp_buffer_pool_init_global():  odp_buffer_hdr_t
> size
> > 76
> > odp_buffer_pool.c:94:odp_buffer_pool_init_global():
> > odp_queue.c:100:odp_queue_init_global():Queue init ...
> > odp_queue.c:120:odp_queue_init_global():done
> > odp_queue.c:121:odp_queue_init_global():Queue init global
> > odp_queue.c:123:odp_queue_init_global():  struct queue_entry_s size 192
> > odp_queue.c:125:odp_queue_init_global():  queue_entry_t size        192
> > odp_queue.c:126:odp_queue_init_global():
> > odp_schedule.c:90:odp_schedule_init_global():Schedule init ...
> > odp_schedule.c:142:odp_schedule_init_global():done
> >
> > ODP system info
> > ---------------
> > ODP API version: 0.7.0
> > CPU model:       Intel(R) Core(TM) i7-2760QM CPU @ 2.40GHz
> > CPU freq (hz):   2388222999
> > Cache line size: 64
> > Max CPU count:   1
> >
> > num worker threads: 1
> > first CPU:          0
> > resolution:         10000 usec
> > min timeout:        0 usec
> > max timeout:        10000000 usec
> > period:             1000000 usec
> > timeouts:           30
> > odp_timer.c:640:itimer_init():Creating POSIX timer for timer pool
> > timer_pool, period 10000000 ns
> > odp_timer.c:664:itimer_init():timer_settime() returned error Invalid
> > argument
> The POSIX timer uses CLOCK_MONOTONIC but this should always be
> supported me thinks.
> The man page has this for EINVAL:
>        timer_settime() may fail with the following errors:
>
>        EINVAL new_value.it_value is negative; or
> new_value.it_value.tv_nsec is
>               negative or greater than 999,999,999.
>
>
> > Aborted (core dumped)
> Can you run again with core dumps enabled (ulimit -c unlimited) and
> print the values of the parameters to timer_settime? Or run it in gdb.
>
> > ubuntu@ubuntu:~/odp$
> >
> > I use Virtualbox and a fresh Ubuntu 32-bit image, prepared using
> >
> >     3  sudo apt-get install git
> >     4  git clone https://git.linaro.org/lng/odp.git
> >     5  cd odp
> >     7  sudo apt-get install autoconf
> >     9  sudo apt-get install autotools-dev
> >    11  sudo apt-get install libtool
> >    14  ./bootstrap
> >    26  sudo apt-get update
> >    29  sudo apt-get install libssl-dev
> >    30  ./configure
> >    36  make all
> >    37  ./example/timer/odp_timer_test
> This works on my 32-bit ChromeBook2 (ARMv7a) so not a 32-bit problem.
>
> But I do get spurious errors "odp_timer_set_abs() failed: too early"
> and the example treats them as fatal errors (they don't have to be,
> that's why they are return codes, the application could/should try
> again with a later timeout tick). Possibly this is caused by the
> worker threads being preempted at the wrong place and so attempting to
> set timeouts for ticks that have already passed.
>
> Managed to configure and build odp for 32-bit x86 (I had to install
> libssl-dev:i386 package and that had weird side effects on my
> installation! gcc was for some reason also uninstalled and had to be
> reinstalled).
>
> And building ODP with "make CFLAGS=-m32", I get the same problem.
> 662 if (timer_settime(&tp->timerid, 0, &ispec, NULL))
> (gdb) p ispec
> $1 = {it_interval = {tv_sec = 0, tv_nsec = 10000000}, it_value = {tv_sec =
> 0,
>     tv_nsec = 10000000}}
> (gdb) n
> 663 ODP_ABORT("timer_settime() returned error %s\n",
> (gdb) n
> odp_timer.c:664:itimer_init():timer_settime() returned error Invalid
> argument
>
> Program received signal SIGABRT, Aborted.
>
> I found the bug:
> Current code:
> timer_settime(&tp->timerid, 0, &ispec, NULL)
> (timer_create some lines above also uses &tp->timerid to get the new
> timerid).
>
> Correct code:
> timer_settime(tp->timerid, 0, &ispec, NULL)
> Note no "&" on the timerid variable.
>
> This code was copied from the old timer implementation and has worked
> on x86-64 and ARMv7a (and other architectures?). And the compiler
> doesn't complain...
>
> 660 ispec.it_value.tv_nsec    = (long)nsec;
> (gdb)
> 662 if (timer_settime(tp->timerid, 0, &ispec, NULL))
> (gdb)
> 665 }
>
>
> >
> > Best regards,
> >
> > Ola D
> >
> > _______________________________________________
> > lng-odp mailing list
> > [email protected]
> > http://lists.linaro.org/mailman/listinfo/lng-odp
>
> _______________________________________________
> lng-odp mailing list
> [email protected]
> http://lists.linaro.org/mailman/listinfo/lng-odp
>



-- 
*Mike Holmes*
Linaro  Sr Technical Manager
LNG - ODP
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to