提交 05ff8dc3 编写于 作者: A Artem Pisarenko 提交者: Paolo Bonzini

Revert some patches from recent [PATCH v6] "Fixing record/replay and adding reverse debugging"

That patch series introduced new virtual clock type for use in external
subsystems. It breaks desired behavior in non-record/replay usage
scenarios due to a small change to existing behavior.  Processing of
virtual timers belonging to new clock type is kicked off to the main
loop, which makes these timers asynchronous with vCPU thread and,
in icount mode, with whole guest execution. This breaks expected
determinism in non-record/replay icount mode of emulation where these
"external subsystems" are isolated from the host (i.e. they are
external only to guest core, not to the entire emulation environment).

Example for slirp ("user" backend for network device):
User runs qemu in icount mode with rtc clock=vm without any external
communication interfaces but with "-netdev user,restrict=on". It expects
deterministic execution, because network services are emulated inside
qemu and isolated from host. There are no reasons to get reply from DHCP
server with different delay or something like that.

The next patches revert reimplements the same changes in a better way.
This reverts commit 87f4fe76.
This reverts commit 775a412b.
This reverts commit 98880914.
Signed-off-by: NArtem Pisarenko <artem.k.pisarenko@gmail.com>
Message-Id: <18b1e7c8f155fe26976f91be06bde98eef6f8751.1539764043.git.artem.k.pisarenko@gmail.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 24f7973b
...@@ -42,14 +42,6 @@ ...@@ -42,14 +42,6 @@
* In icount mode, this clock counts nanoseconds while the virtual * In icount mode, this clock counts nanoseconds while the virtual
* machine is running. It is used to increase @QEMU_CLOCK_VIRTUAL * machine is running. It is used to increase @QEMU_CLOCK_VIRTUAL
* while the CPUs are sleeping and thus not executing instructions. * while the CPUs are sleeping and thus not executing instructions.
*
* @QEMU_CLOCK_VIRTUAL_EXT: virtual clock for external subsystems
*
* The virtual clock only runs during the emulation. It stops
* when the virtual machine is stopped. The timers for this clock
* do not recorded in rr mode, therefore this clock could be used
* for the subsystems that operate outside the guest core.
*
*/ */
typedef enum { typedef enum {
...@@ -57,7 +49,6 @@ typedef enum { ...@@ -57,7 +49,6 @@ typedef enum {
QEMU_CLOCK_VIRTUAL = 1, QEMU_CLOCK_VIRTUAL = 1,
QEMU_CLOCK_HOST = 2, QEMU_CLOCK_HOST = 2,
QEMU_CLOCK_VIRTUAL_RT = 3, QEMU_CLOCK_VIRTUAL_RT = 3,
QEMU_CLOCK_VIRTUAL_EXT = 4,
QEMU_CLOCK_MAX QEMU_CLOCK_MAX
} QEMUClockType; } QEMUClockType;
......
...@@ -17,7 +17,7 @@ static void ra_timer_handler(void *opaque) ...@@ -17,7 +17,7 @@ static void ra_timer_handler(void *opaque)
{ {
Slirp *slirp = opaque; Slirp *slirp = opaque;
timer_mod(slirp->ra_timer, timer_mod(slirp->ra_timer,
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_EXT) + NDP_Interval); qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
ndp_send_ra(slirp); ndp_send_ra(slirp);
} }
...@@ -27,10 +27,9 @@ void icmp6_init(Slirp *slirp) ...@@ -27,10 +27,9 @@ void icmp6_init(Slirp *slirp)
return; return;
} }
slirp->ra_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_EXT, slirp->ra_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, ra_timer_handler, slirp);
ra_timer_handler, slirp);
timer_mod(slirp->ra_timer, timer_mod(slirp->ra_timer,
qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_EXT) + NDP_Interval); qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
} }
void icmp6_cleanup(Slirp *slirp) void icmp6_cleanup(Slirp *slirp)
......
...@@ -271,7 +271,7 @@ static void qemu_input_queue_process(void *opaque) ...@@ -271,7 +271,7 @@ static void qemu_input_queue_process(void *opaque)
item = QTAILQ_FIRST(queue); item = QTAILQ_FIRST(queue);
switch (item->type) { switch (item->type) {
case QEMU_INPUT_QUEUE_DELAY: case QEMU_INPUT_QUEUE_DELAY:
timer_mod(item->timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_EXT) timer_mod(item->timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)
+ item->delay_ms); + item->delay_ms);
return; return;
case QEMU_INPUT_QUEUE_EVENT: case QEMU_INPUT_QUEUE_EVENT:
...@@ -301,7 +301,7 @@ static void qemu_input_queue_delay(struct QemuInputEventQueueHead *queue, ...@@ -301,7 +301,7 @@ static void qemu_input_queue_delay(struct QemuInputEventQueueHead *queue,
queue_count++; queue_count++;
if (start_timer) { if (start_timer) {
timer_mod(item->timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL_EXT) timer_mod(item->timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)
+ item->delay_ms); + item->delay_ms);
} }
} }
...@@ -448,8 +448,8 @@ void qemu_input_event_send_key_delay(uint32_t delay_ms) ...@@ -448,8 +448,8 @@ void qemu_input_event_send_key_delay(uint32_t delay_ms)
} }
if (!kbd_timer) { if (!kbd_timer) {
kbd_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL_EXT, kbd_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, qemu_input_queue_process,
qemu_input_queue_process, &kbd_queue); &kbd_queue);
} }
if (queue_count < queue_limit) { if (queue_count < queue_limit) {
qemu_input_queue_delay(&kbd_queue, kbd_timer, qemu_input_queue_delay(&kbd_queue, kbd_timer,
......
...@@ -496,7 +496,6 @@ bool timerlist_run_timers(QEMUTimerList *timer_list) ...@@ -496,7 +496,6 @@ bool timerlist_run_timers(QEMUTimerList *timer_list)
switch (timer_list->clock->type) { switch (timer_list->clock->type) {
case QEMU_CLOCK_REALTIME: case QEMU_CLOCK_REALTIME:
case QEMU_CLOCK_VIRTUAL_EXT:
break; break;
default: default:
case QEMU_CLOCK_VIRTUAL: case QEMU_CLOCK_VIRTUAL:
...@@ -598,7 +597,6 @@ int64_t qemu_clock_get_ns(QEMUClockType type) ...@@ -598,7 +597,6 @@ int64_t qemu_clock_get_ns(QEMUClockType type)
return get_clock(); return get_clock();
default: default:
case QEMU_CLOCK_VIRTUAL: case QEMU_CLOCK_VIRTUAL:
case QEMU_CLOCK_VIRTUAL_EXT:
if (use_icount) { if (use_icount) {
return cpu_get_icount(); return cpu_get_icount();
} else { } else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册