Attempt to get memory region if the device doesn't have hostmem may not be an error. This can be happen immediately after initialization (getting value without default one).
Signed-off-by: Maxim Davydov <maxim.davy...@openvz.org> --- hw/i386/sgx-epc.c | 5 ++++- hw/mem/nvdimm.c | 6 ++++++ hw/mem/pc-dimm.c | 5 +++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/hw/i386/sgx-epc.c b/hw/i386/sgx-epc.c index d664829d35..1a4c8acdcc 100644 --- a/hw/i386/sgx-epc.c +++ b/hw/i386/sgx-epc.c @@ -121,9 +121,12 @@ static MemoryRegion *sgx_epc_md_get_memory_region(MemoryDeviceState *md, { SGXEPCDevice *epc = SGX_EPC(md); HostMemoryBackend *hostmem; + DeviceState *dev = DEVICE(epc); if (!epc->hostmem) { - error_setg(errp, "'" SGX_EPC_MEMDEV_PROP "' property must be set"); + if (dev->realized) { + error_setg(errp, "'" SGX_EPC_MEMDEV_PROP "' property must be set"); + } return NULL; } diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c index 7c7d777781..61e77e5476 100644 --- a/hw/mem/nvdimm.c +++ b/hw/mem/nvdimm.c @@ -166,9 +166,15 @@ static MemoryRegion *nvdimm_md_get_memory_region(MemoryDeviceState *md, Error **errp) { NVDIMMDevice *nvdimm = NVDIMM(md); + PCDIMMDevice *dimm = PC_DIMM(nvdimm); Error *local_err = NULL; if (!nvdimm->nvdimm_mr) { + /* Not error if we try get memory region after init */ + if (!dimm->hostmem) { + return NULL; + } + nvdimm_prepare_memory_region(nvdimm, &local_err); if (local_err) { error_propagate(errp, local_err); diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index f27e1a11ba..6fd74de97f 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -240,6 +240,11 @@ static void pc_dimm_md_set_addr(MemoryDeviceState *md, uint64_t addr, static MemoryRegion *pc_dimm_md_get_memory_region(MemoryDeviceState *md, Error **errp) { + PCDIMMDevice *dimm = PC_DIMM(md); + /* Not error if we try get memory region after init */ + if (!dimm->hostmem) { + return NULL; + } return pc_dimm_get_memory_region(PC_DIMM(md), errp); } -- 2.31.1