Skip to contentSkip to conversation

KVM memory slots limit on powerpc

DISCUSSION Thomas Huth 6 participants 12 messages Sep 4, 2015 – Sep 8, 2015 KVM

lore
Share & tools
lore
#0 lore raw

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

Thomas

#1 lore raw

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

Christian

#2 lore raw
Quoted 12 lines · Christian Borntraeger

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

Alex

#3 lore raw

Am 04.09.2015 um 12:04 schrieb Alexander Graf:

Quoted 22 lines · Christian Borntraeger
Quoted 12 lines

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

Quoted 8 lines

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

Maybe some rcu protected scheme that doubles the amount of memslots for each overrun? Yes, that would be good and even reduce the footprint for systems with only a small number of memslots.

Christian

#4 lore raw
Quoted 28 lines · Christian Borntraeger

Am 04.09.2015 um 12:04 schrieb Alexander Graf:

Quoted 27 lines · Christian Borntraeger
Quoted 12 lines

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

Quoted 7 lines
Quoted 3 lines

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

Maybe some rcu protected scheme that doubles the amount of memslots for each overrun? Yes, that would be good and even reduce the footprint for systems with only a small number of memslots.

Seems like Alex Williamson already posted a patchset for growable memslots a couple of years ago:

http://www.spinics.net/lists/kvm/msg50491.html

But I didn't quite spot the result in that thread why it never has been included upstream. Alex (W.), do you remember the outcome?

Thomas

#5 lore raw
Quoted 6 lines · Thomas Huth
Quoted 5 lines

Maybe some rcu protected scheme that doubles the amount of memslots for
each overrun? Yes, that would be good and even reduce the footprint for
systems with only a small number of memslots.

Quoted 8 lines

Seems like Alex Williamson already posted a patchset for growable memslots a couple of years ago:

http://www.spinics.net/lists/kvm/msg50491.html

But I didn't quite spot the result in that thread why it never has been
included upstream. Alex (W.), do you remember the outcome?

Isn't the memslot array *already* protected by RCU anyway ?

Cheers,
Ben.

#6 lore raw
In reply to Thomas Huth
Quoted 37 lines · Thomas Huth
Quoted 28 lines · Christian Borntraeger

Am 04.09.2015 um 12:04 schrieb Alexander Graf:

Quoted 27 lines · Christian Borntraeger
Quoted 12 lines

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

Quoted 7 lines
Quoted 3 lines

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

Maybe some rcu protected scheme that doubles the amount of memslots for each overrun? Yes, that would be good and even reduce the footprint for systems with only a small number of memslots.

Quoted 7 lines

Seems like Alex Williamson already posted a patchset for growable memslots a couple of years ago:

http://www.spinics.net/lists/kvm/msg50491.html

But I didn't quite spot the result in that thread why it never has been included upstream. Alex (W.), do you remember the outcome?

IIRC it was simply thought to be more complicated than necessary. Once we started caching memory slot misses, the O(N) search of a larger fixed array didn't seem to bother anyone, so I abandoned the weight-balanced tree, which I think still had some re-balancing issues. Please run with the code and make it work if it's useful now. Thanks,

Alex

#7 lore raw
In reply to Alexander Graf
Quoted 20 lines · Alexander Graf
Quoted 17 lines · Christian Borntraeger

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 15 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

Quoted 6 lines
Quoted 1 line

When you are at it, the s390 value should also be increased I guess.

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

FWIW, I've just checked sizeof(struct kvm) with the current ppc64 kernel build from master branch, and it is 34144 bytes.
So on a system that is using PAGE_SIZE = 64kB, there should be plenty of space left before we're getting into trouble.

And even assuming the worst case, that we're on a system which still uses PAGE_SIZE = 4kB, the last page of the 34144 bytes is only filled with 1376 bytes, leaving 2720 bytes free right now. sizeof(struct kvm_memory_slot) is 48 bytes right now on powerpc, and you need two additional bytes per entry for the id_to_index array in struct kvm_memslots, i.e. we need 50 additional bytes per entry on ppc. That means we could increase KVM_USER_MEM_SLOTS by 2720 / 50 = 54 entries without getting into further trouble.

I think we should leave some more additional bytes left in that last 4k page of the struct kvm region, ... so what about increasing KVM_USER_MEM_SLOTS to 32 + 48 = 80 now (instead of 32 + 54 = 86) to ease the memslot situation at least a little bit 'till we figured out a really final solution like growable memslots?

