[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v2 25/35] multi-process: remote: add setup_devic
From: |
elena . ufimtseva |
Subject: |
[Qemu-devel] [RFC PATCH v2 25/35] multi-process: remote: add setup_devices and setup_drive msg processing |
Date: |
Mon, 17 Jun 2019 11:16:40 -0700 |
From: Elena Ufimtseva <address@hidden>
Receive by remote side the configuration messages and build the device
object from JSON device descriptions.
Signed-off-by: Elena Ufimtseva <address@hidden>
Signed-off-by: Jagannathan Raman <address@hidden>
Signed-off-by: John G Johnson <address@hidden>
---
Changes in v2:
- for new command line suboptions with libvirtd support, clean
the options before creating drives/devices.
- use default pci bus/address for now.
---
remote/remote-main.c | 140 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 140 insertions(+)
diff --git a/remote/remote-main.c b/remote/remote-main.c
index c5dc7c0009..8db2f36b90 100644
--- a/remote/remote-main.c
+++ b/remote/remote-main.c
@@ -54,6 +54,15 @@
#include "qemu/config-file.h"
#include "monitor/qdev.h"
#include "qapi/qmp/qdict.h"
+#include "sysemu/sysemu.h"
+#include "sysemu/blockdev.h"
+#include "block/block.h"
+#include "qapi/qmp/qstring.h"
+#include "hw/qdev-properties.h"
+#include "hw/scsi/scsi.h"
+#include "block/qdict.h"
+#include "qapi/qmp/qlist.h"
+#include "qemu/log.h"
static ProxyLinkState *proxy_link;
PCIDevice *remote_pci_dev;
@@ -223,6 +232,121 @@ fail:
PUT_REMOTE_WAIT(wait);
}
+static int init_drive(QDict *rqdict, Error **errp)
+{
+ QemuOpts *opts;
+ Error *local_error = NULL;
+
+ if (rqdict != NULL && qdict_size(rqdict) > 0) {
+ opts = qemu_opts_from_qdict(&qemu_drive_opts,
+ rqdict, &local_error);
+ if (!opts) {
+ error_propagate(errp, local_error);
+ return -EINVAL;
+ }
+ } else {
+ return -EINVAL;
+ }
+
+ qemu_opt_unset(opts, "rid");
+ qemu_opt_unset(opts, "socket");
+ qemu_opt_unset(opts, "remote");
+ qemu_opt_unset(opts, "command");
+
+ if (drive_new(opts, IF_IDE, &local_error) == NULL) {
+ error_propagate(errp, local_error);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int setup_drive(ProcMsg *msg, Error **errp)
+{
+ QObject *obj;
+ QDict *qdict;
+ QString *qstr;
+ Error *local_error = NULL;
+ int rc = -EINVAL;
+
+ if (!msg->data2) {
+ return rc;
+ }
+
+ qstr = qstring_from_str((char *)msg->data2);
+ obj = qobject_from_json(qstring_get_str(qstr), &local_error);
+ if (!obj) {
+ error_propagate(errp, local_error);
+ return rc;
+ }
+
+ qdict = qobject_to(QDict, obj);
+ if (!qdict) {
+ return rc;
+ }
+
+ if (init_drive(qdict, &local_error)) {
+ error_setg(errp, "init_drive failed in setup_drive.");
+ return rc;
+ }
+
+ return 0;
+}
+
+static int setup_device(ProcMsg *msg, Error **errp)
+{
+ QObject *obj;
+ QDict *qdict;
+ QString *qstr;
+ QemuOpts *opts;
+ DeviceState *dev = NULL;
+ int rc = -EINVAL;
+ Error *local_error = NULL;
+
+ if (!msg->data2) {
+ return rc;
+ }
+
+ qstr = qstring_from_str((char *)msg->data2);
+ obj = qobject_from_json(qstring_get_str(qstr), &local_error);
+ if (!obj) {
+ error_setg(errp, "Could not get object!");
+ return rc;
+ }
+
+ qdict = qobject_to(QDict, obj);
+ if (!qdict) {
+ return rc;
+ }
+
+ g_assert(qdict_size(qdict) > 1);
+
+ opts = qemu_opts_from_qdict(&qemu_device_opts, qdict, &local_error);
+ qemu_opt_unset(opts, "rid");
+ qemu_opt_unset(opts, "socket");
+ qemu_opt_unset(opts, "remote");
+ qemu_opt_unset(opts, "command");
+ /*
+ * TODO: use the bus and addr from the device options. For now
+ * we use default value.
+ */
+ qemu_opt_unset(opts, "bus");
+ qemu_opt_unset(opts, "addr");
+
+ dev = qdev_device_add(opts, &local_error);
+ if (!dev) {
+ error_setg(errp, "Could not add device %s.",
+ qstring_get_str(qobject_to_json(QOBJECT(qdict))));
+ return rc;
+ }
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
+ remote_pci_dev = PCI_DEVICE(dev);
+ }
+ qemu_opts_del(opts);
+
+ return 0;
+}
+
static void process_msg(GIOCondition cond)
{
ProcMsg *msg = NULL;
@@ -268,11 +392,27 @@ static void process_msg(GIOCondition cond)
*/
remote_sysmem_reconfig(msg, &err);
if (err) {
+ error_report_err(err);
goto finalize_loop;
}
break;
case SET_IRQFD:
process_set_irqfd_msg(remote_pci_dev, msg);
+ qdev_machine_creation_done();
+ qemu_mutex_lock_iothread();
+ qemu_run_machine_init_done_notifiers();
+ qemu_mutex_unlock_iothread();
+
+ break;
+ case DRIVE_OPTS:
+ if (setup_drive(msg, &err)) {
+ error_report_err(err);
+ }
+ break;
+ case DEV_OPTS:
+ if (setup_device(msg, &err)) {
+ error_report_err(err);
+ }
break;
case DEVICE_ADD:
process_device_add_msg(msg);
--
2.17.1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [RFC PATCH v2 25/35] multi-process: remote: add setup_devices and setup_drive msg processing,
elena . ufimtseva <=