On 2025/11/14 2:30, Peter Xu wrote:
Hi, Akihiko,
I found that you replied to me and forgot to cc all, I added all of the
people back.
On Sun, Nov 09, 2025 at 06:05:00PM +0900, Akihiko Odaki wrote:
On 2025/11/08 10:45, Akihiko Odaki wrote:
On 2025/11/07 6:52, Peter Xu wrote:
When I was having a closer look, I found some other issues, I'll list it
all here.
1. I found that rcu_gp_event was initialized as "true". I'm not sure
whether it should be false. This has nothing to do with your
series as
well, only some observation of mine.
qemu_event_init(&rcu_gp_event, true);
Indeed it makes more sense to initialize it with false.
rcu_read_unlock() sets the event only in grace periods, and
wait_for_readers() always reset it when ending those grace periods. By
initializing it with false, the event will be false whenever outside
grace periods, improving consistency.
Thanks for confirming this. AFAIU this isn't a huge deal, as
wait_for_readers() should be tolerant of false positives. So I'll leave it
to you on whether to touch it together.
It's just one-line change so I'll include it in the next version of this
series.
2. It looks to me your patch here checked the wrong retval of
qemu_event_timedwait()..
} else if (qatomic_read(&rcu_call_count) >= RCU_CALL_MIN_SIZE ||
!sleeps || qemu_event_timedwait(&sync_event, 10)) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
should it be "!qemu_event_timedwait(&sync_event, 10)"? Side
note: maybe
we should cleanup all _timedwait() for QEMU's eventfd, sem, cond,
... because they don't return the same retval.. but if you think
sem is
good, then we don't need eventfd's timedwait() in this series (your
initial two patches).
You are right here too. This is a stupid mistake.
No, the original patch is right. qemu_event_timedwait(&sync_event, 10)
returning true means that the forced variable was set before timing out,
hence the we need to enter the force quiescent state.
You're correct. I got misleaded by the comment here:
/*
* Now one of the following heuristical conditions is satisfied:
* - A decent number of callbacks piled up.
* - It timed out. <--------------------
* - force_rcu() was called.
*
* Force a quiescent state.
*/
I'm guessing you got misleaded too when I raised the question and when you
were looking. Maybe it means it would be good to change that line of
comment into:
* - It timed out continuously 5 times (causing sleeps==0)
Mentioning the sleeps variable makes sense.
3. I doubt if malloc_trim() feature is broken with your current patchset,
because now the loop looks like:
for (;;) {
qemu_event_reset(&sync_event);
n = qatomic_read(&rcu_call_count);
if (n) {
break;
}
#if defined(CONFIG_MALLOC_TRIM)
malloc_trim(4 * 1024 * 1024);
#endif
qemu_event_wait(&sync_event);
}
I don't know if n can be zero here at all.. if you use the sem change
this might trigger but it's not designed for it. When using sem
we may
want to periodically trim. But I'd like to know how you think in
general
on the sem idea first (e.g. do we need to be prepared for high
freq rcu
frees).
malloc_trim() is triggered when the RCU thread is idle, and that is not
changed with this patch.
You're right, I read it wrong. Please ignore this comment.
Thanks,