spapr, spapr_nvdimm: fold NVDIMM validation in the same place
NVDIMM has different contraints and conditions than the regular DIMM and we'll need to add at least one more. Instead of relying on 'if (nvdimm)' conditionals in the body of spapr_memory_pre_plug(), use the existing spapr_nvdimm_validate_opts() and put all NVDIMM handling code there. Rename it to spapr_nvdimm_validate() to reflect that the function is now checking more than the nvdimm device options. This makes spapr_memory_pre_plug() a bit easier to follow, and we can tune in NVDIMM parameters and validation in the same place. Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20200825215749.213536-3-danielhb413@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
90d282d085
commit
beb6073fe7
@ -3520,7 +3520,6 @@ static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
{
|
||||
const SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(hotplug_dev);
|
||||
SpaprMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
|
||||
const MachineClass *mc = MACHINE_CLASS(smc);
|
||||
bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM);
|
||||
PCDIMMDevice *dimm = PC_DIMM(dev);
|
||||
Error *local_err = NULL;
|
||||
@ -3533,27 +3532,22 @@ static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_nvdimm && !mc->nvdimm_supported) {
|
||||
error_setg(errp, "NVDIMM hotplug not supported for this machine");
|
||||
return;
|
||||
}
|
||||
|
||||
size = memory_device_get_region_size(MEMORY_DEVICE(dimm), &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_nvdimm && size % SPAPR_MEMORY_BLOCK_SIZE) {
|
||||
error_setg(errp, "Hotplugged memory size must be a multiple of "
|
||||
"%" PRIu64 " MB", SPAPR_MEMORY_BLOCK_SIZE / MiB);
|
||||
return;
|
||||
} else if (is_nvdimm) {
|
||||
spapr_nvdimm_validate_opts(NVDIMM(dev), size, &local_err);
|
||||
if (is_nvdimm) {
|
||||
spapr_nvdimm_validate(hotplug_dev, NVDIMM(dev), size, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
} else if (size % SPAPR_MEMORY_BLOCK_SIZE) {
|
||||
error_setg(errp, "Hotplugged memory size must be a multiple of "
|
||||
"%" PRIu64 " MB", SPAPR_MEMORY_BLOCK_SIZE / MiB);
|
||||
return;
|
||||
}
|
||||
|
||||
memdev = object_property_get_link(OBJECT(dimm), PC_DIMM_MEMDEV_PROP,
|
||||
|
@ -30,13 +30,19 @@
|
||||
#include "hw/ppc/fdt.h"
|
||||
#include "qemu/range.h"
|
||||
|
||||
void spapr_nvdimm_validate_opts(NVDIMMDevice *nvdimm, uint64_t size,
|
||||
Error **errp)
|
||||
void spapr_nvdimm_validate(HotplugHandler *hotplug_dev, NVDIMMDevice *nvdimm,
|
||||
uint64_t size, Error **errp)
|
||||
{
|
||||
const MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev);
|
||||
g_autofree char *uuidstr = NULL;
|
||||
QemuUUID uuid;
|
||||
int ret;
|
||||
|
||||
if (!mc->nvdimm_supported) {
|
||||
error_setg(errp, "NVDIMM hotplug not supported for this machine");
|
||||
return;
|
||||
}
|
||||
|
||||
if (object_property_get_int(OBJECT(nvdimm), NVDIMM_LABEL_SIZE_PROP,
|
||||
&error_abort) == 0) {
|
||||
error_setg(errp, "PAPR requires NVDIMM devices to have label-size set");
|
||||
|
@ -29,8 +29,8 @@ int spapr_pmem_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
|
||||
void *fdt, int *fdt_start_offset, Error **errp);
|
||||
int spapr_dt_nvdimm(void *fdt, int parent_offset, NVDIMMDevice *nvdimm);
|
||||
void spapr_dt_persistent_memory(void *fdt);
|
||||
void spapr_nvdimm_validate_opts(NVDIMMDevice *nvdimm, uint64_t size,
|
||||
Error **errp);
|
||||
void spapr_nvdimm_validate(HotplugHandler *hotplug_dev, NVDIMMDevice *nvdimm,
|
||||
uint64_t size, Error **errp);
|
||||
void spapr_add_nvdimm(DeviceState *dev, uint64_t slot, Error **errp);
|
||||
void spapr_create_nvdimm_dr_connectors(SpaprMachineState *spapr);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user