Skip to content

Commit

Permalink
softmmu/physmem: Extend ram_block_discard_(require|disable) by two di…
Browse files Browse the repository at this point in the history
…scard 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>
  • Loading branch information
davidhildenbrand authored and ehabkost committed Jul 8, 2021
1 parent 98da491 commit 7e6d32e
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 8 deletions.
18 changes: 16 additions & 2 deletions include/exec/memory.h
Expand Up @@ -2893,6 +2893,12 @@ static inline MemOp devend_memop(enum device_endian end)
*/
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.
*
Expand All @@ -2902,12 +2908,20 @@ int ram_block_discard_disable(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);

/*
* 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);

Expand Down
54 changes: 48 additions & 6 deletions softmmu/physmem.c
Expand Up @@ -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;
/* 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;
/* Disable only uncoordinated discards. */
static unsigned int ram_block_uncoordinated_discard_disabled_cnt;
static QemuMutex ram_block_discard_disable_mutex;

static void ram_block_discard_disable_mutex_lock(void)
Expand All @@ -3711,10 +3717,27 @@ int ram_block_discard_disable(bool state)
ram_block_discard_disable_mutex_lock();
if (!state) {
ram_block_discard_disabled_cnt--;
} else if (!ram_block_discard_required_cnt) {
ram_block_discard_disabled_cnt++;
} else if (ram_block_discard_required_cnt ||
ram_block_coordinated_discard_required_cnt) {
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();
return ret;
Expand All @@ -3727,21 +3750,40 @@ int ram_block_discard_require(bool state)
ram_block_discard_disable_mutex_lock();
if (!state) {
ram_block_discard_required_cnt--;
} else if (!ram_block_discard_disabled_cnt) {
ram_block_discard_required_cnt++;
} else if (ram_block_discard_disabled_cnt ||
ram_block_uncoordinated_discard_disabled_cnt) {
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();
return ret;
}

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)
{
return qatomic_read(&ram_block_discard_required_cnt);
return qatomic_read(&ram_block_discard_required_cnt) ||
qatomic_read(&ram_block_coordinated_discard_required_cnt);
}

0 comments on commit 7e6d32e

Please sign in to comment.