mirror of https://github.com/xemu-project/xemu.git
softmmu/physmem: Extend ram_block_discard_(require|disable) by two discard types
We want to separate the two cases whereby we discard ram - uncoordinated: e.g., virito-balloon - coordinated: e.g., virtio-mem coordinated via the RamDiscardManager Reviewed-by: Pankaj Gupta <pankaj.gupta@cloud.ionos.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Alex Williamson <alex.williamson@redhat.com> Cc: Dr. David Alan Gilbert <dgilbert@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com> Cc: Peter Xu <peterx@redhat.com> Cc: Auger Eric <eric.auger@redhat.com> Cc: Wei Yang <richard.weiyang@linux.alibaba.com> Cc: teawater <teawaterz@linux.alibaba.com> Cc: Marek Kedzierski <mkedzier@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20210413095531.25603-12-david@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
98da491dff
commit
7e6d32ebf7
|
@ -2893,6 +2893,12 @@ static inline MemOp devend_memop(enum device_endian end)
|
||||||
*/
|
*/
|
||||||
int ram_block_discard_disable(bool state);
|
int ram_block_discard_disable(bool state);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See ram_block_discard_disable(): only disable uncoordinated discards,
|
||||||
|
* keeping coordinated discards (via the RamDiscardManager) enabled.
|
||||||
|
*/
|
||||||
|
int ram_block_uncoordinated_discard_disable(bool state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Inhibit technologies that disable discarding of pages in RAM blocks.
|
* Inhibit technologies that disable discarding of pages in RAM blocks.
|
||||||
*
|
*
|
||||||
|
@ -2902,12 +2908,20 @@ int ram_block_discard_disable(bool state);
|
||||||
int ram_block_discard_require(bool state);
|
int ram_block_discard_require(bool state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test if discarding of memory in ram blocks is disabled.
|
* See ram_block_discard_require(): only inhibit technologies that disable
|
||||||
|
* uncoordinated discarding of pages in RAM blocks, allowing co-existance with
|
||||||
|
* technologies that only inhibit uncoordinated discards (via the
|
||||||
|
* RamDiscardManager).
|
||||||
|
*/
|
||||||
|
int ram_block_coordinated_discard_require(bool state);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test if any discarding of memory in ram blocks is disabled.
|
||||||
*/
|
*/
|
||||||
bool ram_block_discard_is_disabled(void);
|
bool ram_block_discard_is_disabled(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test if discarding of memory in ram blocks is required to work reliably.
|
* Test if any discarding of memory in ram blocks is required to work reliably.
|
||||||
*/
|
*/
|
||||||
bool ram_block_discard_is_required(void);
|
bool ram_block_discard_is_required(void);
|
||||||
|
|
||||||
|
|
|
@ -3684,8 +3684,14 @@ void mtree_print_dispatch(AddressSpaceDispatch *d, MemoryRegion *root)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Require any discards to work. */
|
||||||
static unsigned int ram_block_discard_required_cnt;
|
static unsigned int ram_block_discard_required_cnt;
|
||||||
|
/* Require only coordinated discards to work. */
|
||||||
|
static unsigned int ram_block_coordinated_discard_required_cnt;
|
||||||
|
/* Disable any discards. */
|
||||||
static unsigned int ram_block_discard_disabled_cnt;
|
static unsigned int ram_block_discard_disabled_cnt;
|
||||||
|
/* Disable only uncoordinated discards. */
|
||||||
|
static unsigned int ram_block_uncoordinated_discard_disabled_cnt;
|
||||||
static QemuMutex ram_block_discard_disable_mutex;
|
static QemuMutex ram_block_discard_disable_mutex;
|
||||||
|
|
||||||
static void ram_block_discard_disable_mutex_lock(void)
|
static void ram_block_discard_disable_mutex_lock(void)
|
||||||
|
@ -3711,10 +3717,27 @@ int ram_block_discard_disable(bool state)
|
||||||
ram_block_discard_disable_mutex_lock();
|
ram_block_discard_disable_mutex_lock();
|
||||||
if (!state) {
|
if (!state) {
|
||||||
ram_block_discard_disabled_cnt--;
|
ram_block_discard_disabled_cnt--;
|
||||||
} else if (!ram_block_discard_required_cnt) {
|
} else if (ram_block_discard_required_cnt ||
|
||||||
ram_block_discard_disabled_cnt++;
|
ram_block_coordinated_discard_required_cnt) {
|
||||||
} else {
|
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
|
} else {
|
||||||
|
ram_block_discard_disabled_cnt++;
|
||||||
|
}
|
||||||
|
ram_block_discard_disable_mutex_unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ram_block_uncoordinated_discard_disable(bool state)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
ram_block_discard_disable_mutex_lock();
|
||||||
|
if (!state) {
|
||||||
|
ram_block_uncoordinated_discard_disabled_cnt--;
|
||||||
|
} else if (ram_block_discard_required_cnt) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
} else {
|
||||||
|
ram_block_uncoordinated_discard_disabled_cnt++;
|
||||||
}
|
}
|
||||||
ram_block_discard_disable_mutex_unlock();
|
ram_block_discard_disable_mutex_unlock();
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -3727,10 +3750,27 @@ int ram_block_discard_require(bool state)
|
||||||
ram_block_discard_disable_mutex_lock();
|
ram_block_discard_disable_mutex_lock();
|
||||||
if (!state) {
|
if (!state) {
|
||||||
ram_block_discard_required_cnt--;
|
ram_block_discard_required_cnt--;
|
||||||
} else if (!ram_block_discard_disabled_cnt) {
|
} else if (ram_block_discard_disabled_cnt ||
|
||||||
ram_block_discard_required_cnt++;
|
ram_block_uncoordinated_discard_disabled_cnt) {
|
||||||
} else {
|
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
|
} else {
|
||||||
|
ram_block_discard_required_cnt++;
|
||||||
|
}
|
||||||
|
ram_block_discard_disable_mutex_unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ram_block_coordinated_discard_require(bool state)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
ram_block_discard_disable_mutex_lock();
|
||||||
|
if (!state) {
|
||||||
|
ram_block_coordinated_discard_required_cnt--;
|
||||||
|
} else if (ram_block_discard_disabled_cnt) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
} else {
|
||||||
|
ram_block_coordinated_discard_required_cnt++;
|
||||||
}
|
}
|
||||||
ram_block_discard_disable_mutex_unlock();
|
ram_block_discard_disable_mutex_unlock();
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -3738,10 +3778,12 @@ int ram_block_discard_require(bool state)
|
||||||
|
|
||||||
bool ram_block_discard_is_disabled(void)
|
bool ram_block_discard_is_disabled(void)
|
||||||
{
|
{
|
||||||
return qatomic_read(&ram_block_discard_disabled_cnt);
|
return qatomic_read(&ram_block_discard_disabled_cnt) ||
|
||||||
|
qatomic_read(&ram_block_uncoordinated_discard_disabled_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ram_block_discard_is_required(void)
|
bool ram_block_discard_is_required(void)
|
||||||
{
|
{
|
||||||
return qatomic_read(&ram_block_discard_required_cnt);
|
return qatomic_read(&ram_block_discard_required_cnt) ||
|
||||||
|
qatomic_read(&ram_block_coordinated_discard_required_cnt);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue