Skip to content

Commit

Permalink
pc-dimm: no need to pass the memory region
Browse files Browse the repository at this point in the history
We can just query it ourselves. When unplugging, we should always be
able to the region (as it was previously plugged). E.g. PPC already
assumed that and used &error_abort.

Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20180423165126.15441-4-david@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
  • Loading branch information
davidhildenbrand authored and ehabkost committed May 7, 2018
1 parent b0c14ec commit acc7fa1
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 23 deletions.
13 changes: 2 additions & 11 deletions hw/i386/pc.c
Expand Up @@ -1715,8 +1715,7 @@ static void pc_dimm_plug(HotplugHandler *hotplug_dev,
goto out;
}

pc_dimm_memory_plug(dev, MACHINE(pcms)->device_memory, mr, align,
&local_err);
pc_dimm_memory_plug(dev, MACHINE(pcms)->device_memory, align, &local_err);
if (local_err) {
goto out;
}
Expand Down Expand Up @@ -1766,25 +1765,17 @@ static void pc_dimm_unplug(HotplugHandler *hotplug_dev,
DeviceState *dev, Error **errp)
{
PCMachineState *pcms = PC_MACHINE(hotplug_dev);
PCDIMMDevice *dimm = PC_DIMM(dev);
PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
MemoryRegion *mr;
HotplugHandlerClass *hhc;
Error *local_err = NULL;

mr = ddc->get_memory_region(dimm, &local_err);
if (local_err) {
goto out;
}

hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev);
hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err);

if (local_err) {
goto out;
}

pc_dimm_memory_unplug(dev, MACHINE(pcms)->device_memory, mr);
pc_dimm_memory_unplug(dev, MACHINE(pcms)->device_memory);
object_unparent(OBJECT(dev));

out:
Expand Down
12 changes: 9 additions & 3 deletions hw/mem/pc-dimm.c
Expand Up @@ -37,7 +37,7 @@ typedef struct pc_dimms_capacity {
} pc_dimms_capacity;

void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
MemoryRegion *mr, uint64_t align, Error **errp)
uint64_t align, Error **errp)
{
int slot;
MachineState *machine = MACHINE(qdev_get_machine());
Expand All @@ -46,8 +46,14 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
MemoryRegion *vmstate_mr = ddc->get_vmstate_memory_region(dimm);
Error *local_err = NULL;
uint64_t existing_dimms_capacity = 0;
MemoryRegion *mr;
uint64_t addr;

mr = ddc->get_memory_region(dimm, &local_err);
if (local_err) {
goto out;
}

addr = object_property_get_uint(OBJECT(dimm),
PC_DIMM_ADDR_PROP, &local_err);
if (local_err) {
Expand Down Expand Up @@ -116,12 +122,12 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
error_propagate(errp, local_err);
}

void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms,
MemoryRegion *mr)
void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms)
{
PCDIMMDevice *dimm = PC_DIMM(dev);
PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
MemoryRegion *vmstate_mr = ddc->get_vmstate_memory_region(dimm);
MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);

memory_region_del_subregion(&hpms->mr, mr);
vmstate_unregister_ram(vmstate_mr, dev);
Expand Down
9 changes: 3 additions & 6 deletions hw/ppc/spapr.c
Expand Up @@ -3153,7 +3153,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
align = memory_region_get_alignment(mr);
size = memory_region_size(mr);

pc_dimm_memory_plug(dev, MACHINE(ms)->device_memory, mr, align, &local_err);
pc_dimm_memory_plug(dev, MACHINE(ms)->device_memory, align, &local_err);
if (local_err) {
goto out;
}
Expand All @@ -3174,7 +3174,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
return;

out_unplug:
pc_dimm_memory_unplug(dev, MACHINE(ms)->device_memory, mr);
pc_dimm_memory_unplug(dev, MACHINE(ms)->device_memory);
out:
error_propagate(errp, local_err);
}
Expand Down Expand Up @@ -3292,9 +3292,6 @@ static sPAPRDIMMState *spapr_recover_pending_dimm_state(sPAPRMachineState *ms,
void spapr_lmb_release(DeviceState *dev)
{
sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_hotplug_handler(dev));
PCDIMMDevice *dimm = PC_DIMM(dev);
PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);
sPAPRDIMMState *ds = spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(dev));

/* This information will get lost if a migration occurs
Expand All @@ -3314,7 +3311,7 @@ void spapr_lmb_release(DeviceState *dev)
* Now that all the LMBs have been removed by the guest, call the
* pc-dimm unplug handler to cleanup up the pc-dimm device.
*/
pc_dimm_memory_unplug(dev, MACHINE(spapr)->device_memory, mr);
pc_dimm_memory_unplug(dev, MACHINE(spapr)->device_memory);
object_unparent(OBJECT(dev));
spapr_pending_dimm_unplugs_remove(spapr, ds);
}
Expand Down
5 changes: 2 additions & 3 deletions include/hw/mem/pc-dimm.h
Expand Up @@ -85,7 +85,6 @@ int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);

uint64_t pc_existing_dimms_capacity(Error **errp);
void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
MemoryRegion *mr, uint64_t align, Error **errp);
void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms,
MemoryRegion *mr);
uint64_t align, Error **errp);
void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms);
#endif

0 comments on commit acc7fa1

Please sign in to comment.