Preserve memory-backend-memfd memory objects during cpr. Signed-off-by: Steve Sistare <steven.sist...@oracle.com> --- backends/hostmem-memfd.c | 21 ++++++++++++--------- hmp-commands.hx | 2 +- qapi/cpr.json | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c index c9d8001..2aeb5d1 100644 --- a/backends/hostmem-memfd.c +++ b/backends/hostmem-memfd.c @@ -14,6 +14,7 @@ #include "sysemu/hostmem.h" #include "qom/object_interfaces.h" #include "qemu/memfd.h" +#include "migration/cpr.h" #include "qemu/module.h" #include "qapi/error.h" #include "qom/object.h" @@ -36,23 +37,25 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) { HostMemoryBackendMemfd *m = MEMORY_BACKEND_MEMFD(backend); uint32_t ram_flags; - char *name; - int fd; + char *name = host_memory_backend_get_name(backend); + int fd = cpr_find_fd(name, 0); if (!backend->size) { error_setg(errp, "can't create backend with size 0"); return; } - fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, - m->hugetlb, m->hugetlbsize, m->seal ? - F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0, - errp); - if (fd == -1) { - return; + if (fd < 0) { + fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, + m->hugetlb, m->hugetlbsize, m->seal ? + F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0, + errp); + if (fd == -1) { + return; + } + cpr_save_fd(name, 0, fd); } - name = host_memory_backend_get_name(backend); ram_flags = backend->share ? RAM_SHARED : 0; ram_flags |= backend->reserve ? 0 : RAM_NORESERVE; ram_flags |= RAM_ANON; diff --git a/hmp-commands.hx b/hmp-commands.hx index da5dd60..540f9be 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -380,7 +380,7 @@ SRST If *mode* is 'restart', the checkpoint remains valid after restarting qemu using a subsequent cpr-exec. Guest RAM must be backed by a - memory-backend-file with share=on. + memory-backend-memfd or memory-backend-file object with share=on. To resume from the checkpoint, issue the cpr-load command. ERST diff --git a/qapi/cpr.json b/qapi/cpr.json index 47ee4ff..1ec5aae 100644 --- a/qapi/cpr.json +++ b/qapi/cpr.json @@ -41,7 +41,7 @@ # # If @mode is 'restart', the checkpoint remains valid after restarting # qemu using a subsequent cpr-exec. Guest RAM must be backed by a -# memory-backend-file with share=on. +# memory-backend-memfd or memory-backend-file object with share=on. # To resume from the checkpoint, issue the cpr-load command. # # @filename: name of checkpoint file -- 1.8.3.1