From 43f0b133d1312d042fb31bf7f63bb31a642eef26 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Thu, 23 Nov 2017 16:14:21 +0100 Subject: [PATCH 3/7] ppc: fix VTB migration RH-Author: Laurent Vivier Message-id: <20171123161421.30320-1-lvivier@redhat.com> Patchwork-id: 77796 O-Subject: [RHV7.5 qemu-kvm-rhev PATCH] ppc: fix VTB migration Bugzilla: 1506882 RH-Acked-by: Serhii Popovych RH-Acked-by: David Gibson RH-Acked-by: Thomas Huth Migration of a system under stress (for example, with "stress-ng --numa 2") triggers on the destination some kernel watchdog messages like: NMI watchdog: BUG: soft lockup - CPU#0 stuck for 3489660870s! NMI watchdog: BUG: soft lockup - CPU#1 stuck for 3489660884s! This problem appears with the changes introduced by 42043e4 spapr: clock should count only if vm is running I think this commit only triggers the problem. Kernel computes the soft lockup duration using the Virtual Timebase register (VTB), not using the Timebase Register (TBR, the one 42043e4 stops). It appears VTB is not migrated, so this patch adds it in the list of the SPRs to migrate, and fixes the problem. For the migration, I've tested a migration from qemu-2.8.0 and pseries-2.8.0 to a patched master (qemu-2.11.0-rc1). The received VTB is 0 (as is it not initialized by qemu-2.8.0), but the value seems to be ignored by KVM and a non zero VTB is used by the kernel. I have no explanation for that, but as the original problem appears only with SMP system under stress I suspect some problems in KVM (I think because VTB is shared by all threads of a core). Signed-off-by: Laurent Vivier Signed-off-by: David Gibson (cherry picked from commit 6dd836f5d32b989e18c6dda655a26f4d73a52f6a) Signed-off-by: Laurent Vivier Signed-off-by: Miroslav Rezanina --- target/ppc/translate_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/ppc/translate_init.c b/target/ppc/translate_init.c index 371bbae..9d38882 100644 --- a/target/ppc/translate_init.c +++ b/target/ppc/translate_init.c @@ -8168,10 +8168,10 @@ static void gen_spr_power8_ebb(CPUPPCState *env) /* Virtual Time Base */ static void gen_spr_vtb(CPUPPCState *env) { - spr_register(env, SPR_VTB, "VTB", + spr_register_kvm(env, SPR_VTB, "VTB", SPR_NOACCESS, SPR_NOACCESS, &spr_read_tbl, SPR_NOACCESS, - 0x00000000); + KVM_REG_PPC_VTB, 0x00000000); } static void gen_spr_power8_fscr(CPUPPCState *env) -- 1.8.3.1