All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tang Chen <tangchen@cn.fujitsu.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: peter.maydell@linaro.org, mst@redhat.com, aik@ozlabs.ru,
	Hu Tao <hutao@cn.fujitsu.com>,
	mjt@tls.msk.ru, qemu-devel@nongnu.org, lcapitulino@redhat.com,
	kraxel@redhat.com, akong@redhat.com, quintela@redhat.com,
	armbru@redhat.com,
	Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
	aliguori@amazon.com, jan.kiszka@siemens.com, lersek@redhat.com,
	ehabkost@redhat.com, marcel.a@redhat.com, stefanha@redhat.com,
	chegu_vinod@hp.com, rth@twiddle.net, kwolf@redhat.com,
	s.priebe@profihost.ag, mreitz@redhat.com,
	vasilis.liaskovitis@profitbricks.com,
	"guz.fnst@cn.fujitsu.com" <guz.fnst@cn.fujitsu.com>,
	pbonzini@redhat.com, afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH 17/35] dimm: add busy address check and address auto-allocation
Date: Wed, 7 May 2014 17:58:52 +0800	[thread overview]
Message-ID: <536A03DC.2070305@cn.fujitsu.com> (raw)
In-Reply-To: <1396618620-27823-18-git-send-email-imammedo@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 2245 bytes --]

Hi Igor,

On 04/04/2014 09:36 PM, Igor Mammedov wrote:
......
> +uint64_t dimm_get_free_addr(uint64_t address_space_start,
> +                            uint64_t address_space_size,
> +                            uint64_t *hint, uint64_t size,
> +                            Error **errp)
> +{
> +    GSList *list = NULL, *item;
> +    uint64_t new_start, ret;
> +    uint64_t address_space_end = address_space_start + address_space_size;
> +
> +    object_child_foreach(qdev_get_machine(), dimm_built_list,&list);
> +
> +    if (hint) {
> +        new_start = *hint;
> +    } else {
> +        new_start = address_space_start;
> +    }
> +
> +    /* find address range that will fit new DIMM */
> +    for (item = list; item; item = g_slist_next(item)) {
> +        DimmDevice *dimm = item->data;
> +        uint64_t dimm_size = object_property_get_int(OBJECT(dimm),
> +                             "size",&error_abort);
> +        if (ranges_overlap(dimm->start, dimm_size, new_start, size)) {
> +            if (hint) {
> +                DeviceState *d = DEVICE(dimm);
> +                error_setg(errp, "address range conflicts with '%s'", d->id);
> +                break;

Actually we got an error here.

If we break from here, new_start is set to *hint, and ret will also be 
set to *hint.
So the return value is a little ambiguous.

I can understand that caller will check errp to find out if there is an 
error. And I
also understand we need to free list. But please also see below.

> +            }
> +            new_start = dimm->start + dimm_size;
> +        }
> +    }
> +    ret = new_start;
> +
> +    g_slist_free(list);
> +
> +    if (new_start<  address_space_start) {
> +        error_setg(errp, "can't add memory [0x%" PRIx64 ":0x%" PRIx64
> +                   "] at 0x%" PRIx64, new_start, size, address_space_start);
> +    } else if ((new_start + size)>  address_space_end) {
> +        error_setg(errp, "can't add memory [0x%" PRIx64 ":0x%" PRIx64
> +                   "] beyond 0x%" PRIx64, new_start, size, address_space_end);
> +    }

The error here could also be triggered. If so, errp will be reset, not 
the error
status set above.

> +    return ret;
> +}
>

So, how about the attached patch ?

Thanks. :)

