* [Qemu-devel] [RFC PATCH v2 25/35] multi-process: remote: add setup_devices and setup_drive msg processing
@ 2019-06-17 18:16 elena.ufimtseva
0 siblings, 0 replies; only message in thread
From: elena.ufimtseva @ 2019-06-17 18:16 UTC (permalink / raw)
To: qemu-devel
Cc: elena.ufimtseva, john.g.johnson, jag.raman, konrad.wilk,
ross.lagerwall, liran.alon, stefanha, kanth.ghatraju
From: Elena Ufimtseva <elena.ufimtseva@oracle.com>
Receive by remote side the configuration messages and build the device
object from JSON device descriptions.
Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
---
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
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2019-06-17 18:50 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-06-17 18:16 [Qemu-devel] [RFC PATCH v2 25/35] multi-process: remote: add setup_devices and setup_drive msg processing elena.ufimtseva
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).