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