On 07/01/15 20:17, Mike Holmes wrote:
odp_timer fails periodically with segfaults in CI

https://bugs.linaro.org/show_bug.cgi?id=1615

You can replicate on my machine by running a load and then running this a few times until it pops, I assume sometimes the CI build machines are also loaded and it surfaces as an issue. This is seen on ARM and X86 HW


Can you get core dump for that?

Maxim.

On 1 July 2015 at 12:03, Ola Liljedahl <[email protected] <mailto:[email protected]>> wrote:

    On 30 June 2015 at 12:16, Ivan Khoronzhuk
    <[email protected] <mailto:[email protected]>>
    wrote:

        It's more generic implementation simplify reusing timer API
        for other platforms.

        Signed-off-by: Ivan Khoronzhuk <[email protected]
        <mailto:[email protected]>>

    Reviewed-by: Ola Liljedahl <[email protected]
    <mailto:[email protected]>>

        -


    I got a (spurious) segmentation fault from the timer validation
    program but this was after the actual timer tests had been
    performed. Running on a quad-threaded Haswell Core i7 running
    Ubuntu 15.04.

    odp_timer.c:484:test_odp_timer_all():#timers..: 2000
    odp_timer.c:486:test_odp_timer_all():Tmo range: 2000 ms (600 ticks)
    odp_timer.c:393:worker_entrypoint():Thread 1: 2512 timers set
    odp_timer.c:394:worker_entrypoint():Thread 1: 442 timers reset
    odp_timer.c:395:worker_entrypoint():Thread 1: 446 timers cancelled
    odp_timer.c:397:worker_entrypoint():Thread 1: 0 timers
    reset/cancelled too late
    odp_timer.c:398:worker_entrypoint():Thread 1: 1359 timeouts received
    odp_timer.c:400:worker_entrypoint():Thread 1: 0 stale timeout(s)
    after odp_timer_free()
    odp_timer.c:432:worker_entrypoint():Thread 1: exiting
    odp_timer.c:393:worker_entrypoint():Thread 3: 2537 timers set
    odp_timer.c:394:worker_entrypoint():Thread 3: 424 timers reset
    odp_timer.c:395:worker_entrypoint():Thread 3: 439 timers cancelled
    odp_timer.c:397:worker_entrypoint():Thread 3: 0 timers
    reset/cancelled too late
    odp_timer.c:398:worker_entrypoint():Thread 3: 1394 timeouts received
    odp_timer.c:400:worker_entrypoint():Thread 3: 1 stale timeout(s)
    after odp_timer_free()
    odp_timer.c:393:worker_entrypoint():Thread 2: 2535 timers set
    odp_timer.c:394:worker_entrypoint():Thread 2: 442 timers reset
    odp_timer.c:395:worker_entrypoint():Thread 2: 423 timers cancelled
    odp_timer.c:397:worker_entrypoint():Thread 2: 0 timers
    reset/cancelled too late
    odp_timer.c:398:worker_entrypoint():Thread 2: 1373 timeouts received
    odp_timer.c:400:worker_entrypoint():Thread 2: 0 stale timeout(s)
    after odp_timer_free()
    odp_timer.c:432:worker_entrypoint():Thread 3: exiting
    odp_timer.c:432:worker_entrypoint():Thread 2: exiting
    odp_timer.c:511:test_odp_timer_all():Number of timeouts
    delivered/received too late: 0
    passedSegmentation fault (core dumped)

    I assume this "passed" is printed by the following call which is
    last in the test_odp_timer_all test case. Something wrong in Cunit
    or the ODP test/validation framework?
            CU_PASS("ODP timer test");
    }

    Only happened once... If you can't reproduce it, you can't fix it.
    Maybe it was radiation from outer space.

        --

        I've checked this patch with Keystone implementation.

         .../linux-generic/include/odp_timer_internal.h    |  9 -------
         platform/linux-generic/odp_timer.c      | 31
        ++++++++++++----------
         2 files changed, 17 insertions(+), 23 deletions(-)

        diff --git
        a/platform/linux-generic/include/odp_timer_internal.h
        b/platform/linux-generic/include/odp_timer_internal.h
        index 90af62c..8b0e93d 100644
        --- a/platform/linux-generic/include/odp_timer_internal.h
        +++ b/platform/linux-generic/include/odp_timer_internal.h
        @@ -39,13 +39,4 @@ typedef struct odp_timeout_hdr_stride {
                uint8_t
        pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(odp_timeout_hdr_t))];
         } odp_timeout_hdr_stride;

        -
        -/**
        - * Return the timeout header
        - */
        -static inline odp_timeout_hdr_t *odp_timeout_hdr(odp_buffer_t
        buf)
        -{
        -       return (odp_timeout_hdr_t *)odp_buf_to_hdr(buf);
        -}
        -
         #endif
        diff --git a/platform/linux-generic/odp_timer.c
        b/platform/linux-generic/odp_timer.c
        index bd1b778..68d7b11 100644
        --- a/platform/linux-generic/odp_timer.c
        +++ b/platform/linux-generic/odp_timer.c
        @@ -78,7 +78,13 @@ static _odp_atomic_flag_t locks[NUM_LOCKS];
        /* Multiple locks per cache line! */

         static odp_timeout_hdr_t *timeout_hdr_from_buf(odp_buffer_t buf)
         {
        -       return (odp_timeout_hdr_t *)odp_buf_to_hdr(buf);
        +       return (odp_timeout_hdr_t *)(void *)odp_buf_to_hdr(buf);
        +}
        +
        +static odp_timeout_hdr_t *timeout_hdr(odp_timeout_t tmo)
        +{
        +       odp_buffer_t buf =
        odp_buffer_from_event(odp_timeout_to_event(tmo));
        +       return timeout_hdr_from_buf(buf);
         }

         
