From 469dd51bc664979f159d47885997d482991394b8 Mon Sep 17 00:00:00 2001 From: Junyan He Date: Wed, 18 Jul 2018 15:48:02 +0800 Subject: migration/ram: Add check and info message to nvdimm post copy. The nvdimm kind memory does not support post copy now. We disable post copy if we have nvdimm memory and print some log hint to user. Signed-off-by: Junyan He Reviewed-by: Stefan Hajnoczi Reviewed-by: Igor Mammedov Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- migration/ram.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'migration') diff --git a/migration/ram.c b/migration/ram.c index 24dea2730c..5beefae7f5 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -3906,6 +3906,15 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id) static bool ram_has_postcopy(void *opaque) { + RAMBlock *rb; + RAMBLOCK_FOREACH_MIGRATABLE(rb) { + if (ramblock_is_pmem(rb)) { + info_report("Block: %s, host: %p is a nvdimm memory, postcopy" + "is not supported now!", rb->idstr, rb->host); + return false; + } + } + return migrate_postcopy_ram(); } -- cgit v1.2.3-55-g7522 From 56eb90af39abf66c0e80588a9f50c31e7df7320b Mon Sep 17 00:00:00 2001 From: Junyan He Date: Wed, 18 Jul 2018 15:48:03 +0800 Subject: migration/ram: ensure write persistence on loading all data to PMEM. Because we need to make sure the pmem kind memory data is synced after migration, we choose to call pmem_persist() when the migration finish. This will make sure the data of pmem is safe and will not lose if power is off. Signed-off-by: Junyan He Reviewed-by: Stefan Hajnoczi Reviewed-by: Igor Mammedov Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- include/qemu/pmem.h | 6 ++++++ migration/ram.c | 8 ++++++++ 2 files changed, 14 insertions(+) (limited to 'migration') diff --git a/include/qemu/pmem.h b/include/qemu/pmem.h index ebdb070210..dfb6d0da62 100644 --- a/include/qemu/pmem.h +++ b/include/qemu/pmem.h @@ -25,6 +25,12 @@ pmem_memcpy_persist(void *pmemdest, const void *src, size_t len) return NULL; } +static inline void +pmem_persist(const void *addr, size_t len) +{ + g_assert_not_reached(); +} + #endif /* CONFIG_LIBPMEM */ #endif /* !QEMU_PMEM_H */ diff --git a/migration/ram.c b/migration/ram.c index 5beefae7f5..fa79d0a5b9 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -33,6 +33,7 @@ #include "qemu/bitops.h" #include "qemu/bitmap.h" #include "qemu/main-loop.h" +#include "qemu/pmem.h" #include "xbzrle.h" #include "ram.h" #include "migration.h" @@ -3547,6 +3548,13 @@ static int ram_load_setup(QEMUFile *f, void *opaque) static int ram_load_cleanup(void *opaque) { RAMBlock *rb; + + RAMBLOCK_FOREACH_MIGRATABLE(rb) { + if (ramblock_is_pmem(rb)) { + pmem_persist(rb->host, rb->used_length); + } + } + xbzrle_load_cleanup(); compress_threads_load_cleanup(); -- cgit v1.2.3-55-g7522