[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-arm] qemu_futex_wait() lockups in ARM64: 2 possible issues
From: |
Rafael David Tinoco |
Subject: |
Re: [Qemu-arm] qemu_futex_wait() lockups in ARM64: 2 possible issues |
Date: |
Wed, 11 Sep 2019 11:48:09 -0300 |
User-agent: |
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 |
> Note that the RCU thread is expected to sit most of the time doing
> nothing, so I don't think this matters.
Agreed.
> Zhengui's theory that notify_me doesn't work properly on ARM is more
> promising, but he couldn't provide a clear explanation of why he thought
> notify_me is involved. In particular, I would have expected notify_me to
> be wrong if the qemu_poll_ns call came from aio_ctx_dispatch, for example:
>
>
> glib_pollfds_fill
> g_main_context_prepare
> aio_ctx_prepare
> atomic_or(&ctx->notify_me, 1)
> qemu_poll_ns
> glib_pollfds_poll
> g_main_context_check
> aio_ctx_check
> atomic_and(&ctx->notify_me, ~1)
> g_main_context_dispatch
> aio_ctx_dispatch
> /* do something for event */
> qemu_poll_ns
>
Yep, will focus there.
>
> Can you place somewhere your util/async.o object file for me to look at it?
Sure!
https://send.firefox.com/download/45c26bbe1075eea1/#ZD_e_96imPG2QuDqaX-jhg
Note: this async.o has value as int, EV_BUSY as 3, aborts if any errno
in qemu_futex() and uses &ev->value as 1st argument to wake/wait (as in
https://pastebin.ubuntu.com/p/xk8D6H6kgM/).
>
> You could change it to 3, but it has to have all the bits in EV_FREE
> (see atomic_or(&ev->value, EV_FREE) in qemu_event_reset).
>
> You could also change it to -1u, but I don't see a particular need to do so.
>
Yep, it was a dead end on my side.
>> - Should qemu_event_set() check return code from
>> qemu_futex_wake()->qemu_futex()->syscall() in order to know if ANY
>> waiter was ever woken up ? Maybe even loop until at least 1 is awaken ?
>
> Why would it need to do so?
>
No need, just realized after I saw no tasks waking that thread up. Like
you said, ctx->notify_me seems more promising, will give it a try.