Hello! Long time has passed, but i started working on live migration of this thing, and found some more problems. > @@ -117,9 +305,26 @@ int vits_init(struct kvm *kvm) > struct vgic_dist *dist = &kvm->arch.vgic; > struct vgic_its *its = &dist->its; > > + dist->pendbaser = kmalloc(sizeof(u64) * dist->nr_cpus, GFP_KERNEL); > + if (!dist->pendbaser) > + return -ENOMEM; > + > spin_lock_init(&its->lock); > > its->enabled = false; > > return -ENXIO; > } > + vits_init() allocates table for per-CPU pendbaser values. However, it is called from within vgicv3_map_resources(), which is in turn called upon first vCPU run. This is too late, because in case of live migration we would first want to set up all registers from within the userspace. But, when i start doing this, i crash in handle_mmio_pendbaser_redist(), because of dist->pendbaser being NULL. The solution is to split the function up. I moved vgic_register_kvm_io_dev() (introduced by later patch) to vits_map_resources(), which is now called where vits_init() originally was. My new vits_init() (which is made reentrant by checking for dist->pendbaser != NULL) is now called from within two places: a) vits_map_resources() b) handle_mmio_pendbaser_redist() Therefore, all allocations happen either on first vCPU run, or on first PENDBASER access, whatever comes first. An alternative is to do allocations during KVM_DEV_ARM_VGIC_CTRL_INIT. Kind regards, Pavel Fedin Expert Engineer Samsung Electronics Research center Russia -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html