All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Pavel Dovgalyuk <dovgaluk@ispras.ru>,
	'Pavel Dovgalyuk' <Pavel.Dovgaluk@ispras.ru>,
	qemu-devel@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, mst@redhat.com,
	jasowang@redhat.com, quintela@redhat.com, zuban32s@gmail.com,
	maria.klimushenkova@ispras.ru, kraxel@redhat.com,
	boost.lists@gmail.com, alex.bennee@linaro.org
Subject: Re: [Qemu-devel] [RFC PATCH 19/26] cpu-exec: reset exit flag before calling cpu_exec_nocache
Date: Fri, 10 Nov 2017 09:31:52 +0100	[thread overview]
Message-ID: <331c5386-e0a9-8b85-66fb-cdd82eef8ece@redhat.com> (raw)
In-Reply-To: <000301d359fc$c168fc30$443af490$@ru>

On 10/11/2017 09:20, Pavel Dovgalyuk wrote:
>> From: Paolo Bonzini [mailto:pbonzini@redhat.com]
>> On 03/11/2017 09:27, Pavel Dovgalyuk wrote:
>>>> From: Paolo Bonzini [mailto:pbonzini@redhat.com]
>>>> On 02/11/2017 12:33, Paolo Bonzini wrote:
>>>>> On 02/11/2017 12:24, Pavel Dovgalyuk wrote:
>>>>>>> I am not sure about this.  I think if instead you should return false
>>>>>>> from here and EXCP_INTERRUPT from cpu_exec.
>>>>>> The problem is inside the TB. It checks cpu->icount_decr.u16.high which is -1.
>>>>>> And we have to enter the TB to cause an exception (because it exists in replay log).
>>>>>> That is why we reset this flag and try to execute the TB.
>>>>>
>>>>> But if u16.high is -1, shouldn't you return EXCP_INTERRUPT first (via
>>>>> "Finally, check if we need to exit to the main loop" in
>>>>> cpu_handle_interrupt)?  Then only cause the exception when that one is
>>>>> processed.
>>>>
>>>> ... indeed, you probably need something like:
>>>>
>>>>     /* Clear the interrupt flag now since we're processing
>>>>      * cpu->interrupt_request and cpu->exit_request.
>>>>      */
>>>>     insns_left = atomic_read(&cpu->icount_decr.u32);
>>>>     atomic_set(&cpu->icount_decr.u16.high, 0);
>>>>     if (unlikely(insns_left < 0) {
>>>>         /* Ensure the zeroing of icount_decr comes before the next read
>>>>          * of cpu->exit_request or cpu->interrupt_request.
>>>>          */
>>>>         smb_mb();
>>>>     }
>>>>
>>>> at the top of cpu_handle_interrupt.  Then you can remove the same
>>>> atomic_set+smp_mb in cpu_loop_exec_tb, like
>>>>
>>>>     *last_tb = NULL;
>>>>     insns_left = atomic_read(&cpu->icount_decr.u32);
>>>>     if (insns_left < 0) {
>>>>         /* Something asked us to stop executing chained TBs; just
>>>>          * continue round the main loop. Whatever requested the exit
>>>>          * will also have set something else (eg exit_request or
>>>>          * interrupt_request) which will be handled by
>>>>          * cpu_handle_interrupt.  cpu_handle_interrupt will also
>>>>          * clear cpu->icount_decr.u16.high.
>>>>          */
>>>>         return;
>>>>     }
>>>
>>> I tried this approach and it didn't work.
>>> I think iothread sets u16.high flag after resetting it in cpu_handle_interrupt.
>>
>> But why is this a problem?  The TB would exit immediately and go again
>> to cpu_handle_interrupt.  cpu_handle_interrupt returns true and
>> cpu_handle_exception causes the exception via cpu_exec_nocache.
> 
> I've tested your variant more thoroughly.
> It seems, that iothread calls cpu_exec between atomic_set(&cpu->icount_decr.u16.high, 0); 
> in cpu_handle_interrupt and cpu_exec_nocache in cpu_handle_exception.
> I see no other reason, because this happens not for the every time.
> And cpu_handle_interrupt is not called again, because cpu_handle_exception returns true.
> Therefore we have an infinite loop, because no other code here resets cpu->icount_decr.u16.high.

Then returning true unconditionally is wrong in the cpu_exec_nocache
case.  What if you do:

diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 61297f8f4a..fb5446be3e 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -470,7 +470,19 @@ static inline void cpu_handle_debug_exception(CPUState *cpu)
 
 static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
 {
-    if (cpu->exception_index >= 0) {
+    if (cpu->exception_index < 0) {
+#ifndef CONFIG_USER_ONLY
+        if (replay_has_exception()
+            && cpu->icount_decr.u16.low + cpu->icount_extra == 0) {
+            /* try to cause an exception pending in the log */
+            cpu_exec_nocache(cpu, 1, tb_find(cpu, NULL, 0, curr_cflags()), true);
+        }
+#endif
+        if (cpu->exception_index < 0) {
+            return;
+        }
+    }
+
         if (cpu->exception_index >= EXCP_INTERRUPT) {
             /* exit request from the cpu execution loop */
             *ret = cpu->exception_index;
@@ -505,16 +517,6 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
             }
 #endif
         }
-#ifndef CONFIG_USER_ONLY
-    } else if (replay_has_exception()
-               && cpu->icount_decr.u16.low + cpu->icount_extra == 0) {
-        /* try to cause an exception pending in the log */
-        cpu_exec_nocache(cpu, 1, tb_find(cpu, NULL, 0, curr_cflags()), true);
-        *ret = -1;
-        return true;
-#endif
-    }
-
     return false;
 }
 

  reply	other threads:[~2017-11-10  8:32 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-31 11:24 [Qemu-devel] [RFC PATCH 00/26] replay additions Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 01/26] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 02/26] blkreplay: create temporary overlay for underlaying devices Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 03/26] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 04/26] replay: fix processing async events Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 05/26] replay: fixed replay_enable_events Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 06/26] replay: fix save/load vm for non-empty queue Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 07/26] replay: added replay log format description Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 08/26] replay: make safe vmstop at record/replay Pavel Dovgalyuk
