On 25.01.24 04:22, Xiaoyao Li wrote:
> 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.
>
> Originally-from: Isaku Yamahata <isaku.yamahata@intel.com>
> Codeveloped-by: Xiaoyao Li <xiaoyao.li@intel.com>
> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
> Changes in in v4:
> - Drop ram_block_convert_range() and open code its implementation in the
> next Patch.
> ---
> 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 fef3138d29fc..05610efa8b4f 100644
> --- a/include/exec/cpu-common.h
> +++ b/include/exec/cpu-common.h
> @@ -175,6 +175,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 4735b0462ed9..fc59470191ef 100644
> --- a/system/physmem.c
> +++ b/system/physmem.c
> @@ -3626,6 +3626,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;
Reviewed-by: David Hildenbrand <david@redhat.com>
--
Cheers,
David / dhildenb