From: "Andreas Färber" <afaerber@suse.de>
To: qemu-devel@nongnu.org
Cc: "Pavel Fedin" <p.fedin@samsung.com>, "Andreas Färber" <afaerber@suse.de>
Subject: [Qemu-devel] [PULL 03/21] qdev: Do not use slow [*] expansion for GPIO creation
Date: Sat, 19 Sep 2015 16:43:12 +0200 [thread overview]
Message-ID: <1442673810-2679-4-git-send-email-afaerber@suse.de> (raw)
In-Reply-To: <1442673810-2679-1-git-send-email-afaerber@suse.de>
From: Pavel Fedin <p.fedin@samsung.com>
Expansion of [*] suffix is very slow because index expansion is done using
trial and error strategy, starting every time from zero and retrying with
the next index until insertion succeeds. With large number of already added
properties this process takes huge amount of time (O(n^2) complexity).
Some architectures (like ARM) use very large amount of IRQ pins in interrupt
controller models. This flaw makes machine startup extremely slow
(~20 seconds for ARM64 with 32 CPUs). This patch decreases this time down to
~10 seconds.
Also in qdev_init_gpio_out_named() memset() is now called only once for the
whole array instead of per-cell cleaning
Signed-off-by: Pavel Fedin <p.fedin@samsung.com>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
hw/core/qdev.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index a24493a..4ab04aa 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -417,17 +417,21 @@ void qdev_init_gpio_in_named(DeviceState *dev, qemu_irq_handler handler,
{
int i;
NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
- char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-in");
assert(gpio_list->num_out == 0 || !name);
gpio_list->in = qemu_extend_irqs(gpio_list->in, gpio_list->num_in, handler,
dev, n);
+ if (!name) {
+ name = "unnamed-gpio-in";
+ }
for (i = gpio_list->num_in; i < gpio_list->num_in + n; i++) {
+ gchar *propname = g_strdup_printf("%s[%u]", name, i);
+
object_property_add_child(OBJECT(dev), propname,
OBJECT(gpio_list->in[i]), &error_abort);
+ g_free(propname);
}
- g_free(propname);
gpio_list->num_in += n;
}
@@ -442,20 +446,25 @@ void qdev_init_gpio_out_named(DeviceState *dev, qemu_irq *pins,
{
int i;
NamedGPIOList *gpio_list = qdev_get_named_gpio_list(dev, name);
- char *propname = g_strdup_printf("%s[*]", name ? name : "unnamed-gpio-out");
assert(gpio_list->num_in == 0 || !name);
- gpio_list->num_out += n;
+ if (!name) {
+ name = "unnamed-gpio-out";
+ }
+ memset(pins, 0, sizeof(*pins) * n);
for (i = 0; i < n; ++i) {
- memset(&pins[i], 0, sizeof(*pins));
+ gchar *propname = g_strdup_printf("%s[%u]", name,
+ gpio_list->num_out + i);
+
object_property_add_link(OBJECT(dev), propname, TYPE_IRQ,
(Object **)&pins[i],
object_property_allow_set_link,
OBJ_PROP_LINK_UNREF_ON_RELEASE,
&error_abort);
+ g_free(propname);
}
- g_free(propname);
+ gpio_list->num_out += n;
}
void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n)
--
2.1.4
next prev parent reply other threads:[~2015-09-19 14:43 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-19 14:43 [Qemu-devel] [PULL 00/21] QOM devices patch queue 2015-09-19 Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 01/21] qom: Do not reuse errp after a possible error Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 02/21] qom: Fix invalid error check in property_get_str() Andreas Färber
2015-09-19 14:43 ` Andreas Färber [this message]
2015-09-19 14:43 ` [Qemu-devel] [PULL 04/21] machine: MACHINE_TYPE_NAME macro Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 05/21] vexpress: Don't set name on abstract class Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 06/21] vexpress: Rename machine classes to use MACHINE_TYPE_NAME Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 07/21] arm: Rename virt machine class " Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 08/21] pseries: Rename machine class names " Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 09/21] s390-virtio: Rename machine class name " Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 10/21] s390: Rename s390-ccw-virtio-2.4 " Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 11/21] mac99: Use MACHINE_TYPE_NAME to encode class name Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 12/21] machine: Ensure all TYPE_MACHINE subclasses have the right suffix Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 13/21] machine: Set MachineClass::name automatically Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 14/21] exynos4: Use EXYNOS4210_NCPUS instead of max_cpus on error message Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 15/21] exynos4: Use MachineClass instead of exynos4_machines array Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 16/21] exynos4: Declare each QEMUMachine as a separate variable Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 17/21] machine: DEFINE_MACHINE() macro Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 18/21] mac_world: Break long line Andreas Färber
2015-09-19 15:14 ` Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 19/21] Use DEFINE_MACHINE() to register all machines Andreas Färber
2015-09-19 14:43 ` [Qemu-devel] [PULL 20/21] Revert use of DEFINE_MACHINE() for registrations of multiple machines Andreas Färber
2015-09-21 15:49 ` Eduardo Habkost
2015-09-21 15:52 ` Andreas Färber
2015-09-21 17:24 ` Eduardo Habkost
2015-09-21 17:57 ` Eduardo Habkost
2015-09-19 14:43 ` [Qemu-devel] [PULL 21/21] machine: Eliminate QEMUMachine and qemu_register_machine() Andreas Färber
2015-09-19 16:56 ` [Qemu-devel] [PULL 00/21] QOM devices patch queue 2015-09-19 Peter Maydell
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=1442673810-2679-4-git-send-email-afaerber@suse.de \
--to=afaerber@suse.de \
--cc=p.fedin@samsung.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).