From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52357) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZaNWr-0008VZ-7I for qemu-devel@nongnu.org; Fri, 11 Sep 2015 08:34:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZaNWm-000640-1r for qemu-devel@nongnu.org; Fri, 11 Sep 2015 08:34:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47896) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZaNWl-00063s-R0 for qemu-devel@nongnu.org; Fri, 11 Sep 2015 08:34:03 -0400 From: "Daniel P. Berrange" Date: Fri, 11 Sep 2015 13:33:56 +0100 Message-Id: <1441974836-17476-1-git-send-email-berrange@redhat.com> Subject: [Qemu-devel] [PATCH v4] monitor: allow device_del to accept QOM paths List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Markus Armbruster , Programmingkid , Paolo Bonzini , =?UTF-8?q?Andreas=20F=C3=A4rber?= Currently device_del requires that the client provide the device short ID. device_add allows devices may be created without giving an ID, at which point there is no way to delete them with device_del. The QOM object path, however, provides an alternative way to identify the devices. 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) type (string) (qemu) device_del /machine/peripheral-anon/device[0] 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 Signed-off-by: Daniel P. Berrange --- Changes in v4: - Drop additions to object_del, since that can be misused to delete internally created devices, and object_create mandates an ID parameter. hmp-commands.hx | 3 ++- qapi-schema.json | 2 +- qdev-monitor.c | 19 ++++++++++++++----- qmp-commands.hx | 7 ++++++- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/hmp-commands.hx b/hmp-commands.hx index 286dcc7..e56373b 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -676,7 +676,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 { diff --git a/qapi-schema.json b/qapi-schema.json index 67fef37..273a906 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 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 9848fd8..d3b4c7f 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 { -- 2.4.3