From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50227) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WS6CQ-00038c-U0 for qemu-devel@nongnu.org; Mon, 24 Mar 2014 10:50:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WS6CI-0004iq-Fi for qemu-devel@nongnu.org; Mon, 24 Mar 2014 10:50:02 -0400 Received: from greensocs.com ([178.33.234.66]:56404) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WS6CI-0004iN-7l for qemu-devel@nongnu.org; Mon, 24 Mar 2014 10:49:54 -0400 Message-ID: <5330460F.8020807@greensocs.com> Date: Mon, 24 Mar 2014 15:49:51 +0100 From: Frederic Konrad MIME-Version: 1.0 References: <1395429454-24690-1-git-send-email-fred.konrad@greensocs.com> <1395429454-24690-3-git-send-email-fred.konrad@greensocs.com> <532D5070.5050807@redhat.com> In-Reply-To: <532D5070.5050807@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH 02/12] migration: migrate icount fields. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini , qemu-devel@nongnu.org Cc: mark.burton@greensocs.com On 22/03/2014 09:57, Paolo Bonzini wrote: > Il 21/03/2014 20:17, fred.konrad@greensocs.com ha scritto: >> From: KONRAD Frederic >> >> This fixes a bug where qemu_icount and qemu_icount_bias are not >> migrated. >> >> Signed-off-by: KONRAD Frederic >> --- >> cpus.c | 23 ++++++++++++++++++++++- >> 1 file changed, 22 insertions(+), 1 deletion(-) >> >> diff --git a/cpus.c b/cpus.c >> index 687717f..bdbc431 100644 >> --- a/cpus.c >> +++ b/cpus.c >> @@ -440,12 +440,33 @@ static const VMStateDescription vmstate_timers = { >> } >> }; >> >> +/* >> + * This is used instead of vmstate_timers when icount is used. >> + * cpu_ticks_offset and dummy fields are unused in icount mode so we >> can replace >> + * them with icount variables. >> + */ >> +static const VMStateDescription icount_vmstate_timers = { >> + .name = "timer", >> + .version_id = 2, >> + .minimum_version_id = 1, >> + .minimum_version_id_old = 1, >> + .fields = (VMStateField[]) { >> + VMSTATE_INT64(qemu_icount_bias, TimersState), >> + VMSTATE_INT64(qemu_icount, TimersState), >> + VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2), >> + VMSTATE_END_OF_LIST() >> + } >> +}; >> + >> void configure_icount(const char *option) >> { >> seqlock_init(&timers_state.vm_clock_seqlock, NULL); >> - vmstate_register(NULL, 0, &vmstate_timers, &timers_state); >> + >> if (!option) { >> + vmstate_register(NULL, 0, &vmstate_timers, &timers_state); >> return; >> + } else { >> + vmstate_register(NULL, 0, &icount_vmstate_timers, >> &timers_state); >> } >> >> icount_warp_timer = timer_new_ns(QEMU_CLOCK_REALTIME, >> > > You can also use a subsection for this. > > Paolo Hi Paolo, Thanks for review! Did you mean something like that: --- a/cpus.c +++ b/cpus.c @@ -427,6 +427,26 @@ void qemu_clock_warp(QEMUClockType type) } } +static bool icount_state_needed(void *opaque) +{ + return (use_icount != 0); +} + +/* + * This is a subsection for icount migration. + */ +static const VMStateDescription icount_vmstate_timers = { + .name = "icount", + .version_id = 2, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .fields = (VMStateField[]) { + VMSTATE_INT64(qemu_icount_bias, TimersState), + VMSTATE_INT64(qemu_icount, TimersState), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_timers = { .name = "timer", .version_id = 2, @@ -437,6 +457,14 @@ static const VMStateDescription vmstate_timers = { VMSTATE_INT64(dummy, TimersState), VMSTATE_INT64_V(cpu_clock_offset, TimersState, 2), VMSTATE_END_OF_LIST() + }, + .subsections = (VMStateSubsection[]) { + { + .vmsd = &icount_vmstate_timers, + .needed = icount_state_needed, + }, { + /* empty */ + } } }; Thanks, Fred