mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
exec: Introduce ram_block_discard_(disable|require)()
We want to replace qemu_balloon_inhibit() by something more generic. Especially, we want to make sure that technologies that really rely on RAM block discards to work reliably to run mutual exclusive with technologies that effectively break it. E.g., vfio will usually pin all guest memory, turning the virtio-balloon basically useless and make the VM consume more memory than reported via the balloon. While the balloon is special already (=> no guarantees, same behavior possible afer reboots and with huge pages), this will be different, especially, with virtio-mem. Let's implement a way such that we can make both types of technology run mutually exclusive. We'll convert existing balloon inhibitors in successive patches and add some new ones. Add the check to qemu_balloon_is_inhibited() for now. We might want to make virtio-balloon an acutal inhibitor in the future - however, that requires more thought to not break existing setups. Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Richard Henderson <rth@twiddle.net> Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20200626072248.78761-3-david@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
af1d039f6d
commit
d24f31db3b
3 changed files with 95 additions and 1 deletions
52
exec.c
52
exec.c
|
@ -4115,4 +4115,56 @@ void mtree_print_dispatch(AddressSpaceDispatch *d, MemoryRegion *root)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If positive, discarding RAM is disabled. If negative, discarding RAM is
|
||||
* required to work and cannot be disabled.
|
||||
*/
|
||||
static int ram_block_discard_disabled;
|
||||
|
||||
int ram_block_discard_disable(bool state)
|
||||
{
|
||||
int old;
|
||||
|
||||
if (!state) {
|
||||
atomic_dec(&ram_block_discard_disabled);
|
||||
return 0;
|
||||
}
|
||||
|
||||
do {
|
||||
old = atomic_read(&ram_block_discard_disabled);
|
||||
if (old < 0) {
|
||||
return -EBUSY;
|
||||
}
|
||||
} while (atomic_cmpxchg(&ram_block_discard_disabled, old, old + 1) != old);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ram_block_discard_require(bool state)
|
||||
{
|
||||
int old;
|
||||
|
||||
if (!state) {
|
||||
atomic_inc(&ram_block_discard_disabled);
|
||||
return 0;
|
||||
}
|
||||
|
||||
do {
|
||||
old = atomic_read(&ram_block_discard_disabled);
|
||||
if (old > 0) {
|
||||
return -EBUSY;
|
||||
}
|
||||
} while (atomic_cmpxchg(&ram_block_discard_disabled, old, old - 1) != old);
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool ram_block_discard_is_disabled(void)
|
||||
{
|
||||
return atomic_read(&ram_block_discard_disabled) > 0;
|
||||
}
|
||||
|
||||
bool ram_block_discard_is_required(void)
|
||||
{
|
||||
return atomic_read(&ram_block_discard_disabled) < 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue