On 08/11/16 16:29, David Gibson wrote: > On Fri, Nov 04, 2016 at 06:54:48PM +1100, Alexey Kardashevskiy wrote: >> On 30/10/16 22:12, David Gibson wrote: >>> When a vmstate for the ppc cpu was first introduced (a90db15 "target-ppc: >>> Convert ppc cpu savevm to VMStateDescription"), a VMSTATE_EQUAL was used >>> to ensure that identical CPU models were used at source and destination >>> as based on the PVR (Processor Version Register). >>> >>> However this was a problem for HV KVM, where due to hardware limitations >>> we always need to use the real PVR of the host CPU. So, to allow >>> migration between hosts with "similar enough" CPUs, the PVR check was >>> removed in 569be9f0 "target-ppc: Remove PVR check from migration". This >>> left the onus on user / management to only attempt migration between >>> compatible CPUs. >>> >>> Now that we've reworked the handling of compatiblity modes, we have the >>> information to actually determine if we're making a compatible migration. >>> So this patch partially restores the PVR check. If the source was running >>> in a compatibility mode, we just make sure that the destination cpu can >>> also run in that compatibility mode. However, if the source was running >>> in "raw" mode, we verify that the destination has the same PVR value. >>> >>> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> >>> --- >>> target-ppc/machine.c | 15 +++++++++++---- >>> 1 file changed, 11 insertions(+), 4 deletions(-) >>> >>> diff --git a/target-ppc/machine.c b/target-ppc/machine.c >>> index 5d87ff6..62b9e94 100644 >>> --- a/target-ppc/machine.c >>> +++ b/target-ppc/machine.c >>> @@ -173,10 +173,12 @@ static int cpu_post_load(void *opaque, int version_id) >>> target_ulong msr; >>> >>> /* >>> - * We always ignore the source PVR. The user or management >>> - * software has to take care of running QEMU in a compatible mode. >>> + * If we're operating in compat mode, we should be ok as long as >>> + * the destination supports the same compatiblity mode. >>> + * >>> + * Otherwise, however, we require that the destination has exactly >>> + * the same CPU model as the source. >>> */ >>> - env->spr[SPR_PVR] = env->spr_cb[SPR_PVR].default_value; >>> >>> #if defined(TARGET_PPC64) >>> if (cpu->compat_pvr) { >>> @@ -188,8 +190,13 @@ static int cpu_post_load(void *opaque, int version_id) >>> error_free(local_err); >>> return -1; >>> } >>> - } >>> + } else >>> #endif >>> + { >>> + if (env->spr[SPR_PVR] != env->spr_cb[SPR_PVR].default_value) { >>> + return -1; >>> + } >>> + } >> >> This should break migration from host with PVR=004d0200 to host with >> PVR=004d0201, what is the benefit of such limitation? > > There probably isn't one. But the point is it also blocks migration > from a host with PVR=004B0201 (POWER8) to one with PVR=00201400 > (403GCX) and *that* has a clear benefit. I don't see a way to block > the second without the first, except by creating a huge compatibility > matrix table, which would require inordinate amounts of time to > research carefully.
This is pcc->pvr_match() for this purpose. -- Alexey
signature.asc
Description: OpenPGP digital signature