[-- Attachment #2: 0001-dimm-add-busy-address-check-and-address-auto-allocat.patch --]
[-- Type: text/x-patch, Size: 5268 bytes --]

>From 2af81231d7a5479f70b1444589b01a47d37145c2 Mon Sep 17 00:00:00 2001
From: Igor Mammedov <imammedo@redhat.com>
Date: Fri, 4 Apr 2014 15:36:42 +0200
Subject: [PATCH] dimm: add busy address check and address auto-allocation

- if 'start' property is not specified on -device/device_add command,
treat default value as request for assigning DimmDevice to
the first free memory region.

- if 'start' is provided with -device/device_add command, attempt to
use it or fail command if it's already occupied or falls inside
of an existing DimmDevice memory region.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com>
---
 hw/i386/pc.c          | 16 +++++++++++-
 hw/mem/dimm.c         | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++
 include/hw/mem/dimm.h |  5 ++++
 3 files changed, 90 insertions(+), 1 deletion(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 4038e2c..29382ec 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1483,15 +1483,29 @@ void qemu_register_pc_machine(QEMUMachine *m)
 static void pc_dimm_plug(HotplugHandler *hotplug_dev,
                          DeviceState *dev, Error **errp)
 {
+    Error *local_err = NULL;
     PCMachineState *pcms = PC_MACHINE(hotplug_dev);
     DimmDevice *dimm = DIMM(dev);
     DimmDeviceClass *ddc = DIMM_GET_CLASS(dimm);
     MemoryRegion *mr = ddc->get_memory_region(dimm);
+    ram_addr_t addr = dimm->start;
+
+    addr = dimm_get_free_addr(pcms->hotplug_memory_base,
+                              memory_region_size(&pcms->hotplug_memory),
+                              !addr ? NULL : &addr,
+                              memory_region_size(mr), &local_err);
+    if (local_err) {
+        goto out;
+    }
+    object_property_set_int(OBJECT(dev), addr, "start", &local_err);
 
     memory_region_add_subregion(&pcms->hotplug_memory,
-                                dimm->start - pcms->hotplug_memory_base,
+                                addr - pcms->hotplug_memory_base,
                                 mr);
     vmstate_register_ram(mr, dev);
+
+out:
+    error_propagate(errp, local_err);
 }
 
 static void pc_machine_device_plug_cb(HotplugHandler *hotplug_dev,
diff --git a/hw/mem/dimm.c b/hw/mem/dimm.c
index 65d4cd0..d8a3c5e 100644
--- a/hw/mem/dimm.c
+++ b/hw/mem/dimm.c
@@ -21,6 +21,76 @@
 #include "hw/mem/dimm.h"
 #include "qemu/config-file.h"
 #include "qapi/visitor.h"
+#include "qemu/range.h"
+
+static gint dimm_addr_sort(gconstpointer a, gconstpointer b)
+{
+    DimmDevice *x = DIMM(a);
+    DimmDevice *y = DIMM(b);
+
+    return x->start - y->start;
+}
+
+static int dimm_built_list(Object *obj, void *opaque)
+{
+    GSList **list = opaque;
+
+    if (object_dynamic_cast(obj, TYPE_DIMM)) {
+        DeviceState *dev = DEVICE(obj);
+        if (dev->realized) { /* only realized DIMMs matter */
+            *list = g_slist_insert_sorted(*list, dev, dimm_addr_sort);
+        }
+    }
+
+    object_child_foreach(obj, dimm_built_list, opaque);
+    return 0;
+}
+
+uint64_t dimm_get_free_addr(uint64_t address_space_start,
+                            uint64_t address_space_size,
+                            uint64_t *hint, uint64_t size,
+                            Error **errp)
+{
+    GSList *list = NULL, *item;
+    uint64_t new_start, ret = 0;
+    uint64_t address_space_end = address_space_start + address_space_size;
+
+    object_child_foreach(qdev_get_machine(), dimm_built_list, &list);
+
+    if (hint) {
+        new_start = *hint;
+    } else {
+        new_start = address_space_start;
+    }
+
+    /* find address range that will fit new DIMM */
+    for (item = list; item; item = g_slist_next(item)) {
+        DimmDevice *dimm = item->data;
+        uint64_t dimm_size = object_property_get_int(OBJECT(dimm),
+                             "size", &error_abort);
+        if (ranges_overlap(dimm->start, dimm_size, new_start, size)) {
+            if (hint) {
+                DeviceState *d = DEVICE(dimm);
+                error_setg(errp, "address range conflicts with '%s'", d->id);
+                goto out;
+            }
+            new_start = dimm->start + dimm_size;
+        }
+    }
+    ret = new_start;
+
+    if (new_start < address_space_start) {
+        error_setg(errp, "can't add memory [0x%" PRIx64 ":0x%" PRIx64
+                   "] at 0x%" PRIx64, new_start, size, address_space_start);
+    } else if ((new_start + size) > address_space_end) {
+        error_setg(errp, "can't add memory [0x%" PRIx64 ":0x%" PRIx64
+                   "] beyond 0x%" PRIx64, new_start, size, address_space_end);
+    }
+
+out:
+    g_slist_free(list);
+    return ret;
+}
 
 static Property dimm_properties[] = {
     DEFINE_PROP_UINT64("start", DimmDevice, start, 0),
diff --git a/include/hw/mem/dimm.h b/include/hw/mem/dimm.h
index 4bbf0ed..d6e4d65 100644
--- a/include/hw/mem/dimm.h
+++ b/include/hw/mem/dimm.h
@@ -62,4 +62,9 @@ typedef struct DimmDeviceClass {
     MemoryRegion *(*get_memory_region)(DimmDevice *dimm);
 } DimmDeviceClass;
 
+
+uint64_t dimm_get_free_addr(uint64_t address_space_start,
+                            uint64_t address_space_size,
+                            uint64_t *hint, uint64_t size,
+                            Error **errp);
 #endif
-- 
1.8.0


  reply	other threads:[~2014-05-07  9:59 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-04 13:36 [Qemu-devel] [PATCH 00/35] pc: ACPI memory hotplug Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 01/35] qemu-option: introduce qemu_find_opts_singleton Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 02/35] vl: convert -m to QemuOpts Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 03/35] object_add: allow completion handler to get canonical path Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 04/35] add memdev backend infrastructure Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 05/35] vl.c: extend -m option to support options for memory hotplug Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 06/35] add pc-{i440fx,q35}-2.1 machine types Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 07/35] pc: create custom generic PC machine type Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 08/35] qdev: hotplug for buss-less devices Igor Mammedov
