From: Paolo Bonzini <pbonzini@redhat.com>
To: Alex Bligh <alex@alex.org.uk>, Mike Day <ncmike@ncultra.org>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/2] [RFC] Convert Clock Timerlists to RCU V2
Date: Mon, 03 Mar 2014 15:14:10 +0100 [thread overview]
Message-ID: <53148E32.1030905@redhat.com> (raw)
In-Reply-To: <4191BEBA-A5A5-4F29-8FD5-DB62A7F78EF7@alex.org.uk>
Il 28/02/2014 21:05, Alex Bligh ha scritto:
> Mike
>
> On 27 Feb 2014, at 19:35, Mike Day wrote:
>
>> timerlists is a list of lists that holds active timers, among other
>> items. It is read-mostly. This patch converts read access to the
>> timerlists to use RCU.
>>
>> Rather than introduce a second mutex for timerlists, which would
>> require nested mutexes to in orderwrite to the timerlists, use one
>> QemuMutex in the QemuClock structure for all write access to any list
>> hanging off the QemuClock structure.
>
> I sort of wonder why you don't just use one Mutex across the whole
> of QEMU rather than one per clock.
I think this is not enough; separate iothreads could have separate
timerlist, and higher-priority iothreads should not be slowed down by
lower-priority iothreads.
>> QEMUClockType timerlist_get_clock(QEMUTimerList *timer_list)
>> {
>> - return timer_list->clock->type;
>> + return atomic_rcu_read(&timer_list->clock->type);
>> }
>
> I don't think this works because of the double indirection.
It doesn't but you can of course do this:
QEMUClock *clock = atomic_rcu_read(&timer_list->clock);
return atomic_rcu_read(&clock->type);
> It's The '&' means it's not actually dereferencing clock->type, but it
> is dereferencing timer_list->clock outside of either an rcu read
> lock or an atomic read. I think you'd be better with than
> rcu_read_lock() etc. (sadly).
You could also assume that the caller does it. Right now, this function
has no user, so you just have to document it.
>> QEMUTimerList *qemu_clock_get_main_loop_timerlist(QEMUClockType type)
>> @@ -261,11 +272,13 @@ QEMUTimerList *qemu_clock_get_main_loop_timerlist(QEMUClockType type)
>>
>> void timerlist_notify(QEMUTimerList *timer_list)
>> {
>> - if (timer_list->notify_cb) {
>> + rcu_read_lock();
>> + if (atomic_rcu_read(&timer_list->notify_cb)) {
>> timer_list->notify_cb(timer_list->notify_opaque);
>> } else {
>> qemu_notify_event();
>> }
>> + rcu_read_unlock();
>> }
>
> If you have the rcu_read_lock why do you need the atomic_rcu_read?
> And if you need it, why do you not need it on the following line?
Read the documentation. :) It was also posted on the list.
atomic_rcu_read() is only about blocking invalid compiler optimizations;
it is not required if you are in the *write* side, but it is always
required in the read side.
However, I agree that it is not needed here. atomic_rcu_read() is not
needed when reading a "leaf" element of the data structure.
> However, as any QEMUTimerList can (now) be reclaimed, surely all
> callers of this function are going to need to hold the rcu_read_lock
> anyway?
>
> I think this is used only by timerlist_rearm and qemu_clock_notify.
> Provided these call this function holding the rcu_read_lock
> I don't think this function needs changing.
Yes.
Paolo
prev parent reply other threads:[~2014-03-03 14:14 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-27 19:35 [Qemu-devel] [PATCH 0/2] [RFC] Convert Clock lists to RCU (V2) Mike Day
2014-02-27 19:35 ` [Qemu-devel] [PATCH 1/2] [RFC] Convert active timers list to use RCU V2 Mike Day
2014-02-28 18:51 ` Alex Bligh
2014-02-27 19:35 ` [Qemu-devel] [PATCH 2/2] [RFC] Convert Clock Timerlists to " Mike Day
2014-02-28 20:05 ` Alex Bligh
2014-03-03 14:02 ` Mike Day
2014-03-03 14:14 ` Paolo Bonzini [this message]
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=53148E32.1030905@redhat.com \
--to=pbonzini@redhat.com \
--cc=alex@alex.org.uk \
--cc=ncmike@ncultra.org \
--cc=qemu-devel@nongnu.org \
/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.