Commit 759048ac authored by Bharata B Rao's avatar Bharata B Rao Committed by Michael S. Tsirkin
Browse files

pc: Fix DIMMs capacity calculation



pc_existing_dimms_capacity() is returning DIMMs count rather than capacity.
Fix this to return the capacity. Also consider only realized devices for
capacity calculation.

Signed-off-by: default avatarBharata B Rao <bharata@linux.vnet.ibm.com>
Reviewed-by: default avatarIgor Mammedov <imammedo@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 07d01c9c
Loading
Loading
Loading
Loading
+10 −16
Original line number Diff line number Diff line
@@ -1552,25 +1552,18 @@ void qemu_register_pc_machine(QEMUMachine *m)
    g_free(name);
}

static int pc_dimm_count(Object *obj, void *opaque)
{
    int *count = opaque;

    if (object_dynamic_cast(obj, TYPE_PC_DIMM)) {
        (*count)++;
    }

    object_child_foreach(obj, pc_dimm_count, opaque);
    return 0;
}

static int pc_existing_dimms_capacity(Object *obj, void *opaque)
{
    Error *local_err = NULL;
    uint64_t *size = opaque;

    if (object_dynamic_cast(obj, TYPE_PC_DIMM)) {
        (*size) += object_property_get_int(obj, PC_DIMM_SIZE_PROP, &local_err);
        DeviceState *dev = DEVICE(obj);

        if (dev->realized) {
            (*size) += object_property_get_int(obj, PC_DIMM_SIZE_PROP,
                &local_err);
        }

        if (local_err) {
            qerror_report_err(local_err);
@@ -1579,7 +1572,7 @@ static int pc_existing_dimms_capacity(Object *obj, void *opaque)
        }
    }

    object_child_foreach(obj, pc_dimm_count, opaque);
    object_child_foreach(obj, pc_existing_dimms_capacity, opaque);
    return 0;
}

@@ -1623,8 +1616,9 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev,
    if (existing_dimms_capacity + memory_region_size(mr) >
        machine->maxram_size - machine->ram_size) {
        error_setg(&local_err, "not enough space, currently 0x%" PRIx64
                   " in use of total 0x" RAM_ADDR_FMT,
                   existing_dimms_capacity, machine->maxram_size);
                   " in use of total hot pluggable 0x" RAM_ADDR_FMT,
                   existing_dimms_capacity,
                   machine->maxram_size - machine->ram_size);
        goto out;
    }