From: "Alex Bennée" <alex.bennee@linaro.org>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Doug Gale <doug16k@gmail.com>,
qemu-devel@nongnu.org, Richard Henderson <rth@twiddle.net>
Subject: Re: [PATCH] cpus: kick all vCPUs when running thread=single
Date: Tue, 01 Oct 2019 18:40:13 +0100 [thread overview]
Message-ID: <874l0sl5z6.fsf@linaro.org> (raw)
In-Reply-To: <5582c91e-ac0e-9f74-a3de-82f7fe25fadd@redhat.com>
Paolo Bonzini <pbonzini@redhat.com> writes:
> On 01/10/19 18:04, Alex Bennée wrote:
>> qemu_cpu_kick is used for a number of reasons including to indicate
>> there is work to be done. However when thread=single the old
>> qemu_cpu_kick_rr_cpu only advanced the vCPU to the next executing one
>> which can lead to a hang in the case that:
>>
>> a) the kick is from outside the vCPUs (e.g. iothread)
>> b) the timers are paused (i.e. iothread calling run_on_cpu)
>>
>> To avoid this lets split qemu_cpu_kick_rr into two functions. One for
>> the timer which continues to advance to the next timeslice and another
>> for all other kicks.
>>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> Cc: Doug Gale <doug16k@gmail.com>
>> Cc: Paolo Bonzini <pbonzini@redhat.com>
>> Cc: Peter Maydell <peter.maydell@linaro.org>
>> ---
>> cpus.c | 24 ++++++++++++++++++------
>> 1 file changed, 18 insertions(+), 6 deletions(-)
>
> Looks good to me. Single-threaded TCG is not going to have high vCPU
> counts anyway.
Are you going to take this via your queue?
>
> Paolo
>
>> diff --git a/cpus.c b/cpus.c
>> index d2c61ff155..bee7209134 100644
>> --- a/cpus.c
>> +++ b/cpus.c
>> @@ -949,8 +949,8 @@ static inline int64_t qemu_tcg_next_kick(void)
>> return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + TCG_KICK_PERIOD;
>> }
>>
>> -/* Kick the currently round-robin scheduled vCPU */
>> -static void qemu_cpu_kick_rr_cpu(void)
>> +/* Kick the currently round-robin scheduled vCPU to next */
>> +static void qemu_cpu_kick_rr_next_cpu(void)
>> {
>> CPUState *cpu;
>> do {
>> @@ -961,6 +961,16 @@ static void qemu_cpu_kick_rr_cpu(void)
>> } while (cpu != atomic_mb_read(&tcg_current_rr_cpu));
>> }
>>
>> +/* Kick all RR vCPUs */
>> +static void qemu_cpu_kick_rr_cpus(void)
>> +{
>> + CPUState *cpu;
>> +
>> + CPU_FOREACH(cpu) {
>> + cpu_exit(cpu);
>> + };
>> +}
>> +
>> static void do_nothing(CPUState *cpu, run_on_cpu_data unused)
>> {
>> }
>> @@ -993,7 +1003,7 @@ void qemu_timer_notify_cb(void *opaque, QEMUClockType type)
>> static void kick_tcg_thread(void *opaque)
>> {
>> timer_mod(tcg_kick_vcpu_timer, qemu_tcg_next_kick());
>> - qemu_cpu_kick_rr_cpu();
>> + qemu_cpu_kick_rr_next_cpu();
>> }
>>
>> static void start_tcg_kick_timer(void)
>> @@ -1828,9 +1838,11 @@ void qemu_cpu_kick(CPUState *cpu)
>> {
>> qemu_cond_broadcast(cpu->halt_cond);
>> if (tcg_enabled()) {
>> - cpu_exit(cpu);
>> - /* NOP unless doing single-thread RR */
>> - qemu_cpu_kick_rr_cpu();
>> + if (qemu_tcg_mttcg_enabled()) {
>> + cpu_exit(cpu);
>> + } else {
>> + qemu_cpu_kick_rr_cpus();
>> + }
>> } else {
>> if (hax_enabled()) {
>> /*
>>
--
Alex Bennée
next prev parent reply other threads:[~2019-10-01 17:43 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-01 16:04 [PATCH] cpus: kick all vCPUs when running thread=single Alex Bennée
2019-10-01 16:38 ` Paolo Bonzini
2019-10-01 17:40 ` Alex Bennée [this message]
2019-10-06 16:05 ` Paolo Bonzini
2019-10-07 14:00 ` Richard Henderson
2019-10-07 14:56 ` Paolo Bonzini
2019-10-07 15:30 ` Alex Bennée
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=874l0sl5z6.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=doug16k@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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.