[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 04/11] translate: downgrade IRQ BQL asserts t
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [PATCH v2 04/11] translate: downgrade IRQ BQL asserts to tcg_debug_assert |
Date: |
Fri, 03 Mar 2017 11:05:39 +0000 |
User-agent: |
mu4e 0.9.19; emacs 25.2.7 |
Peter Maydell <address@hidden> writes:
> On 2 March 2017 at 19:53, Alex Bennée <address@hidden> wrote:
>> While on MTTCG hosts it is very important that updates to
>> cpu->interrupt_request are protected by the BQL not all guests have
>> been converted to the correct locking yet. As a result we are seeing
>> breaking on non-MTTCG enabled guests in production builds.
>>
>> The locking in the guests needs to be fixed but while running single
>> threaded they will continue to work. By moving the asserts to
>> tcg_debug_asserts() they will still be useful during conversion
>> work (much like the existing assert_memory_lock/assert_tb_lock
>> asserts).
>>
>> Signed-off-by: Alex Bennée <address@hidden>
>> ---
>> translate-all.c | 2 +-
>> translate-common.c | 3 ++-
>> 2 files changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/translate-all.c b/translate-all.c
>> index 9bac061c9b..7ee273410d 100644
>> --- a/translate-all.c
>> +++ b/translate-all.c
>> @@ -1928,7 +1928,7 @@ void dump_opcount_info(FILE *f, fprintf_function
>> cpu_fprintf)
>>
>> void cpu_interrupt(CPUState *cpu, int mask)
>> {
>> - g_assert(qemu_mutex_iothread_locked());
>> + tcg_debug_assert(qemu_mutex_iothread_locked());
>
> If CONFIG_DEBUG_TCG isn't enabled then tcg_debug_assert()
> turns into "if (!(X)) { __builtin_unreachable(); }", which
> means that instead of asserting we now run straight
> into compiler undefined behaviour, don't we?
According to the commit that added it
(c552d6c038f7cf4058d1fd5987118ffd41e0e050) it is meant to be a hint to
the compiler. Reading the GCC notes however seems to contradict that.
FWIW I did test it in both builds and we do used tese for a bunch of
other asserts and they haven't blown up.
> If what we want is "don't actually check this condition in
> the non-tcg-debug config" then we should do something
> that means we don't actually check the condition...
Hmm:
28 intptr_t qemu_real_host_page_mask;
29
30 #ifndef CONFIG_USER_ONLY
31 /* mask must never be zero, except for A20 change call */
32 static void tcg_handle_interrupt(CPUState *cpu, int mask)
33 {
34 int old_mask;
35 tcg_debug_assert(qemu_mutex_iothread_locked());
36
37 old_mask = cpu->interrupt_request;
Line 34 of "/home/alex/lsrc/qemu/qemu.git/translate-common.c" is at address
0x24db0a <tcg_handle_interrupt+10> but contains no code.
Line 35 of "/home/alex/lsrc/qemu/qemu.git/translate-common.c" starts at address
0x24db0a <tcg_handle_interrupt+10> and ends at 0x24db0f
<tcg_handle_interrupt+15>.
Line 36 of "/home/alex/lsrc/qemu/qemu.git/translate-common.c" is at address
0x24db0f <tcg_handle_interrupt+15> but contains no code.
Line 37 of "/home/alex/lsrc/qemu/qemu.git/translate-common.c" starts at address
0x24db0f <tcg_handle_interrupt+15> and ends at 0x24db15
<tcg_handle_interrupt+21>.
0x24db0a <tcg_handle_interrupt+10>: callq 0x27a570
<qemu_mutex_iothread_locked>
0x24db0f <tcg_handle_interrupt+15>: mov 0xa8(%rbx),%ebp
0x24db15 <tcg_handle_interrupt+21>: mov %r12d,%eax
0x24db18 <tcg_handle_interrupt+24>: mov %rbx,%rdi
0x24db1b <tcg_handle_interrupt+27>: or %ebp,%eax
0x24db1d <tcg_handle_interrupt+29>: mov %eax,0xa8(%rbx)
0x24db23 <tcg_handle_interrupt+35>: callq 0x27a530 <qemu_cpu_is_self>
It certainly looks as though it makes the call but ignores the result?
>
> thanks
> -- PMM
--
Alex Bennée
[Qemu-devel] [PATCH v2 02/11] target/i386/cpu.h: declare TCG_GUEST_DEFAULT_MO, Alex Bennée, 2017/03/02
[Qemu-devel] [PATCH v2 03/11] cpus.c: add additional error_report when !TARGET_SUPPORT_MTTCG, Alex Bennée, 2017/03/02
[Qemu-devel] [PATCH v2 05/11] translate-all: exit cpu_restore_state early if translating, Alex Bennée, 2017/03/02