From: Jan Kiszka <jan.kiszka@web.de>
To: qemu-devel@nongnu.org, Anthony Liguori <aliguori@us.ibm.com>
Cc: Juan Quintela <quintela@redhat.com>,
Jan Kiszka <jan.kiszka@siemens.com>,
Markus Armbruster <armbru@redhat.com>,
Luiz Capitulino <lcapitulino@redhat.com>,
Blue Swirl <blauwirbel@gmail.com>, Avi Kivity <avi@redhat.com>
Subject: [Qemu-devel] [PATCH v4 07/23] qdev: Allow device specification by qtree path for device_del
Date: Wed, 16 Jun 2010 00:38:31 +0200 [thread overview]
Message-ID: <4ce8e9efe689eed00bccad228ccaea2210c69821.1276641524.git.jan.kiszka@web.de> (raw)
In-Reply-To: <cover.1276641524.git.jan.kiszka@web.de>
In-Reply-To: <cover.1276641524.git.jan.kiszka@web.de>
From: Jan Kiszka <jan.kiszka@siemens.com>
Allow to specify the device to be removed via device_del not only by ID
but also by its full or abbreviated qtree path. For this purpose,
qdev_find is introduced which combines walking the qtree with searching
for device IDs if required.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
hw/qdev.c | 75 ++++++++++++++++++++++++++++++++++++++++++++-----------
qemu-monitor.hx | 10 +++---
2 files changed, 65 insertions(+), 20 deletions(-)
diff --git a/hw/qdev.c b/hw/qdev.c
index ac450cf..2d1d171 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -39,7 +39,7 @@ DeviceInfo *device_info_list;
static BusState *qbus_find_recursive(BusState *bus, const char *name,
const BusInfo *info);
-static BusState *qbus_find(const char *path);
+static BusState *qbus_find(const char *path, bool report_errors);
/* Register a new device type. */
void qdev_register(DeviceInfo *info)
@@ -217,7 +217,7 @@ DeviceState *qdev_device_add(QemuOpts *opts)
/* find bus */
path = qemu_opt_get(opts, "bus");
if (path != NULL) {
- bus = qbus_find(path);
+ bus = qbus_find(path, true);
if (!bus) {
return NULL;
}
@@ -475,7 +475,7 @@ static BusState *qbus_find_recursive(BusState *bus, const char *name,
return NULL;
}
-static DeviceState *qdev_find_recursive(BusState *bus, const char *id)
+static DeviceState *qdev_find_id_recursive(BusState *bus, const char *id)
{
DeviceState *dev, *ret;
BusState *child;
@@ -484,7 +484,7 @@ static DeviceState *qdev_find_recursive(BusState *bus, const char *id)
if (dev->id && strcmp(dev->id, id) == 0)
return dev;
QTAILQ_FOREACH(child, &dev->child_bus, sibling) {
- ret = qdev_find_recursive(child, id);
+ ret = qdev_find_id_recursive(child, id);
if (ret) {
return ret;
}
@@ -590,7 +590,7 @@ static DeviceState *qbus_find_dev(BusState *bus, const char *elem)
return NULL;
}
-static BusState *qbus_find(const char *path)
+static BusState *qbus_find(const char *path, bool report_errors)
{
DeviceState *dev;
BusState *bus = main_system_bus;
@@ -600,7 +600,7 @@ static BusState *qbus_find(const char *path)
/* search for bus name recursively if path is not absolute */
if (path[0] != '/') {
bus = qbus_find_recursive(bus, path, NULL);
- if (!bus) {
+ if (!bus && report_errors) {
qerror_report(QERR_BUS_NOT_FOUND, path);
}
return bus;
@@ -623,12 +623,16 @@ static BusState *qbus_find(const char *path)
pos += len;
dev = qbus_find_dev(bus, elem);
if (!dev) {
- qerror_report(QERR_DEVICE_NOT_FOUND, elem);
- qbus_list_dev(bus);
+ if (report_errors) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, elem);
+ qbus_list_dev(bus);
+ }
return NULL;
}
if (dev->num_child_bus == 0) {
- qerror_report(QERR_DEVICE_NO_BUS, elem);
+ if (report_errors) {
+ qerror_report(QERR_DEVICE_NO_BUS, elem);
+ }
return NULL;
}
@@ -644,13 +648,55 @@ static BusState *qbus_find(const char *path)
pos += len;
bus = qbus_find_bus(dev, elem);
if (!bus) {
- qerror_report(QERR_BUS_NOT_FOUND, elem);
- qbus_list_bus(dev);
+ if (report_errors) {
+ qerror_report(QERR_BUS_NOT_FOUND, elem);
+ qbus_list_bus(dev);
+ }
return NULL;
}
}
}
+static DeviceState *qdev_find(const char *path)
+{
+ const char *dev_name;
+ DeviceState *dev;
+ char *bus_path;
+ BusState *bus;
+
+ /* search for unique ID recursively if path is not absolute */
+ if (path[0] != '/') {
+ dev = qdev_find_id_recursive(main_system_bus, path);
+ if (!dev) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, path);
+ }
+ return dev;
+ }
+
+ dev_name = strrchr(path, '/') + 1;
+
+ bus_path = qemu_strdup(path);
+ bus_path[dev_name - path] = 0;
+
+ bus = qbus_find(bus_path, false);
+ qemu_free(bus_path);
+ if (!bus) {
+ /* retry with full path to generate correct error message */
+ bus = qbus_find(path, true);
+ if (!bus) {
+ return NULL;
+ }
+ dev_name = "";
+ }
+
+ dev = qbus_find_dev(bus, dev_name);
+ if (!dev) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, dev_name);
+ qbus_list_dev(bus);
+ }
+ return dev;
+}
+
void qbus_create_inplace(BusState *bus, BusInfo *info,
DeviceState *parent, const char *name)
{
@@ -810,12 +856,11 @@ int do_device_add(Monitor *mon, const QDict *qdict, QObject **ret_data)
int do_device_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
{
- const char *id = qdict_get_str(qdict, "id");
+ const char *path = qdict_get_str(qdict, "device");
DeviceState *dev;
- dev = qdev_find_recursive(main_system_bus, id);
- if (NULL == dev) {
- qerror_report(QERR_DEVICE_NOT_FOUND, id);
+ dev = qdev_find(path);
+ if (!dev) {
return -1;
}
return qdev_unplug(dev);
diff --git a/qemu-monitor.hx b/qemu-monitor.hx
index 9f62b94..0ea0555 100644
--- a/qemu-monitor.hx
+++ b/qemu-monitor.hx
@@ -703,7 +703,7 @@ EQMP
{
.name = "device_del",
- .args_type = "id:s",
+ .args_type = "device:s",
.params = "device",
.help = "remove device",
.user_print = monitor_user_noop,
@@ -711,10 +711,10 @@ EQMP
},
STEXI
-@item device_del @var{id}
+@item device_del @var{device}
@findex device_del
-Remove device @var{id}.
+Remove @var{device}, specified via its qtree path or unique ID.
ETEXI
SQMP
device_del
@@ -724,11 +724,11 @@ Remove a device.
Arguments:
-- "id": the device's ID (json-string)
+- "device": the device's qtree path or unique ID (json-string)
Example:
--> { "execute": "device_del", "arguments": { "id": "net1" } }
+-> { "execute": "device_del", "arguments": { "device": "net1" } }
<- { "return": {} }
EQMP
--
1.6.0.2
next prev parent reply other threads:[~2010-06-15 22:39 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-15 22:38 [Qemu-devel] [PATCH v4 00/23] qdev path reworks & basic device state visualization Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 01/23] qdev: Rework qtree path abbreviations Jan Kiszka
2010-06-23 8:44 ` Markus Armbruster
2010-06-23 9:32 ` Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 02/23] qdev: Restrict direct bus addressing via its name Jan Kiszka
2010-06-23 8:45 ` Markus Armbruster
2010-06-23 10:17 ` Jan Kiszka
2010-06-23 11:24 ` Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 03/23] qdev: Drop ID matching from qtree paths Jan Kiszka
2010-06-23 8:55 ` Markus Armbruster
2010-06-23 10:17 ` Jan Kiszka
2010-06-23 11:38 ` Markus Armbruster
2010-06-23 12:15 ` Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 04/23] qdev: Allow device addressing via 'driver.instance' Jan Kiszka
2010-06-23 9:10 ` Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 05/23] qdev: Convert device and bus lists to QTAILQ Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 06/23] qdev: Push QMP mode checks into qbus_list_bus/dev Jan Kiszka
2010-06-15 22:38 ` Jan Kiszka [this message]
2010-06-23 9:37 ` [Qemu-devel] [PATCH v4 07/23] qdev: Allow device specification by qtree path for device_del Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 08/23] qdev: Introduce qdev_iterate_recursive Jan Kiszka
2010-06-23 9:40 ` Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 09/23] monitor: Fix leakage during completion processing Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 10/23] monitor: Fix command completion vs. boolean switches Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 11/23] monitor: Add completion support for option lists Jan Kiszka
2010-06-23 9:45 ` Markus Armbruster
2010-06-23 10:28 ` Jan Kiszka
2010-06-23 17:08 ` Markus Armbruster
2010-06-28 14:28 ` Luiz Capitulino
2010-06-28 14:40 ` Jan Kiszka
2010-06-28 16:20 ` Luiz Capitulino
2010-06-28 16:27 ` [Qemu-devel] [PATCH] monitor: Allow to exclude commands from QMP Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 12/23] monitor: Add completion for qdev paths Jan Kiszka
2010-06-23 9:46 ` Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 13/23] monitor: Allow to specify HMP-specifc command arguments Jan Kiszka
2010-06-23 9:56 ` Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 14/23] monitor: return length of printed string via monitor_[v]printf Jan Kiszka
2010-06-23 9:57 ` Markus Armbruster
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 15/23] monitor: Establish cmd flags and convert the async tag Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 16/23] monitor: Allow to exclude commands from QMP Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 17/23] Add base64 encoder/decoder Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 18/23] QMP: Reserve namespace for complex object classes Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 19/23] QMP: Add QBuffer Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 20/23] monitor: Add basic device state visualization Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 21/23] QMP: Teach basic capability negotiation to python example Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 22/23] QMP: Fix python helper /wrt long return strings Jan Kiszka
2010-06-15 22:38 ` [Qemu-devel] [PATCH v4 23/23] QMP: Add support for buffer class to qmp python helper Jan Kiszka
2010-06-23 10:01 ` [Qemu-devel] [PATCH v4 00/23] qdev path reworks & basic device state visualization Markus Armbruster
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=4ce8e9efe689eed00bccad228ccaea2210c69821.1276641524.git.jan.kiszka@web.de \
--to=jan.kiszka@web.de \
--cc=aliguori@us.ibm.com \
--cc=armbru@redhat.com \
--cc=avi@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=jan.kiszka@siemens.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/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).