qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH v3 07/22] memory-device: add and use memory_device


From: David Gibson
Subject: Re: [Qemu-ppc] [PATCH v3 07/22] memory-device: add and use memory_device_get_region_size()
Date: Fri, 21 Sep 2018 15:14:03 +1000
User-agent: Mutt/1.10.1 (2018-07-13)

On Thu, Sep 20, 2018 at 12:32:28PM +0200, David Hildenbrand wrote:
> We will factor out get_memory_region() from pc-dimm to memory device code
> soon. Once that is done, get_region_size() can be implemented
> generically and essentially be replaced by
> memory_device_get_region_size (and work only on get_memory_region()).
> 
> We have some users of get_memory_region() (spapr and pc-dimm code) that are
> only interested in the size. So let's rework them to use
> memory_device_get_region_size() first, then we can factor out
> get_memory_region() and eventually remove get_region_size() without
> touching the same code multiple times.
> 
> Signed-off-by: David Hildenbrand <address@hidden>
> ---
>  hw/mem/memory-device.c         | 13 ++++++++++---
>  hw/mem/pc-dimm.c               | 10 ++++------
>  hw/ppc/spapr.c                 | 27 +++++++++------------------
>  include/hw/mem/memory-device.h |  2 ++
>  4 files changed, 25 insertions(+), 27 deletions(-)
> 
> diff --git a/hw/mem/memory-device.c b/hw/mem/memory-device.c
> index bdcee6fd55..2fa68b3730 100644
> --- a/hw/mem/memory-device.c
> +++ b/hw/mem/memory-device.c
> @@ -57,10 +57,9 @@ static int memory_device_used_region_size(Object *obj, 
> void *opaque)
>      if (object_dynamic_cast(obj, TYPE_MEMORY_DEVICE)) {
>          const DeviceState *dev = DEVICE(obj);
>          const MemoryDeviceState *md = MEMORY_DEVICE(obj);
> -        const MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(obj);
>  
>          if (dev->realized) {
> -            *size += mdc->get_region_size(md, &error_abort);
> +            *size += memory_device_get_region_size(md, &error_abort);
>          }
>      }
>  
> @@ -169,7 +168,7 @@ uint64_t memory_device_get_free_addr(MachineState *ms, 
> const uint64_t *hint,
>          uint64_t md_size, md_addr;
>  
>          md_addr = mdc->get_addr(md);
> -        md_size = mdc->get_region_size(md, &error_abort);
> +        md_size = memory_device_get_region_size(md, &error_abort);
>  
>          if (ranges_overlap(md_addr, md_size, new_addr, size)) {
>              if (hint) {
> @@ -268,6 +267,14 @@ void memory_device_unplug_region(MachineState *ms, 
> MemoryRegion *mr)
>      memory_region_del_subregion(&ms->device_memory->mr, mr);
>  }
>  
> +uint64_t memory_device_get_region_size(const MemoryDeviceState *md,
> +                                       Error **errp)
> +{
> +    MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(md);
> +
> +    return mdc->get_region_size(md, errp);
> +}
> +
>  static const TypeInfo memory_device_info = {
>      .name          = TYPE_MEMORY_DEVICE,
>      .parent        = TYPE_INTERFACE,
> diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
> index 4bf1a0acc9..a06da7e08e 100644
> --- a/hw/mem/pc-dimm.c
> +++ b/hw/mem/pc-dimm.c
> @@ -163,16 +163,14 @@ static Property pc_dimm_properties[] = {
>  static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
>                               void *opaque, Error **errp)
>  {
> +    Error *local_err = NULL;
>      uint64_t value;
> -    MemoryRegion *mr;
> -    PCDIMMDevice *dimm = PC_DIMM(obj);
> -    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(obj);
>  
> -    mr = ddc->get_memory_region(dimm, errp);
> -    if (!mr) {
> +    value = memory_device_get_region_size(MEMORY_DEVICE(obj), errp);

Given the below, that should be &local_err above, no?

> +    if (local_err) {
> +        error_propagate(errp, local_err);
>          return;
>      }
> -    value = memory_region_size(mr);
>  
>      visit_type_uint64(v, name, &value, errp);
>  }
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 4edb6c7d16..b56ce6b7aa 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -3124,20 +3124,17 @@ static void spapr_memory_plug(HotplugHandler 
> *hotplug_dev, DeviceState *dev,
>  {
>      Error *local_err = NULL;
>      sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
> -    PCDIMMDevice *dimm = PC_DIMM(dev);
> -    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
> -    MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);
>      uint64_t size, addr;
>      uint32_t node;
>  
> -    size = memory_region_size(mr);
> +    size = memory_device_get_region_size(MEMORY_DEVICE(dev), &error_abort);
>  
>      pc_dimm_plug(dev, MACHINE(ms), &local_err);
>      if (local_err) {
>          goto out;
>      }
>  
> -    addr = object_property_get_uint(OBJECT(dimm),
> +    addr = object_property_get_uint(OBJECT(dev),
>                                      PC_DIMM_ADDR_PROP, &local_err);

It bothers me a bit that we're no longer explicitly forcing this to be
a DIMM object pointer, but we're still using PC_DIMM_ADDR_PROP.

>      if (local_err) {
>          goto out_unplug;
> @@ -3165,10 +3162,7 @@ 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);
> -    PCDIMMDevice *dimm = PC_DIMM(dev);
> -    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
>      Error *local_err = NULL;
> -    MemoryRegion *mr;
>      uint64_t size;
>      Object *memdev;
>      hwaddr pagesize;
> @@ -3178,11 +3172,11 @@ static void spapr_memory_pre_plug(HotplugHandler 
> *hotplug_dev, DeviceState *dev,
>          return;
>      }
>  
> -    mr = ddc->get_memory_region(dimm, errp);
> -    if (!mr) {
> +    size = memory_device_get_region_size(MEMORY_DEVICE(dev), &error_abort);

And this should be &local_err above as well, no?

> +    if (local_err) {
> +        error_propagate(errp, local_err);
>          return;
>      }
> -    size = memory_region_size(mr);
>  
>      if (size % SPAPR_MEMORY_BLOCK_SIZE) {
>          error_setg(errp, "Hotplugged memory size must be a multiple of "
> @@ -3190,7 +3184,7 @@ static void spapr_memory_pre_plug(HotplugHandler 
> *hotplug_dev, DeviceState *dev,
>          return;
>      }
>  
> -    memdev = object_property_get_link(OBJECT(dimm), PC_DIMM_MEMDEV_PROP,
> +    memdev = object_property_get_link(OBJECT(dev), PC_DIMM_MEMDEV_PROP,
>                                        &error_abort);
>      pagesize = host_memory_backend_pagesize(MEMORY_BACKEND(memdev));
>      spapr_check_pagesize(spapr, pagesize, &local_err);
> @@ -3254,9 +3248,8 @@ static sPAPRDIMMState 
> *spapr_recover_pending_dimm_state(sPAPRMachineState *ms,
>                                                          PCDIMMDevice *dimm)
>  {
>      sPAPRDRConnector *drc;
> -    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
> -    MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);
> -    uint64_t size = memory_region_size(mr);
> +    uint64_t size = memory_device_get_region_size(MEMORY_DEVICE(dimm),
> +                                                  &error_abort);
>      uint32_t nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE;
>      uint32_t avail_lmbs = 0;
>      uint64_t addr_start, addr;
> @@ -3322,14 +3315,12 @@ static void 
> spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
>      sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
>      Error *local_err = NULL;
>      PCDIMMDevice *dimm = PC_DIMM(dev);
> -    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
> -    MemoryRegion *mr = ddc->get_memory_region(dimm, &error_abort);
>      uint32_t nr_lmbs;
>      uint64_t size, addr_start, addr;
>      int i;
>      sPAPRDRConnector *drc;
>  
> -    size = memory_region_size(mr);
> +    size = memory_device_get_region_size(MEMORY_DEVICE(dev), &error_abort);
>      nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE;
>  
>      addr_start = object_property_get_uint(OBJECT(dimm), PC_DIMM_ADDR_PROP,
> diff --git a/include/hw/mem/memory-device.h b/include/hw/mem/memory-device.h
> index d6853156ff..12f8ca9eb1 100644
> --- a/include/hw/mem/memory-device.h
> +++ b/include/hw/mem/memory-device.h
> @@ -60,5 +60,7 @@ uint64_t memory_device_get_free_addr(MachineState *ms, 
> const uint64_t *hint,
>  void memory_device_plug_region(MachineState *ms, MemoryRegion *mr,
>                                 uint64_t addr);
>  void memory_device_unplug_region(MachineState *ms, MemoryRegion *mr);
> +uint64_t memory_device_get_region_size(const MemoryDeviceState *md,
> +                                       Error **errp);
>  
>  #endif

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]