From nobody Mon Feb 9 10:20:38 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1567544322; cv=none; d=zoho.com; s=zohoarc; b=n4C9wdyxGaYAB7dEGiKfBAb/SmHEW6R6Ky307uoGNqMdGaTnPuy2wQiPH+o3DuQLWN0BnCDCArqzLFUx3cEfZQPYAD7pqkhoILbTHdPm5MctiwKS6IqZWPOINaQeFvTbBwU9PQf6avWMj4cBS3NqwMOp8K+s3Eir7frpBXp29Dw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567544322; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Q22KB8TATm5qt9z400d/WBN//xpURZqDM87m/OOmhks=; b=AihCnbdCVGOeyD7JwnjrhbV2wW5/asJRPro6po0pUgw7VjmN8NmaYa+a/0GRqXP3HqBDRdsz0p+Kxw4tLMTzpD7w8sOv8YM8a5RSkVD8dlY/DdIhwmVT7ZhT9BZI/jYKH4reOhboGKNqUYmVmtHFgdRS/vI6BLgMuZ5DCYYChXs= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567544322288699.3673736966621; Tue, 3 Sep 2019 13:58:42 -0700 (PDT) Received: from localhost ([::1]:51362 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5Fsn-0000Ze-5w for importer@patchew.org; Tue, 03 Sep 2019 16:58:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53526) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5Fa4-0007fQ-6A for qemu-devel@nongnu.org; Tue, 03 Sep 2019 16:39:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5Fa2-0000X1-6W for qemu-devel@nongnu.org; Tue, 03 Sep 2019 16:39:11 -0400 Received: from userp2130.oracle.com ([156.151.31.86]:36802) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5Fa1-0000Vo-RQ for qemu-devel@nongnu.org; Tue, 03 Sep 2019 16:39:10 -0400 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x83KXeGR066101; Tue, 3 Sep 2019 20:39:03 GMT Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by userp2130.oracle.com with ESMTP id 2usy4u831y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 03 Sep 2019 20:39:03 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x83KcAIb025408; Tue, 3 Sep 2019 20:39:02 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserp3020.oracle.com with ESMTP id 2us5pha0f5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 03 Sep 2019 20:39:02 +0000 Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id x83Kd1RP012515; Tue, 3 Sep 2019 20:39:01 GMT Received: from jaraman-bur-1.us.oracle.com (/10.152.33.39) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Sep 2019 13:39:01 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : in-reply-to : references; s=corp-2019-08-05; bh=Q22KB8TATm5qt9z400d/WBN//xpURZqDM87m/OOmhks=; b=NCXpOLPxYeWEi9djZlaEpgfSf342GuP7MUzLODi1kWx4wl5qbext5HJLnqbRCkf2P0UQ esePhZOcw0LyxCc7B4g+JjLYZck2gWeNm7fg2DtY/HsCQGJabKqrxrFzEHZ3dS1gB9GQ RHGqH5W4XEWRv6oHvVyZq6q1J3nRT+ln8VAuRIr/eeRiNcGbx5uqPazzUAm/I30erbBG 5HUvSzYE5onWZTIxrQv+isgRvuxX5h5aAGC/U2zNvKCHWDyCtKLFB/p+8IQTHB005CaI ujxDKk9sJXuWcdRpRucroU0Kg8q5tgVATotuCccPkzwm6s5wGWfsvYbo2cvCijYs7T9k Aw== From: Jagannathan Raman To: qemu-devel@nongnu.org Date: Tue, 3 Sep 2019 16:37:50 -0400 Message-Id: X-Mailer: git-send-email 1.8.3.1 In-Reply-To: References: In-Reply-To: References: X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9369 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=1 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1906280000 definitions=main-1909030207 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9369 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1906280000 definitions=main-1909030206 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] X-Received-From: 156.151.31.86 Subject: [Qemu-devel] [RFC v3 PATCH 24/45] multi-process: remote: add setup_devices and setup_drive msg processing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: elena.ufimtseva@oracle.com, fam@euphon.net, john.g.johnson@oracle.com, kraxel@redhat.com, jag.raman@oracle.com, quintela@redhat.com, mst@redhat.com, armbru@redhat.com, kanth.ghatraju@oracle.com, thuth@redhat.com, ehabkost@redhat.com, konrad.wilk@oracle.com, dgilbert@redhat.com, liran.alon@oracle.com, stefanha@redhat.com, rth@twiddle.net, kwolf@redhat.com, berrange@redhat.com, mreitz@redhat.com, ross.lagerwall@citrix.com, marcandre.lureau@gmail.com, pbonzini@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Elena Ufimtseva Receive by remote side the configuration messages and build the device object from JSON device descriptions. Signed-off-by: Elena Ufimtseva Signed-off-by: Jagannathan Raman Signed-off-by: John G Johnson --- v1 -> v2: - for new command line suboptions with libvirtd support, clean the options before creating drives/devices - use default pci bus/address for now include/hw/qdev-core.h | 2 + qdev-monitor.c | 2 +- remote/remote-main.c | 231 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 234 insertions(+), 1 deletion(-) diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h index 136df77..2f81894 100644 --- a/include/hw/qdev-core.h +++ b/include/hw/qdev-core.h @@ -360,6 +360,8 @@ BusState *qdev_get_parent_bus(DeviceState *dev); =20 DeviceState *qdev_find_recursive(BusState *bus, const char *id); =20 +DeviceState *find_device_state(const char *id, Error **errp); + /* Returns 0 to walk children, > 0 to skip walk, < 0 to terminate walk. */ typedef int (qbus_walkerfn)(BusState *bus, void *opaque); typedef int (qdev_walkerfn)(DeviceState *dev, void *opaque); diff --git a/qdev-monitor.c b/qdev-monitor.c index d6f7572..69e467e 100644 --- a/qdev-monitor.c +++ b/qdev-monitor.c @@ -1017,7 +1017,7 @@ void qmp_device_add(QDict *qdict, QObject **ret_data,= Error **errp) object_unref(OBJECT(dev)); } =20 -static DeviceState *find_device_state(const char *id, Error **errp) +DeviceState *find_device_state(const char *id, Error **errp) { Object *obj; =20 diff --git a/remote/remote-main.c b/remote/remote-main.c index 8af284e..3e92a83 100644 --- a/remote/remote-main.c +++ b/remote/remote-main.c @@ -48,6 +48,21 @@ #include "exec/memattrs.h" #include "exec/address-spaces.h" #include "remote/iohub.h" +#include "qapi/qmp/qjson.h" +#include "qapi/qmp/qobject.h" +#include "qemu/option.h" +#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" =20 static ProxyLinkState *proxy_link; PCIDevice *remote_pci_dev; @@ -138,6 +153,200 @@ fail: PUT_REMOTE_WAIT(wait); } =20 +static void process_device_add_msg(ProcMsg *msg) +{ + Error *local_err =3D NULL; + const char *json =3D (const char *)msg->data2; + int wait =3D msg->fds[0]; + QObject *qobj =3D NULL; + QDict *qdict =3D NULL; + QemuOpts *opts =3D NULL; + + qobj =3D qobject_from_json(json, &local_err); + if (local_err) { + goto fail; + } + + qdict =3D qobject_to(QDict, qobj); + assert(qdict); + + opts =3D qemu_opts_from_qdict(qemu_find_opts("device"), qdict, &local_= err); + if (local_err) { + goto fail; + } + + (void)qdev_device_add(opts, &local_err); + if (local_err) { + goto fail; + } + +fail: + if (local_err) { + error_report_err(local_err); + /* TODO: communicate the exact error message to proxy */ + } + + notify_proxy(wait, 1); + + PUT_REMOTE_WAIT(wait); +} + +static void process_device_del_msg(ProcMsg *msg) +{ + Error *local_err =3D NULL; + DeviceState *dev =3D NULL; + const char *json =3D (const char *)msg->data2; + int wait =3D msg->fds[0]; + QObject *qobj =3D NULL; + QDict *qdict =3D NULL; + const char *id; + + qobj =3D qobject_from_json(json, &local_err); + if (local_err) { + goto fail; + } + + qdict =3D qobject_to(QDict, qobj); + assert(qdict); + + id =3D qdict_get_try_str(qdict, "id"); + assert(id); + + dev =3D find_device_state(id, &local_err); + if (local_err) { + goto fail; + } + + if (dev) { + qdev_unplug(dev, &local_err); + } + +fail: + if (local_err) { + error_report_err(local_err); + /* TODO: communicate the exact error message to proxy */ + } + + notify_proxy(wait, 1); + + PUT_REMOTE_WAIT(wait); +} + +static int init_drive(QDict *rqdict, Error **errp) +{ + QemuOpts *opts; + Error *local_error =3D NULL; + + if (rqdict !=3D NULL && qdict_size(rqdict) > 0) { + opts =3D 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) =3D=3D 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 =3D NULL; + int rc =3D -EINVAL; + + if (!msg->data2) { + return rc; + } + + qstr =3D qstring_from_str((char *)msg->data2); + obj =3D qobject_from_json(qstring_get_str(qstr), &local_error); + if (!obj) { + error_propagate(errp, local_error); + return rc; + } + + qdict =3D 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 =3D NULL; + int rc =3D -EINVAL; + Error *local_error =3D NULL; + + if (!msg->data2) { + return rc; + } + + qstr =3D qstring_from_str((char *)msg->data2); + obj =3D qobject_from_json(qstring_get_str(qstr), &local_error); + if (!obj) { + error_setg(errp, "Could not get object!"); + return rc; + } + + qdict =3D qobject_to(QDict, obj); + if (!qdict) { + return rc; + } + + g_assert(qdict_size(qdict) > 1); + + opts =3D 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 =3D 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 =3D PCI_DEVICE(dev); + } + qemu_opts_del(opts); + + return 0; +} + static void process_msg(GIOCondition cond, ProcChannel *chan) { ProcMsg *msg =3D NULL; @@ -183,11 +392,33 @@ static void process_msg(GIOCondition cond, ProcChanne= l *chan) */ 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); + break; + case DEVICE_DEL: + process_device_del_msg(msg); break; default: error_setg(&err, "Unknown command"); --=20 1.8.3.1