2014-04-07  2:26   ` Alexey Kardashevskiy
2014-04-07  6:51     ` Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 09/35] qdev: expose DeviceState.hotplugged field as a property Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 10/35] dimm: implement dimm device abstraction Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 11/35] memory: add memory_region_is_mapped() API Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 12/35] dimm: do not allow to set already busy memdev Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 13/35] pc: initialize memory hotplug address space Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 14/35] pc: exit QEMU if slots > 256 Igor Mammedov
2014-04-04 17:14   ` Eduardo Habkost
2014-04-07  6:55     ` Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 15/35] pc: add 'etc/reserved-memory-end' fw_cfg interface for SeaBIOS Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 16/35] pc: add memory hotplug handler to PC_MACHINE Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 17/35] dimm: add busy address check and address auto-allocation Igor Mammedov
2014-05-07  9:58   ` Tang Chen [this message]
2014-04-04 13:36 ` [Qemu-devel] [PATCH 18/35] dimm: add busy slot check and slot auto-allocation Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 19/35] acpi: rename cpu_hotplug_defs.h to acpi_defs.h Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 20/35] acpi: memory hotplug ACPI hardware implementation Igor Mammedov
2014-05-05 12:20   ` Vasilis Liaskovitis
2014-05-06  7:13     ` Igor Mammedov
2014-05-06 12:58       ` Vasilis Liaskovitis
2014-04-04 13:36 ` [Qemu-devel] [PATCH 21/35] trace: add acpi memory hotplug IO region events Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 22/35] trace: add DIMM slot & address allocation for target-i386 Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic Igor Mammedov
2014-04-07 11:32   ` Michael S. Tsirkin
2014-04-07 12:00     ` Igor Mammedov
2014-04-07 12:07       ` Michael S. Tsirkin
2014-04-07 13:12         ` Igor Mammedov
2014-04-07 13:25           ` Michael S. Tsirkin
2014-04-07 14:22             ` Igor Mammedov
2014-04-07 15:36               ` Michael S. Tsirkin
2014-04-11  9:41                 ` Igor Mammedov
2014-04-07 15:19             ` Michael S. Tsirkin
2014-04-12  1:40               ` Paolo Bonzini
2014-04-04 13:36 ` [Qemu-devel] [PATCH 24/35] acpi:piix4: add memory hotplug handling Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 25/35] pc: ich9 lpc: make it work with global/compat properties Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 26/35] acpi:ich9: add memory hotplug handling Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 27/35] pc: migrate piix4 & ich9 MemHotplugState Igor Mammedov
2014-04-04 14:16   ` Paolo Bonzini
2014-04-04 14:37     ` Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 28/35] pc: propagate memory hotplug event to ACPI device Igor Mammedov
2014-04-04 14:02   ` Paolo Bonzini
2014-04-04 14:29     ` Igor Mammedov
2014-04-07  3:07   ` Alexey Kardashevskiy
2014-04-07 14:13     ` Eduardo Habkost
2014-04-07 14:26       ` Igor Mammedov
2014-04-07 15:21         ` Michael S. Tsirkin
2014-04-11  9:13           ` Igor Mammedov
2014-04-07 10:23   ` Michael S. Tsirkin
2014-04-07 13:21     ` Igor Mammedov
2014-04-07 14:32     ` Igor Mammedov
2014-04-07 15:14       ` Michael S. Tsirkin
2014-04-11  9:14         ` Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 29/35] pc: ACPI BIOS: punch holes in PCI0._CRS for memory hotplug IO region Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 30/35] pc: ACPI BIOS: name CPU hotplug ACPI0004 device Igor Mammedov
2014-04-06  9:18   ` Michael S. Tsirkin
2014-04-07  7:13     ` Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 31/35] pc: ACPI BIOS: implement memory hotplug interface Igor Mammedov
2014-04-06  9:13   ` Michael S. Tsirkin
2014-04-07  7:23     ` Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 32/35] pc: ACPI BIOS: use enum for defining memory affinity flags Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 33/35] pc: ACPI BIOS: reserve SRAT entry for hotplug mem hole Igor Mammedov
     [not found]   ` <20140414072501.GC10931@G08FNSTD100614.fnst.cn.fujitsu.com>
     [not found]     ` <20140414184442.6ff3e626@nial.usersys.redhat.com>
2014-05-05 15:59       ` Vasilis Liaskovitis
2014-05-06  1:52         ` Hu Tao
2014-05-06 13:00           ` Vasilis Liaskovitis
     [not found]             ` <CAM4NYE8WjH-AhEAv9h8Z14+g3XutfEDM8UYFHtDUF7iR4jAOUg@mail.gmail.com>
     [not found]               ` <20140528100722.01b59a48@nial.usersys.redhat.com>
     [not found]                 ` <20140528122312.GA4730@dhcp-192-168-178-175.profitbricks.localdomain>
     [not found]                   ` <20140528152642.108cb193@nial.usersys.redhat.com>
     [not found]                     ` <20140528163813.GB28017@dhcp-192-168-178-175.profitbricks.localdomain>
     [not found]                       ` <20140529111237.7d775371@nial.usersys.redhat.com>
