84 lines
2.7 KiB
Diff
84 lines
2.7 KiB
Diff
|
From c70f6e7e3461e6562c0591079cc71068bf0f2ed8 Mon Sep 17 00:00:00 2001
|
||
|
From: Xiaoyao Li <xiaoyao.li@intel.com>
|
||
|
Date: Wed, 20 Mar 2024 03:39:07 -0500
|
||
|
Subject: [PATCH 033/100] physmem: Introduce
|
||
|
ram_block_discard_guest_memfd_range()
|
||
|
|
||
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
RH-MergeRequest: 245: SEV-SNP support
|
||
|
RH-Jira: RHEL-39544
|
||
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
||
|
RH-Acked-by: Bandan Das <bdas@redhat.com>
|
||
|
RH-Acked-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||
|
RH-Commit: [33/91] b6169fa8d752d83977b18897be24f6ab9f3d3472 (bonzini/rhel-qemu-kvm)
|
||
|
|
||
|
When memory page is converted from private to shared, the original
|
||
|
private memory is back'ed by guest_memfd. Introduce
|
||
|
ram_block_discard_guest_memfd_range() for discarding memory in
|
||
|
guest_memfd.
|
||
|
|
||
|
Based on a patch by Isaku Yamahata <isaku.yamahata@intel.com>.
|
||
|
|
||
|
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
||
|
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||
|
Signed-off-by: Michael Roth <michael.roth@amd.com>
|
||
|
Message-ID: <20240320083945.991426-12-michael.roth@amd.com>
|
||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
(cherry picked from commit b2e9426c04fdd32d93a3a37db6b0c2e67c88c335)
|
||
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
---
|
||
|
include/exec/cpu-common.h | 2 ++
|
||
|
system/physmem.c | 23 +++++++++++++++++++++++
|
||
|
2 files changed, 25 insertions(+)
|
||
|
|
||
|
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
|
||
|
index 6346df17ce..6d5318895a 100644
|
||
|
--- a/include/exec/cpu-common.h
|
||
|
+++ b/include/exec/cpu-common.h
|
||
|
@@ -159,6 +159,8 @@ typedef int (RAMBlockIterFunc)(RAMBlock *rb, void *opaque);
|
||
|
|
||
|
int qemu_ram_foreach_block(RAMBlockIterFunc func, void *opaque);
|
||
|
int ram_block_discard_range(RAMBlock *rb, uint64_t start, size_t length);
|
||
|
+int ram_block_discard_guest_memfd_range(RAMBlock *rb, uint64_t start,
|
||
|
+ size_t length);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
diff --git a/system/physmem.c b/system/physmem.c
|
||
|
index 5ebcf5be11..c3d04ca921 100644
|
||
|
--- a/system/physmem.c
|
||
|
+++ b/system/physmem.c
|
||
|
@@ -3721,6 +3721,29 @@ err:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
+int ram_block_discard_guest_memfd_range(RAMBlock *rb, uint64_t start,
|
||
|
+ size_t length)
|
||
|
+{
|
||
|
+ int ret = -1;
|
||
|
+
|
||
|
+#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
|
||
|
+ ret = fallocate(rb->guest_memfd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
|
||
|
+ start, length);
|
||
|
+
|
||
|
+ if (ret) {
|
||
|
+ ret = -errno;
|
||
|
+ error_report("%s: Failed to fallocate %s:%" PRIx64 " +%zx (%d)",
|
||
|
+ __func__, rb->idstr, start, length, ret);
|
||
|
+ }
|
||
|
+#else
|
||
|
+ ret = -ENOSYS;
|
||
|
+ error_report("%s: fallocate not available %s:%" PRIx64 " +%zx (%d)",
|
||
|
+ __func__, rb->idstr, start, length, ret);
|
||
|
+#endif
|
||
|
+
|
||
|
+ return ret;
|
||
|
+}
|
||
|
+
|
||
|
bool ramblock_is_pmem(RAMBlock *rb)
|
||
|
{
|
||
|
return rb->flags & RAM_PMEM;
|
||
|
--
|
||
|
2.39.3
|
||
|
|