From: "Alex Bennée" <alex.bennee@linaro.org>
To: Sven Schnelle <svens@linux.ibm.com>
Cc: David Hildenbrand <david@redhat.com>,
Janosch Frank <frankja@linux.ibm.com>,
Liam Howlett <liam.howlett@oracle.com>,
Heiko Carstens <hca@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>,
Andrew Morton <akpm@linux-foundation.org>,
Guenter Roeck <linux@roeck-us.net>,
"maple-tree@lists.infradead.org" <maple-tree@lists.infradead.org>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Yu Zhao <yuzhao@google.com>, Juergen Gross <jgross@suse.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Andreas Krebbel <krebbel@linux.ibm.com>,
Ilya Leoshkevich <iii@linux.ibm.com>,
Thomas Huth <thuth@redhat.com>,
richard.henderson@linaro.org, qemu-devel@nongnu.org,
qemu-s390x@nongnu.org
Subject: Re: qemu-system-s390x hang in tcg
Date: Wed, 29 Jun 2022 15:52:17 +0100 [thread overview]
Message-ID: <87v8sjh4t9.fsf@linaro.org> (raw)
In-Reply-To: <yt9d7d4zhddq.fsf@linux.ibm.com>
Sven Schnelle <svens@linux.ibm.com> writes:
> Sven Schnelle <svens@linux.ibm.com> writes:
>
>> Alex Bennée <alex.bennee@linaro.org> writes:
>>
>>> Sven Schnelle <svens@linux.ibm.com> writes:
>>>
>>>> Hi,
>>>>
>>>> David Hildenbrand <david@redhat.com> writes:
>>>>
>>>>> On 04.05.22 09:37, Janosch Frank wrote:
>>>>>> I had a short look yesterday and the boot usually hangs in the raid6
>>>>>> code. Disabling vector instructions didn't make a difference but a few
>>>>>> interruptions via GDB solve the problem for some reason.
>>>>>>
>>>>>> CCing David and Thomas for TCG
>>>>>>
>>>>>
>>>>> I somehow recall that KASAN was always disabled under TCG, I might be
>>>>> wrong (I thought we'd get a message early during boot that the HW
>>>>> doesn't support KASAN).
>>>>>
>>>>> I recall that raid code is a heavy user of vector instructions.
>>>>>
>>>>> How can I reproduce? Compile upstream (or -next?) with kasan support and
>>>>> run it under TCG?
>>>>
>>>> I spent some time looking into this. It's usually hanging in
>>>> s390vx8_gen_syndrome(). My first thought was that it is a problem with
>>>> the VX instructions, but turned out that it hangs even if i remove all
>>>> the code from s390vx8_gen_syndrome().
>>>>
>>>> Tracing the execution of TB's, i see that the generated code is always
>>>> jumping between a few TB's, but never exiting the TB's to check for
>>>> interrupts (i.e. return to cpu_tb_exec(). I only see calls to
>>>> helper_lookup_tb_ptr to lookup the tb pointer for the next TB.
>>>>
>>>> The raid6 code is waiting for some time to expire by reading jiffies,
>>>> but interrupts are never processed and therefore jiffies doesn't change.
>>>> So the raid6 code hangs forever.
>>>>
>>>> As a test, i made a quick change to test:
>>>>
>>>> diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
>>>> index c997c2e8e0..35819fd5a7 100644
>>>> --- a/accel/tcg/cpu-exec.c
>>>> +++ b/accel/tcg/cpu-exec.c
>>>> @@ -319,7 +319,8 @@ const void *HELPER(lookup_tb_ptr)(CPUArchState *env)
>>>> cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
>>>>
>>>> cflags = curr_cflags(cpu);
>>>> - if (check_for_breakpoints(cpu, pc, &cflags)) {
>>>> + if (check_for_breakpoints(cpu, pc, &cflags) ||
>>>> + unlikely(qatomic_read(&cpu->interrupt_request))) {
>>>> cpu_loop_exit(cpu);
>>>> }
>>>>
>>>> And that makes the problem go away. But i'm not familiar with the TCG
>>>> internals, so i can't say whether the generated code is incorrect or
>>>> something else is wrong. I have tcg log files of a failing + working run
>>>> if someone wants to take a look. They are rather large so i would have to
>>>> upload them somewhere.
>>>
>>> Whatever is setting cpu->interrupt_request should be calling
>>> cpu_exit(cpu) which sets the exit flag which is checked at the start of
>>> every TB execution (see gen_tb_start).
>>
>> Thanks, that was very helpful. I added debugging and it turned out
>> that the TB is left because of a pending irq. The code then calls
>> s390_cpu_exec_interrupt:
>>
>> bool s390_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
>> {
>> if (interrupt_request & CPU_INTERRUPT_HARD) {
>> S390CPU *cpu = S390_CPU(cs);
>> CPUS390XState *env = &cpu->env;
>>
>> if (env->ex_value) {
>> /* Execution of the target insn is indivisible from
>> the parent EXECUTE insn. */
>> return false;
>> }
>> if (s390_cpu_has_int(cpu)) {
>> s390_cpu_do_interrupt(cs);
>> return true;
>> }
>> if (env->psw.mask & PSW_MASK_WAIT) {
>> /* Woken up because of a floating interrupt but it has already
>> * been delivered. Go back to sleep. */
>> cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HALT);
>> }
>> }
>> return false;
>> }
>>
>> Note the 'if (env->ex_value) { }' check. It looks like this function
>> just returns false in case tcg is executing an EX instruction. After
>> that the information that the TB should be exited because of an
>> interrupt is gone. So the TB's are never exited again, although the
>> interrupt wasn't handled. At least that's my assumption now, if i'm
>> wrong please tell me.
>
> Looking at the code i see CF_NOIRQ to prevent TB's from getting
> interrupted. But i only see that used in the core tcg code. Would
> that be a possibility, or is there something else/better?
Yes CF_NOIRQ is exactly the compiler flag you would use to prevent a
block from exiting early when you absolutely want to execute the next
block. We currently only use it from core code to deal with icount
related things but I can see it's use here. I would probably still wrap
it in a common function in cpu-exec-common.c I'm unsure of the exact
semantics for s390 so I will defer to Richard and others but something
like (untested):
/*
* Ensure the next N instructions are not interrupted by IRQ checks.
*/
void cpu_loop_exit_unint(CPUState *cpu, uintptr_t pc, int len)
{
if (pc) {
cpu_restore_state(cpu, pc, true);
}
cpu->cflags_next_tb = len | CF_LAST_IO | CF_NOIRQ | curr_cflags(cpu);
cpu_loop_exit(cpu);
}
And then in HELPER(ex) you can end the helper with:
void HELPER(ex)(CPUS390XState *env, uint32_t ilen, uint64_t r1, uint64_t addr)
{
...
/*
* We must execute the next instruction exclusively so exit the loop
* and trigger a NOIRQ TB which won't check for an interrupt until
* it finishes executing.
*/
cpu_loop_exit_unint(cpu, 0, 1);
}
Some notes:
* Take care to ensure the CPU state is synchronised
Which means the helper cannot use the flags
TCG_CALL_NO_(READ_GLOBALS|WRITE_GLOBALS|SIDE_EFFECTS). And you you
will to make sure you write the current PC in the tcg gen code in
op_ex()
* I think the env->ex_value can be removed after this
* We will actually exit the execution loop (via a sigjmp) but the IRQ
check in cpu_handle_interrupt() will be skipped due to the custom
flags. When the next block is looked up (or generated) it will be
entered but then immediately exit
* I think even a branch to self should work because the second
iteration will be interuptable
> Sorry for the dumb questions, i'm not often working on qemu ;-)
There are no dumb questions, just opportunities for better documentation ;-)
--
Alex Bennée
next prev parent reply other threads:[~2022-06-29 15:23 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-26 15:06 [PATCH v8 00/70] Introducing the Maple Tree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 01/70] radix tree test suite: add pr_err define Liam Howlett
2022-04-26 15:06 ` [PATCH v8 02/70] radix tree test suite: add kmem_cache_set_non_kernel() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 05/70] radix tree test suite: add lockdep_is_held to header Liam Howlett
2022-04-26 15:06 ` [PATCH v8 04/70] radix tree test suite: add support for slab bulk APIs Liam Howlett
2022-04-26 15:06 ` [PATCH v8 03/70] radix tree test suite: add allocation counts and size to kmem_cache Liam Howlett
2022-04-26 15:06 ` [PATCH v8 06/70] mips: rename mt_init to mips_mt_init Liam Howlett
2022-04-26 15:06 ` [PATCH v8 07/70] Maple Tree: add new data structure Liam Howlett
2022-04-27 15:45 ` Liam Howlett
2022-04-26 15:06 ` [PATCH v8 08/70] lib/test_maple_tree: add testing for maple tree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 09/70] mm: start tracking VMAs with " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 11/70] mmap: use the VMA iterator in count_vma_pages_range() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 10/70] mm: add VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 12/70] mm/mmap: use the maple tree in find_vma() instead of the rbtree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 13/70] mm/mmap: use the maple tree for find_vma_prev() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 14/70] mm/mmap: use maple tree for unmapped_area{_topdown} Liam Howlett
2022-04-26 15:06 ` [PATCH v8 15/70] kernel/fork: use maple tree for dup_mmap() during forking Liam Howlett
2022-04-26 15:06 ` [PATCH v8 16/70] damon: Convert __damon_va_three_regions to use the VMA iterator Liam Howlett
2022-05-03 23:40 ` SeongJae Park
2022-04-26 15:06 ` [PATCH v8 17/70] proc: remove VMA rbtree use from nommu Liam Howlett
2022-04-26 15:06 ` [PATCH v8 18/70] mm: remove rb tree Liam Howlett
2022-04-26 15:06 ` [PATCH v8 19/70] mmap: change zeroing of maple tree in __vma_adjust() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 20/70] xen: use vma_lookup() in privcmd_ioctl_mmap() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 21/70] mm: optimize find_exact_vma() to use vma_lookup() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 22/70] mm/khugepaged: optimize collapse_pte_mapped_thp() by using vma_lookup() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 23/70] mm/mmap: change do_brk_flags() to expand existing VMA and add do_brk_munmap() Liam Howlett
2022-04-28 16:09 ` Guenter Roeck
2022-04-28 16:35 ` Liam Howlett
2022-04-28 17:13 ` Guenter Roeck
2022-04-28 20:19 ` Guenter Roeck
2022-04-29 0:38 ` Liam Howlett
2022-04-29 1:16 ` Andrew Morton
2022-05-02 0:14 ` Liam Howlett
2022-05-02 0:24 ` Andrew Morton
2022-05-02 10:18 ` Heiko Carstens
2022-05-02 13:31 ` Liam Howlett
2022-05-02 18:50 ` Heiko Carstens
2022-05-03 19:48 ` Heiko Carstens
2022-05-03 21:55 ` Liam Howlett
2022-05-04 7:37 ` Janosch Frank
2022-05-04 18:31 ` David Hildenbrand
2022-05-04 18:47 ` Liam Howlett
2022-06-29 7:04 ` qemu-system-s390x hang in tcg (was: Re: [PATCH v8 23/70] mm/mmap: change do_brk_flags() to expand existing VMA and add do_brk_munmap()) Sven Schnelle
2022-06-29 8:10 ` Alex Bennée
2022-06-29 10:46 ` qemu-system-s390x hang in tcg Sven Schnelle
2022-06-29 12:18 ` Sven Schnelle
2022-06-29 14:52 ` Alex Bennée [this message]
2022-06-30 3:03 ` Richard Henderson
2022-05-02 7:08 ` [PATCH v8 23/70] mm/mmap: change do_brk_flags() to expand existing VMA and add do_brk_munmap() Juergen Gross
2022-04-26 15:06 ` [PATCH v8 26/70] mm: remove vmacache Liam Howlett
2022-04-26 15:06 ` [PATCH v8 24/70] mm: use maple tree operations for find_vma_intersection() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 25/70] mm/mmap: use advanced maple tree API for mmap_region() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 28/70] mm/mmap: move mmap_region() below do_munmap() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 27/70] mm: convert vma_lookup() to use mtree_load() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 29/70] mm/mmap: reorganize munmap to use maple states Liam Howlett
2022-04-26 15:06 ` [PATCH v8 31/70] arm64: remove mmap linked list from vdso Liam Howlett
2022-04-26 15:06 ` [PATCH v8 30/70] mm/mmap: change do_brk_munmap() to use do_mas_align_munmap() Liam Howlett
2022-04-26 15:06 ` [PATCH v8 33/70] parisc: remove mmap linked list from cache handling Liam Howlett
2022-04-26 15:06 ` [PATCH v8 32/70] arm64: Change elfcore for_each_mte_vma() to use VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 34/70] powerpc: remove mmap linked list walks Liam Howlett
2022-04-26 15:06 ` [PATCH v8 35/70] s390: remove vma " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 38/70] cxl: remove vma linked list walk Liam Howlett
2022-04-26 15:06 ` [PATCH v8 36/70] x86: remove vma linked list walks Liam Howlett
2022-04-26 15:06 ` [PATCH v8 37/70] xtensa: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 39/70] optee: remove vma linked list walk Liam Howlett
2022-04-26 15:06 ` [PATCH v8 40/70] um: " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 42/70] exec: use VMA iterator instead of linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 43/70] fs/proc/base: use maple tree iterators in place " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 41/70] coredump: remove vma linked list walk Liam Howlett
2022-04-26 15:06 ` [PATCH v8 44/70] fs/proc/task_mmu: stop using linked list and highest_vm_end Liam Howlett
2022-04-26 15:06 ` [PATCH v8 45/70] userfaultfd: use maple tree iterator to iterate VMAs Liam Howlett
2022-04-27 15:43 ` Liam Howlett
2022-04-26 15:06 ` [PATCH v8 47/70] acct: use VMA iterator instead of linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 48/70] perf: use VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 46/70] ipc/shm: use VMA iterator instead of linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 49/70] sched: use maple tree iterator to walk VMAs Liam Howlett
2022-04-26 15:06 ` [PATCH v8 50/70] fork: use VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 51/70] bpf: remove VMA linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 53/70] mm/khugepaged: stop using vma " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 52/70] mm/gup: use maple tree navigation instead of " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 56/70] mm/memcontrol: stop using mm->highest_vm_end Liam Howlett
2022-04-26 15:06 ` [PATCH v8 54/70] mm/ksm: use vma iterators instead of vma linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 55/70] mm/madvise: use vma_find() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 58/70] mm/mlock: use vma iterator and " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 59/70] mm/mprotect: use maple tree navigation " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 57/70] mm/mempolicy: use vma iterator & maple state " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 61/70] mm/msync: use vma_find() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 60/70] mm/mremap: use vma_find_intersection() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 64/70] mm/swapfile: use vma iterator " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 62/70] mm/oom_kill: use maple tree iterators " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 63/70] mm/pagewalk: use vma_find() " Liam Howlett
2022-04-26 15:06 ` [PATCH v8 65/70] i915: use the VMA iterator Liam Howlett
2022-04-26 15:06 ` [PATCH v8 66/70] nommu: remove uses of VMA linked list Liam Howlett
2022-04-28 16:05 ` Guenter Roeck
2022-04-28 16:31 ` Guenter Roeck
2022-04-29 20:16 ` Liam Howlett
2022-04-26 15:06 ` [PATCH v8 67/70] riscv: use vma iterator for vdso Liam Howlett
2022-04-26 15:06 ` [PATCH v8 69/70] mm/mmap: drop range_has_overlap() function Liam Howlett
2022-04-26 15:06 ` [PATCH v8 68/70] mm: remove the vma linked list Liam Howlett
2022-04-26 15:06 ` [PATCH v8 70/70] mm/mmap.c: pass in mapping to __vma_link_file() Liam Howlett
2022-04-26 20:06 ` [PATCH v8 00/70] Introducing the Maple Tree Andrew Morton
2022-04-26 20:08 ` Andrew Morton
2022-04-26 20:23 ` Matthew Wilcox
2022-04-27 14:08 ` Liam Howlett
2022-04-27 17:33 ` Andrew Morton
2022-04-27 18:12 ` Matthew Wilcox
2022-05-01 20:26 ` Davidlohr Bueso
2022-05-01 23:56 ` Andrew Morton
2022-05-04 0:43 ` Liam Howlett
2022-04-28 2:28 ` Liam Howlett
2022-04-27 16:10 ` Qian Cai
2022-04-27 16:51 ` Liam Howlett
2022-04-27 20:21 ` Qian Cai
2022-04-27 22:41 ` Liam Howlett
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=87v8sjh4t9.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=agordeev@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=borntraeger@linux.ibm.com \
--cc=david@redhat.com \
--cc=frankja@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=iii@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=jgross@suse.com \
--cc=krebbel@linux.ibm.com \
--cc=liam.howlett@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@roeck-us.net \
--cc=maple-tree@lists.infradead.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=svens@linux.ibm.com \
--cc=thuth@redhat.com \
--cc=yuzhao@google.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).