[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 11/13] softmmu/physmem: Extend ram_block_discard_(require|disa
From: |
David Hildenbrand |
Subject: |
[PATCH v7 11/13] softmmu/physmem: Extend ram_block_discard_(require|disable) by two discard types |
Date: |
Wed, 24 Feb 2021 10:49:07 +0100 |
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>
---
include/exec/memory.h | 18 +++++++++++++--
softmmu/physmem.c | 54 ++++++++++++++++++++++++++++++++++++++-----
2 files changed, 64 insertions(+), 8 deletions(-)
diff --git a/include/exec/memory.h b/include/exec/memory.h
index ad5e0d6278..5ad7a274f6 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -2849,6 +2849,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.
*
@@ -2858,12 +2864,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);
diff --git a/softmmu/physmem.c b/softmmu/physmem.c
index 4388b2f4c7..a89f0f5b11 100644
--- a/softmmu/physmem.c
+++ b/softmmu/physmem.c
@@ -3677,8 +3677,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)
@@ -3704,10 +3710,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;
@@ -3720,10 +3743,27 @@ 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;
@@ -3731,10 +3771,12 @@ int ram_block_discard_require(bool state)
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);
}
--
2.29.2
- [PATCH v7 00/13] virtio-mem: vfio support, David Hildenbrand, 2021/02/24
- [PATCH v7 01/13] memory: Introduce RamDiscardManager for RAM memory regions, David Hildenbrand, 2021/02/24
- [PATCH v7 02/13] memory: Helpers to copy/free a MemoryRegionSection, David Hildenbrand, 2021/02/24
- [PATCH v7 03/13] virtio-mem: Factor out traversing unplugged ranges, David Hildenbrand, 2021/02/24
- [PATCH v7 04/13] virtio-mem: Don't report errors when ram_block_discard_range() fails, David Hildenbrand, 2021/02/24
- [PATCH v7 05/13] virtio-mem: Implement RamDiscardManager interface, David Hildenbrand, 2021/02/24
- [PATCH v7 06/13] vfio: Support for RamDiscardManager in the !vIOMMU case, David Hildenbrand, 2021/02/24
- [PATCH v7 07/13] vfio: Query and store the maximum number of possible DMA mappings, David Hildenbrand, 2021/02/24
- [PATCH v7 09/13] vfio: Support for RamDiscardManager in the vIOMMU case, David Hildenbrand, 2021/02/24
- [PATCH v7 10/13] softmmu/physmem: Don't use atomic operations in ram_block_discard_(disable|require), David Hildenbrand, 2021/02/24
- [PATCH v7 11/13] softmmu/physmem: Extend ram_block_discard_(require|disable) by two discard types,
David Hildenbrand <=
- [PATCH v7 08/13] vfio: Sanity check maximum number of DMA mappings with RamDiscardManager, David Hildenbrand, 2021/02/24
- [PATCH v7 12/13] virtio-mem: Require only coordinated discards, David Hildenbrand, 2021/02/24
- [PATCH v7 13/13] vfio: Disable only uncoordinated discards for VFIO_TYPE1 iommus, David Hildenbrand, 2021/02/24