diff options
| author | Chenyi Qiang <chenyi.qiang@intel.com> | 2025-06-12 16:27:43 +0800 |
|---|---|---|
| committer | Peter Xu <peterx@redhat.com> | 2025-06-23 16:03:59 -0400 |
| commit | ff1211154c45c9f7f82116ae9a8c72a848e4a8b5 (patch) | |
| tree | 3a98fc18ec47c6188428bde5b22586e196707293 /system/memory.c | |
| parent | f47a672a72acd6e2712031f0bc4d4f3ae4b6302c (diff) | |
| download | focaccia-qemu-ff1211154c45c9f7f82116ae9a8c72a848e4a8b5.tar.gz focaccia-qemu-ff1211154c45c9f7f82116ae9a8c72a848e4a8b5.zip | |
memory: Change memory_region_set_ram_discard_manager() to return the result
Modify memory_region_set_ram_discard_manager() to return -EBUSY if a RamDiscardManager is already set in the MemoryRegion. The caller must handle this failure, such as having virtio-mem undo its actions and fail the realize() process. Opportunistically move the call earlier to avoid complex error handling. This change is beneficial when introducing a new RamDiscardManager instance besides virtio-mem. After ram_block_coordinated_discard_require(true) unlocks all RamDiscardManager instances, only one instance is allowed to be set for one MemoryRegion at present. Suggested-by: David Hildenbrand <david@redhat.com> Reviewed-by: David Hildenbrand <david@redhat.com> Reviewed-by: Pankaj Gupta <pankaj.gupta@amd.com> Tested-by: Alexey Kardashevskiy <aik@amd.com> Reviewed-by: Alexey Kardashevskiy <aik@amd.com> Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> Signed-off-by: Chenyi Qiang <chenyi.qiang@intel.com> Link: https://lore.kernel.org/r/20250612082747.51539-3-chenyi.qiang@intel.com Signed-off-by: Peter Xu <peterx@redhat.com>
Diffstat (limited to 'system/memory.c')
| -rw-r--r-- | system/memory.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/system/memory.c b/system/memory.c index 306e9ff9eb..d0c186e9f6 100644 --- a/system/memory.c +++ b/system/memory.c @@ -2106,12 +2106,16 @@ RamDiscardManager *memory_region_get_ram_discard_manager(MemoryRegion *mr) return mr->rdm; } -void memory_region_set_ram_discard_manager(MemoryRegion *mr, - RamDiscardManager *rdm) +int memory_region_set_ram_discard_manager(MemoryRegion *mr, + RamDiscardManager *rdm) { g_assert(memory_region_is_ram(mr)); - g_assert(!rdm || !mr->rdm); + if (mr->rdm && rdm) { + return -EBUSY; + } + mr->rdm = rdm; + return 0; } uint64_t ram_discard_manager_get_min_granularity(const RamDiscardManager *rdm, |