Thomas

#8 lore raw
In reply to Alexander Graf
Quoted 22 lines · On Fri, 4 Sep 2015 12:04:41 +0200 Alexander Graf <[email protected]> wrote:
Quoted 12 lines · Christian Borntraeger

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

Quoted 8 lines

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

KVM switched memslots allocation to kvm_kvzalloc(), so it would fallback to vmalloc
commit 744961341d472db6272ed9b42319a90f5a2aa7c4
kvm: avoid page allocation failure in kvm_set_memory_region()

Quoted 6 lines

Alex
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#9 lore raw
Quoted 30 lines · Igor Mammedov
Quoted 27 lines · On Fri, 4 Sep 2015 12:04:41 +0200 Alexander Graf <[email protected]> wrote:
Quoted 12 lines · Christian Borntraeger

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

Quoted 7 lines
Quoted 3 lines

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

KVM switched memslots allocation to kvm_kvzalloc(), so it would fallback to vmalloc
commit 744961341d472db6272ed9b42319a90f5a2aa7c4
kvm: avoid page allocation failure in kvm_set_memory_region()

Good hint, thanks for pointing that out! ... so increasing the array size should not cause too much trouble :-)

Thomas

#10 lore raw

Am 08.09.2015 um 08:05 schrieb Thomas Huth:

Quoted 35 lines · Igor Mammedov
Quoted 34 lines
Quoted 30 lines · On Fri, 4 Sep 2015 12:04:41 +0200 Alexander Graf <[email protected]> wrote:
Quoted 12 lines · Christian Borntraeger

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 11 lines

Hi all,

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

Quoted 6 lines
Quoted 3 lines

KVM switched memslots allocation to kvm_kvzalloc(), so it would fallback to vmalloc
commit 744961341d472db6272ed9b42319a90f5a2aa7c4
kvm: avoid page allocation failure in kvm_set_memory_region()

Good hint, thanks for pointing that out! ... so increasing the array size should not cause too much trouble :-)

Changing the allocation of the memslots to a growing structure seems like a good idea nevertheless. Any chance to do this as well when you are at it?

Christian

#11 lore raw
Quoted 35 lines · Christian Borntraeger

Am 08.09.2015 um 08:05 schrieb Thomas Huth:

Quoted 34 lines · Igor Mammedov
Quoted 32 lines
Quoted 18 lines · On Fri, 4 Sep 2015 12:04:41 +0200 Alexander Graf <[email protected]> wrote:
Quoted 10 lines · Christian Borntraeger

Am 04.09.2015 um 11:35 schrieb Thomas Huth:

Quoted 9 lines

now that we get memory hotplugging for the spapr machine on qemu-ppc, too, it seems like we easily can hit the amount of KVM-internal memory slots now ("#define KVM_USER_MEM_SLOTS 32" in arch/powerpc/include/asm/kvm_host.h). For example, start qemu-system-ppc64 with a couple of "-device secondary-vga" and "-m 4G,slots2,maxmem@G" and then try to hot-plug all 32 DIMMs ... and you'll see that it aborts way earlier already.

Quoted 6 lines
Quoted 4 lines

The x86 code already increased the amount of KVM_USER_MEM_SLOTS to 509 already (+3 internal slots = 512) ... maybe we should now increase the amount of slots on powerpc, too? Since we don't use internal slots on POWER, would 512 be a good value? Or would less be sufficient, too?

When you are at it, the s390 value should also be increased I guess.

Quoted 8 lines

That constant defines the array size for the memslot array in struct kvm which in turn again gets allocated by kzalloc, so it's pinned kernel memory that is physically contiguous. Doing big allocations can turn into problems during runtime.

So maybe there is another way? Can we extend the memslot array size dynamically somehow? Allocate it separately? How much memory does the memslot array use up with 512 entries?

KVM switched memslots allocation to kvm_kvzalloc(), so it would fallback to vmalloc
commit 744961341d472db6272ed9b42319a90f5a2aa7c4
kvm: avoid page allocation failure in kvm_set_memory_region()

Quoted 5 lines
Quoted 2 lines

Good hint, thanks for pointing that out! ... so increasing the array size should not cause too much trouble :-)

Changing the allocation of the memslots to a growing structure seems like a good idea nevertheless. Any chance to do this as well when you are at it?

I'd like to finish some other stuff first, so if you want to have a try, feel free to do so ... if not, I'll have a closer look at this later.

Thomas