@@ -53,6 +53,7 @@
#include "sysemu/hostmem.h"
#include "sysemu/hw_accel.h"
#include "sysemu/xen-mapcache.h"
+#include "sysemu/guest-memfd-manager.h"
#include "trace/trace-root.h"
#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
@@ -1861,6 +1862,12 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
qemu_mutex_unlock_ramlist();
goto out_free;
}
+
+ GuestMemfdManager *gmm = GUEST_MEMFD_MANAGER(object_new(TYPE_GUEST_MEMFD_MANAGER));
+ GuestMemfdManagerClass *gmmc = GUEST_MEMFD_MANAGER_GET_CLASS(gmm);
+ g_assert(new_block->mr);
+ gmmc->realize(OBJECT(gmm), new_block->mr, new_block->mr->size);
+ memory_region_set_ram_discard_manager(gmm->mr, RAM_DISCARD_MANAGER(gmm));
}
new_ram_size = MAX(old_ram_size,
@@ -2118,6 +2125,8 @@ static void reclaim_ramblock(RAMBlock *block)
if (block->guest_memfd >= 0) {
close(block->guest_memfd);
+ g_assert(block->mr);
+ object_unref(OBJECT(block->mr->rdm));
ram_block_discard_require(false);
}
Instantiate a new guest_memfd_manager object and register it in the target MemoryRegion. From this point, other subsystems such as VFIO can register their listeners in guest_memfd_manager and receive conversion events through RamDiscardManager. Signed-off-by: Chenyi Qiang <chenyi.qiang@intel.com> --- system/physmem.c | 9 +++++++++ 1 file changed, 9 insertions(+)