All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Seiderer <ps.report@gmx.net>
To: buildroot@busybox.net
Subject: [Buildroot] issue with timer_create and openblas after update buildroot from 2019_02 to 2021_02
Date: Fri, 9 Apr 2021 00:59:19 +0200	[thread overview]
Message-ID: <20210409005919.56690265@gmx.net> (raw)
In-Reply-To: <CAGpqJgqZBG5qMZDaS59syis2y1rm53f1KMWYzJKiwepHcJbadA@mail.gmail.com>

Hello Arthur,

On Wed, 7 Apr 2021 11:01:59 +0200, Arthur Lambert <lambertarthur22@gmail.com> wrote:

> I am trying to update buildroot from 2019_02 tag to 2021_02. After the
> update I have
> some issue with timer_create function  from uclibc . I get -1 return error
> with  EAGAIN errno.
> The error only occurred with SIGEV_THREAD type.
>
> I was able to track the code responsible from the error without
> understanding the reason
>
> output/build/uclibc-1.0.37/libpthread/nptl/sysdeps/unix/sysv/linux/timer_create.c
> line-150
>
> >>     {
> >>     /* Create the helper thread.  */
> >>     pthread_once (&__helper_once, __start_helper_thread);
> >>     if (__helper_tid == 0)
> >> {
> >>  /* No resources to start the helper thread.  */
> >>  __set_errno (EAGAIN);
> >>  return -1;
> >> }
>
> I am was also able to reproduce the issue with a minimalist piece of code.
> The issue seems
> to be related to openblas. I dont see the link between BLAS and
> thread/timer issue ??
>
> >> #include <stdlib.h>
> >> #include <unistd.h>
> >> #include <stdio.h>
> >> #include <signal.h>
> >> #include <time.h>
> >>
> >>
> >> int main(void)
> >> {
> >>
> >> struct sigevent alarm_sigevt;
> >> timer_t alarm_timer;
> >> int ret = 0;
> >>
> >> alarm_sigevt.sigev_notify = SIGEV_THREAD;
> >> alarm_sigevt.sigev_notify_function = NULL;
> >> alarm_sigevt.sigev_notify_attributes = NULL;
> >> alarm_sigevt.sigev_value.sival_ptr =  NULL;
> >> ret = timer_create(CLOCK_REALTIME, &alarm_sigevt, &alarm_timer);
> >> printf ("ret : %d\n", ret);
> >>
> >> exit(EXIT_SUCCESS);
> >> }
>
> I compile the code like this :
>
> /home/arthur/work/buildroot/atto_dreem3_dev/output/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc
> test_timer.c -o test_timer
>
> I run the binary on my arm target :
>
> # ./test_timer
> ret : 0
> #
>
> Everything is working fine here.

The strace log looks like the following:

[...]
235   stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=28408, ...}) = 0
235   mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f6b000
235   set_tls(0xb6f6b490)               = 0
235   mprotect(0x20000, 4096, PROT_READ) = 0
235   mprotect(0xb6f40000, 4096, PROT_READ) = 0
235   mprotect(0xb6f6d000, 4096, PROT_READ) = 0
235   set_tid_address(0xb6f6b068)       = 235
235   set_robust_list(0xb6f6b06c, 12)   = 0
235   rt_sigaction(SIGRTMIN, {sa_handler=0xb6f239e8, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0xb6ed4908}, NULL, 8) = 0
235   rt_sigaction(SIGRT_1, {sa_handler=0xb6f23aac, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0xb6ed4908}, NULL, 8) = 0
235   rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
235   ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
235   ioctl(0, TCGETS, {B115200 opost isig icanon echo ...}) = 0
235   ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
235   rt_sigprocmask(SIG_SETMASK, ~[RT_1], [], 8) = 0
235   mmap2(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xb6f67000
235   brk(NULL)                         = 0x1934000
235   brk(0x1935000)                    = 0x1935000
235   mprotect(0xb6f67000, 4096, PROT_NONE) = 0
235   clone(child_stack=0xb6f6a038, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tid=[236], tls=0xb6f6a960, child_tidptr=0xb6f6a538) = 236
235   rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
235   futex(0xb6f57824, FUTEX_WAKE_PRIVATE, 2147483647) = 0
235   timer_create(CLOCK_REALTIME, {sigev_value={sival_int=26427544, sival_ptr=0x1934098}, sigev_signo=SIGRTMIN, sigev_notify=SIGEV_THREAD_ID, sigev_notify_thread_id=236}, [0]) = 0
235   write(1, "ret : 0\n", 8)          = 8
235   exit_group(0)                     = ?
236   +++ exited with 0 +++
235   +++ exited with 0 +++

> I just add openblas library now :
>
> /home/arthur/work/buildroot/atto_dreem3_dev/output/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc
> test_timer.c -o test_timer -lopenblas
>
> I now run the new binary :
>
> # ./test_timer
> ret : -1
>
> An issue with openblas which init too many timer ?

The strace log looks like the following:

[...]
240   stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=28408, ...}) = 0
240   mmap2(NULL, 64304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6d0d000
240   mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f93000
240   set_tls(0xb6d0d490)               = 0
240   mprotect(0x20000, 4096, PROT_READ) = 0
240   mprotect(0xb6f7b000, 8192, PROT_READ) = 0
240   mprotect(0xb6d9b000, 4096, PROT_READ) = 0
240   mprotect(0xb6f95000, 4096, PROT_READ) = 0
240   set_tid_address(0xb6d0d068)       = 240
240   set_robust_list(0xb6d0d06c, 12)   = 0
240   rt_sigaction(SIGRTMIN, {sa_handler=0xb6d7e9e8, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0xb6d2f908}, NULL, 8) = 0
240   rt_sigaction(SIGRT_1, {sa_handler=0xb6d7eaac, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0xb6d2f908}, NULL, 8) = 0
240   rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
240   ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
240   ioctl(0, TCGETS, {B115200 opost isig icanon echo ...}) = 0
240   ioctl(1, TCGETS, {B115200 opost isig icanon echo ...}) = 0
240   open("/sys/devices/system/cpu", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
240   fstat64(3, {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
240   fcntl(3, F_SETFD, FD_CLOEXEC)     = 0
240   brk(NULL)                         = 0x1485000
240   brk(0x1486000)                    = 0x1486000
240   brk(0x1487000)                    = 0x1487000
240   getdents64(3, 0xbed7fa28 /* 13 entries */, 4096) = 392
240   getdents64(3, 0xbed7fa28 /* 0 entries */, 4096) = 0
240   close(3)                          = 0
240   rt_sigprocmask(SIG_SETMASK, ~[RT_1], [], 8) = 0
240   rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
240   futex(0xb6db2824, FUTEX_WAKE_PRIVATE, 2147483647) = 0
240   write(1, "ret : -1\n", 9)         = 9
240   exit_group(0)                     = ?
240   +++ exited with 0 +++

No clone() and no timer_create() syscall...., but the syscall sequence from
open("/sys/devices/system/cpu",...) to getdents64()/close() looks like the
nprocessors_conf() implementation from uclibc-1.0.38/libc/unistd/sysconf.c...,
strange....

Regards,
Peter

  reply	other threads:[~2021-04-08 22:59 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-07  9:01 [Buildroot] issue with timer_create and openblas after update buildroot from 2019_02 to 2021_02 Arthur Lambert
2021-04-08 22:59 ` Peter Seiderer [this message]
2021-04-09  7:53   ` Arthur Lambert
2021-04-09 19:18     ` Peter Seiderer
2021-04-13 19:52       ` Peter Seiderer
2021-04-16 21:26         ` Peter Seiderer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210409005919.56690265@gmx.net \
    --to=ps.report@gmx.net \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.