On Tue, 19 Dec 2017 09:19:21 +0100 Christian Borntraeger <borntraeger@xxxxxxxxxx> wrote: > when multiple memory slots are present the cmma migration code s/when/When/ > does not allocate enough memory for the bitmap. The memory slots > are sorted in reverse order, so we must use gfn and size of > slot[0] instead of the last one. I've spent way too much time looking at the memslot code, but this seems correct. > > Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxx> > Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx # 4.13+ > Fixes: 190df4a212a7 (KVM: s390: CMMA tracking, ESSA emulation, migration mode) > --- > arch/s390/kvm/kvm-s390.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index 966ea611210a..3373d8dff131 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -792,11 +792,12 @@ static int kvm_s390_vm_start_migration(struct kvm *kvm) > > if (kvm->arch.use_cmma) { > /* > - * Get the last slot. They should be sorted by base_gfn, so the > - * last slot is also the one at the end of the address space. > - * We have verified above that at least one slot is present. > + * Get the first slot. They are reverse sorted by base_gfn, so > + * the first slot is also the one at the end of the address > + * space. We have verified above that at least one slot is > + * present. > */ > - ms = slots->memslots + slots->used_slots - 1; > + ms = slots->memslots; > /* round up so we only use full longs */ > ram_pages = roundup(ms->base_gfn + ms->npages, BITS_PER_LONG); > /* allocate enough bytes to store all the bits */ Reviewed-by: Cornelia Huck <cohuck@xxxxxxxxxx> As you wrote, this is good as a minimal fix.