All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org, aliguori@us.ibm.com
Cc: ehabkost@redhat.com, mst@redhat.com, jfrei@linux.vnet.ibm.com,
	pbonzini@redhat.com, afaerber@suse.de, lig.fnst@cn.fujitsu.com
Subject: [Qemu-devel] [PATCH 4/4] target-i386: implement machine->hot_add_cpu hook
Date: Tue, 30 Apr 2013 08:34:03 +0200	[thread overview]
Message-ID: <1367303643-16036-5-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1367303643-16036-1-git-send-email-imammedo@redhat.com>

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v3:
  * use machine.cpu-model option to store default value and to
    get current value when hot-adding CPU
v2:
  * override .hot_add_cpu staticaly starting with 1.5 machine
---
 hw/i386/pc.c         | 29 +++++++++++++++++++++++++++++
 hw/i386/pc_piix.c    |  1 +
 hw/i386/pc_q35.c     |  1 +
 include/hw/i386/pc.h |  1 +
 4 files changed, 32 insertions(+)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 6b3faac..b7d28d6 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -54,6 +54,7 @@
 #include "qemu/config-file.h"
 #include "hw/acpi/acpi.h"
 #include "hw/cpu/icc_bus.h"
+#include "hw/boards.h"
 
 /* debug PC/ISA interrupts */
 //#define DEBUG_IRQ
@@ -915,6 +916,33 @@ static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id,
     return cpu;
 }
 
+void pc_hot_add_cpu(const int64_t id, Error **errp)
+{
+    DeviceState *icc_bridge;
+    const char *cpu_model;
+    QemuOpts *machine_opts;
+    int64_t apic_id = x86_cpu_apic_id_from_index(id);
+
+    if (cpu_exists(apic_id)) {
+        error_setg(errp, "Unable to add CPU: %" PRIi64
+                   ", it already exists", id);
+        return;
+    }
+
+    if (id >= max_cpus) {
+        error_setg(errp, "Unable to add CPU: %" PRIi64
+                   ", max allowed: %d", id, max_cpus - 1);
+        return;
+    }
+
+    machine_opts = qemu_opts_find(qemu_find_opts("machine"), 0);
+    cpu_model = qemu_opt_get(machine_opts, "cpu-model");
+
+    icc_bridge = DEVICE(object_resolve_path_type("icc-bridge",
+                                                 TYPE_ICC_BRIDGE, NULL));
+    pc_new_cpu(cpu_model, apic_id, icc_bridge, errp);
+}
+
 void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
 {
     int i;
@@ -928,6 +956,7 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
 #else
         cpu_model = "qemu32";
 #endif
+        qemu_opts_set(qemu_find_opts("machine"), 0, "cpu-model", cpu_model);
     }
 
     for (i = 0; i < smp_cpus; i++) {
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 2190f0a..8e1d179 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -325,6 +325,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
     .alias = "pc",
     .desc = "Standard PC (i440FX + PIIX, 1996)",
     .init = pc_init_pci,
+    .hot_add_cpu = pc_hot_add_cpu,
     .max_cpus = 255,
     .is_default = 1,
     DEFAULT_MACHINE_OPTIONS,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index a926e38..fe44087 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -214,6 +214,7 @@ static QEMUMachine pc_q35_machine_v1_5 = {
     .alias = "q35",
     .desc = "Standard PC (Q35 + ICH9, 2009)",
     .init = pc_q35_init,
+    .hot_add_cpu = pc_hot_add_cpu,
     .max_cpus = 255,
     DEFAULT_MACHINE_OPTIONS,
 };
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 8a6e76c..0bbb7b4 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -79,6 +79,7 @@ void pc_register_ferr_irq(qemu_irq irq);
 void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
 
 void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge);
+void pc_hot_add_cpu(const int64_t id, Error **errp);
 void pc_acpi_init(const char *default_dsdt);
 void *pc_memory_init(MemoryRegion *system_memory,
                     const char *kernel_filename,
-- 
1.8.2.1

      parent reply	other threads:[~2013-04-30  6:34 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-30  6:33 [Qemu-devel] [PATCH 0/4 v8 for-1.5] target-i386: CPU hot-add with cpu-add QMP command Igor Mammedov
2013-04-30  6:34 ` [Qemu-devel] [PATCH 1/4] add hot_add_cpu hook to QEMUMachine Igor Mammedov
2013-04-30  6:34 ` [Qemu-devel] [PATCH 2/4] QMP: add cpu-add command Igor Mammedov
2013-04-30 13:46   ` Eduardo Habkost
2013-04-30 13:53     ` [Qemu-devel] [libvirt] " Peter Krempa
2013-04-30 13:56     ` [Qemu-devel] " Igor Mammedov
2013-04-30  6:34 ` [Qemu-devel] [PATCH 3/4] add cpu-model option to -machine Igor Mammedov
2013-04-30 12:09   ` Eduardo Habkost
2013-04-30  6:34 ` Igor Mammedov [this message]

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=1367303643-16036-5-git-send-email-imammedo@redhat.com \
    --to=imammedo@redhat.com \
    --cc=afaerber@suse.de \
    --cc=aliguori@us.ibm.com \
    --cc=ehabkost@redhat.com \
    --cc=jfrei@linux.vnet.ibm.com \
    --cc=lig.fnst@cn.fujitsu.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.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 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.