/******************************************************************************
        @@ -421,7 +427,8 @@ static bool timer_reset(uint32_t idx,
                } else {
                        /* We have a new timeout buffer which replaces
        any old one */
                        /* Fill in some (constant) header fields for
        timeout events */
        -               if (_odp_buffer_type(*tmo_buf) ==
        ODP_EVENT_TIMEOUT) {
        +               if
        (odp_event_type(odp_buffer_to_event(*tmo_buf)) ==
        +                   ODP_EVENT_TIMEOUT) {
                                /* Convert from buffer to timeout hdr */
                                odp_timeout_hdr_t *tmo_hdr =
        timeout_hdr_from_buf(*tmo_buf);
        @@ -566,7 +573,8 @@ static unsigned
        timer_expire(odp_timer_pool *tp, uint32_t idx, uint64_t tick)
         #endif
                if (odp_likely(tmo_buf != ODP_BUFFER_INVALID)) {
                        /* Fill in expiration tick for timeout events */
        -               if (_odp_buffer_type(tmo_buf) ==
        ODP_EVENT_TIMEOUT) {
        +               if
        (odp_event_type(odp_buffer_to_event(tmo_buf)) ==
        +                   ODP_EVENT_TIMEOUT) {
                                /* Convert from buffer to timeout hdr */
                                odp_timeout_hdr_t *tmo_hdr =
        timeout_hdr_from_buf(tmo_buf);
        @@ -815,19 +823,17 @@ odp_timeout_t
        odp_timeout_from_event(odp_event_t ev)
                /* This check not mandated by the API specification */
                if (odp_event_type(ev) != ODP_EVENT_TIMEOUT)
                        ODP_ABORT("Event not a timeout");
        -       return
        (odp_timeout_t)timeout_hdr_from_buf(odp_buffer_from_event(ev));
        +       return (odp_timeout_t)ev;
         }

         odp_event_t odp_timeout_to_event(odp_timeout_t tmo)
         {
        -       odp_timeout_hdr_t *tmo_hdr = (odp_timeout_hdr_t *)tmo;
        -       odp_buffer_t buf = odp_hdr_to_buf(&tmo_hdr->buf_hdr);
        -       return odp_buffer_to_event(buf);
        +       return (odp_event_t)tmo;
         }

         int odp_timeout_fresh(odp_timeout_t tmo)
         {
        -       const odp_timeout_hdr_t *hdr = (odp_timeout_hdr_t *)tmo;
        +       const odp_timeout_hdr_t *hdr = timeout_hdr(tmo);
                odp_timer_t hdl = hdr->timer;
                odp_timer_pool *tp = handle_to_tp(hdl);
                uint32_t idx = handle_to_idx(hdl, tp);
        @@ -840,20 +846,17 @@ int odp_timeout_fresh(odp_timeout_t tmo)

         odp_timer_t odp_timeout_timer(odp_timeout_t tmo)
         {
        -       const odp_timeout_hdr_t *hdr = (odp_timeout_hdr_t *)tmo;
        -       return hdr->timer;
        +       return timeout_hdr(tmo)->timer;
         }

         uint64_t odp_timeout_tick(odp_timeout_t tmo)
         {
        -       const odp_timeout_hdr_t *hdr = (odp_timeout_hdr_t *)tmo;
        -       return hdr->expiration;
        +       return timeout_hdr(tmo)->expiration;
         }

         void *odp_timeout_user_ptr(odp_timeout_t tmo)
         {
        -       const odp_timeout_hdr_t *hdr = (odp_timeout_hdr_t *)tmo;
        -       return hdr->user_ptr;
        +       return timeout_hdr(tmo)->user_ptr;
         }

         odp_timeout_t odp_timeout_alloc(odp_pool_t pool)
        --
        1.9.1



    _______________________________________________
    lng-odp mailing list
    [email protected] <mailto:[email protected]>
    https://lists.linaro.org/mailman/listinfo/lng-odp




--
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/>***│ *Open source software for ARM SoCs



_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to