2014-06-02 14:29                         ` Vasilis Liaskovitis
2014-06-02 14:29                           ` Vasilis Liaskovitis
2014-06-02 14:54                           ` Igor Mammedov
2014-04-04 13:36 ` [Qemu-devel] [PATCH 34/35] pc: ACPI BIOS: make GPE.3 handle memory hotplug event on PIIX and Q35 machines Igor Mammedov
2014-05-05 16:25   ` Eric Blake
2014-05-05 16:28     ` Paolo Bonzini
2014-05-06 10:05       ` Laszlo Ersek
2014-05-06  7:16     ` Igor Mammedov
2014-04-04 13:37 ` [Qemu-devel] [PATCH 35/35] pc: ACPI BIOS: update pregenerated ACPI table blobs Igor Mammedov
     [not found] ` <533EBCB9.3040001@redhat.com>
2014-04-04 14:24   ` [Qemu-devel] [PATCH 00/35] pc: ACPI memory hotplug Igor Mammedov
2014-04-04 15:19     ` Paolo Bonzini
2014-04-04 15:37       ` Igor Mammedov
2014-04-04 16:57 ` Dr. David Alan Gilbert
2014-04-07  7:32   ` Igor Mammedov
2014-05-07  9:15 ` Stefan Priebe - Profihost AG
2014-05-19 21:24   ` [Qemu-devel] [PATCH] vl.c: daemonize before guest memory allocation Igor Mammedov
2014-05-19 21:28     ` Eric Blake
2014-05-19 21:35       ` Igor Mammedov
2014-08-25 13:28   ` [Qemu-devel] [PATCH 00/35] pc: ACPI memory hotplug Anshul Makkar
2014-08-25 13:35     ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=536A03DC.2070305@cn.fujitsu.com \
    --to=tangchen@cn.fujitsu.com \
    --cc=afaerber@suse.de \
    --cc=aik@ozlabs.ru \
    --cc=akong@redhat.com \
    --cc=aliguori@amazon.com \
    --cc=armbru@redhat.com \
    --cc=chegu_vinod@hp.com \
    --cc=ehabkost@redhat.com \
    --cc=guz.fnst@cn.fujitsu.com \
    --cc=hutao@cn.fujitsu.com \
    --cc=imammedo@redhat.com \
    --cc=isimatu.yasuaki@jp.fujitsu.com \
    --cc=jan.kiszka@siemens.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=lersek@redhat.com \
    --cc=marcel.a@redhat.com \
    --cc=mjt@tls.msk.ru \
    --cc=mreitz@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=rth@twiddle.net \
    --cc=s.priebe@profihost.ag \
    --cc=stefanha@redhat.com \
    --cc=vasilis.liaskovitis@profitbricks.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.