2017-11-02 11:28   ` Paolo Bonzini
2017-11-02 11:57     ` Pavel Dovgalyuk
2017-11-02 12:00       ` Paolo Bonzini
2017-11-02 12:04         ` Pavel Dovgalyuk
2017-11-02 12:21           ` Paolo Bonzini
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 09/26] replay: save prior value of the host clock Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 10/26] icount: fixed saving/restoring of icount warp timers Pavel Dovgalyuk
2017-11-02 11:27   ` Paolo Bonzini
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 11/26] target/arm/arm-powertctl: drop BQL assertions Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 12/26] cpus: push BQL lock to qemu_*_wait_io_event Pavel Dovgalyuk
2017-11-02 11:26   ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 13/26] cpus: only take BQL for sleeping threads Pavel Dovgalyuk
2017-11-02 11:08   ` Paolo Bonzini
2017-11-02 18:39     ` David Hildenbrand
2017-11-02 20:03       ` Paolo Bonzini
2017-11-13  8:52         ` Pavel Dovgalyuk
2017-11-13 10:14           ` Alex Bennée
2017-11-13 10:58             ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 14/26] replay/replay.c: bump REPLAY_VERSION again Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 15/26] replay/replay-internal.c: track holding of replay_lock Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 16/26] replay: make locking visible outside replay code Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 17/26] replay: push replay_mutex_lock up the call tree Pavel Dovgalyuk
2017-11-02 11:56   ` Paolo Bonzini
2017-11-02 12:00   ` Paolo Bonzini
2017-11-03  9:16     ` Pavel Dovgalyuk
2017-11-03  9:47       ` Alex Bennée
2017-11-03 10:17         ` Paolo Bonzini
2017-11-06 13:05           ` Alex Bennée
2017-11-06 13:10             ` Paolo Bonzini
2017-11-06 16:30               ` Alex Bennée
2017-11-06 16:35                 ` Paolo Bonzini
2017-11-03 10:17       ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 18/26] cpu-exec: don't overwrite exception_index Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 19/26] cpu-exec: reset exit flag before calling cpu_exec_nocache Pavel Dovgalyuk
2017-11-02 11:17   ` Paolo Bonzini
2017-11-02 11:24     ` Pavel Dovgalyuk
2017-11-02 11:33       ` Paolo Bonzini
2017-11-02 11:46         ` Paolo Bonzini
2017-11-03  8:27           ` Pavel Dovgalyuk
2017-11-06 13:48             ` Paolo Bonzini
2017-11-10  8:20               ` Pavel Dovgalyuk
2017-11-10  8:31                 ` Paolo Bonzini [this message]
2017-11-10 12:29                   ` Pavel Dovgalyuk
2017-11-10 13:12                     ` Paolo Bonzini
2017-11-06 14:01             ` Alex Bennée
2017-11-02 12:45         ` Pavel Dovgalyuk
2017-11-02 14:43           ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 20/26] replay: don't destroy mutex at exit Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 21/26] replay: check return values of fwrite Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 22/26] scripts/qemu-gdb: add simple tcg lock status helper Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 23/26] util/qemu-thread-*: add qemu_lock, locked and unlock trace events Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 24/26] scripts/analyse-locks-simpletrace.py: script to analyse lock times Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 25/26] scripts/replay-dump.py: replay log dumper Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 26/26] scripts/qemu-gdb/timers.py: new helper to dump timer state Pavel Dovgalyuk
2017-10-31 16:11 ` [Qemu-devel] [RFC PATCH 00/26] replay additions no-reply
2017-10-31 18:31 ` no-reply
  -- strict thread matches above, loose matches on Subject: below --
2017-10-31 11:06 Pavel Dovgalyuk
2017-10-31 11:08 ` [Qemu-devel] [RFC PATCH 19/26] cpu-exec: reset exit flag before calling cpu_exec_nocache Pavel Dovgalyuk

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=331c5386-e0a9-8b85-66fb-cdd82eef8ece@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=Pavel.Dovgaluk@ispras.ru \
    --cc=alex.bennee@linaro.org \
    --cc=boost.lists@gmail.com \
    --cc=dovgaluk@ispras.ru \
    --cc=jasowang@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=maria.klimushenkova@ispras.ru \
    --cc=mst@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=zuban32s@gmail.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 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.