From: "Daniel P. Berrange" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Markus Armbruster" <armbru@redhat.com>,
Programmingkid <programmingkidx@gmail.com>,
Gonglei <arei.gonglei@huawei.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Andreas Färber" <afaerber@suse.de>
Subject: [Qemu-devel] [PATCH v3] monitor: allow object_del & device_del to accept QOM paths
Date: Tue, 1 Sep 2015 10:50:59 +0100 [thread overview]
Message-ID: <1441101059-14269-1-git-send-email-berrange@redhat.com> (raw)
Currently both object_del and device_del require that the
client provide the object/device short ID. While user
creatable objects require an ID to be provided at time of
creation, qdev devices may be created without giving an
ID. The only unique identifier they would then have is the
QOM object path.
Allowing device_del to accept an object path ensures all
devices are deletable regardless of whether they have an
ID.
(qemu) device_add usb-mouse
(qemu) qom-list /machine/peripheral-anon
device[0] (child<usb-mouse>)
type (string)
(qemu) device_del /machine/peripheral-anon/device[0]
Although objects require an ID to be provided upfront,
there may be cases where the client would prefer to
use QOM paths when deleting.
Devices are required to be marked as hotpluggable
otherwise an error is raised
(qemu) device_del /machine/unattached/device[4]
Device 'PIIX3' does not support hotplugging
Similarly objects are required to implement the
user-creatable interface
(qemu) object_del /machine/unattached/device[4]
/machine/unattached/device[4] is not a user-creatable object
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
Changed in v3:
- Add type checks to avoid assertion failures if user
supplied path is not of type device or user-creatable
hmp-commands.hx | 6 ++++--
qapi-schema.json | 4 ++--
qdev-monitor.c | 19 ++++++++++++++-----
qmp-commands.hx | 13 +++++++++++--
qmp.c | 15 ++++++++++++---
5 files changed, 43 insertions(+), 14 deletions(-)
diff --git a/hmp-commands.hx b/hmp-commands.hx
index d3b7932..c0c113d 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -675,7 +675,8 @@ ETEXI
STEXI
@item device_del @var{id}
@findex device_del
-Remove device @var{id}.
+Remove device @var{id}. @var{id} may be a short ID
+or a QOM object path.
ETEXI
{
@@ -1279,7 +1280,8 @@ ETEXI
STEXI
@item object_del
@findex object_del
-Destroy QOM object.
+Destroy QOM object. @var{id} may be a short ID
+or a QOM object path.
ETEXI
#ifdef CONFIG_SLIRP
diff --git a/qapi-schema.json b/qapi-schema.json
index 4342a08..bf9ef3a 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1950,7 +1950,7 @@
#
# Remove a device from a guest
#
-# @id: the name of the device
+# @id: the name or QOM path of the device
#
# Returns: Nothing on success
# If @id is not a valid device, DeviceNotFound
@@ -2121,7 +2121,7 @@
#
# Remove a QOM object.
#
-# @id: the name of the QOM object to remove
+# @id: the name or path of the QOM object to remove
#
# Returns: Nothing on success
# Error if @id is not a valid id for a QOM object
diff --git a/qdev-monitor.c b/qdev-monitor.c
index f9e2d62..295441b 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -785,19 +785,28 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
void qmp_device_del(const char *id, Error **errp)
{
Object *obj;
- char *root_path = object_get_canonical_path(qdev_get_peripheral());
- char *path = g_strdup_printf("%s/%s", root_path, id);
- g_free(root_path);
- obj = object_resolve_path_type(path, TYPE_DEVICE, NULL);
- g_free(path);
+ if (id[0] == '/') {
+ obj = object_resolve_path(id, NULL);
+ } else {
+ char *root_path = object_get_canonical_path(qdev_get_peripheral());
+ char *path = g_strdup_printf("%s/%s", root_path, id);
+ g_free(root_path);
+ obj = object_resolve_path_type(path, TYPE_DEVICE, NULL);
+ g_free(path);
+ }
if (!obj) {
error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
"Device '%s' not found", id);
return;
}
+ if (!object_dynamic_cast(obj, TYPE_DEVICE)) {
+ error_setg(errp, "%s is not a hotpluggable device", id);
+ return;
+ }
+
qdev_unplug(DEVICE(obj), errp);
}
diff --git a/qmp-commands.hx b/qmp-commands.hx
index ba630b1..09fc206 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -321,13 +321,18 @@ Remove a device.
Arguments:
-- "id": the device's ID (json-string)
+- "id": the device's ID or QOM path (json-string)
Example:
-> { "execute": "device_del", "arguments": { "id": "net1" } }
<- { "return": {} }
+Example:
+
+-> { "execute": "device_del", "arguments": { "id": "/machine/peripheral-anon/device[0]" } }
+<- { "return": {} }
+
EQMP
{
@@ -965,7 +970,7 @@ Remove QOM object.
Arguments:
-- "id": the object's ID (json-string)
+- "id": the object's ID or QOM path (json-string)
Example:
@@ -973,6 +978,10 @@ Example:
<- { "return": {} }
+-> { "execute": "object-del", "arguments": { "id": "/objects/hostmem1" } }
+<- { "return": {} }
+
+
EQMP
diff --git a/qmp.c b/qmp.c
index 403805a..b44612a 100644
--- a/qmp.c
+++ b/qmp.c
@@ -678,16 +678,25 @@ void qmp_object_add(QDict *qdict, QObject **ret, Error **errp)
void qmp_object_del(const char *id, Error **errp)
{
- Object *container;
Object *obj;
- container = object_get_objects_root();
- obj = object_resolve_path_component(container, id);
+ if (id[0] == '/') {
+ obj = object_resolve_path(id, NULL);
+ } else {
+ Object *container;
+ container = object_get_objects_root();
+ obj = object_resolve_path_component(container, id);
+ }
if (!obj) {
error_setg(errp, "object id not found");
return;
}
+ if (!object_dynamic_cast(obj, TYPE_USER_CREATABLE)) {
+ error_setg(errp, "%s is not a user-creatable object", id);
+ return;
+ }
+
if (!user_creatable_can_be_deleted(USER_CREATABLE(obj), errp)) {
error_setg(errp, "%s is in use, can not be deleted", id);
return;
--
2.4.3
next reply other threads:[~2015-09-01 9:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-01 9:50 Daniel P. Berrange [this message]
2015-09-01 13:13 ` [Qemu-devel] [PATCH v3] monitor: allow object_del & device_del to accept QOM paths Gonglei
2015-09-01 13:17 ` Andreas Färber
2015-09-01 13:23 ` Daniel P. Berrange
2015-09-01 15:55 ` Eric Blake
2015-09-01 15:58 ` Programmingkid
2015-09-01 16:00 ` Andreas Färber
2015-09-01 15:57 ` Eric Blake
2015-09-02 9:40 ` Paolo Bonzini
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=1441101059-14269-1-git-send-email-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=afaerber@suse.de \
--cc=arei.gonglei@huawei.com \
--cc=armbru@redhat.com \
--cc=pbonzini@redhat.com \
--cc=programmingkidx@gmail.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 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).