mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
![Daniel P. Berrangé](/assets/img/avatar_default.png)
The -device JSON syntax impl leaks a reference on the created
DeviceState instance. As a result when you hot-unplug the
device, the device_finalize method won't be called and thus
it will fail to emit the required DEVICE_DELETED event.
A 'json-cli' feature was previously added against the
'device_add' QMP command QAPI schema to indicated to mgmt
apps that -device supported JSON syntax. Given the hotplug
bug that feature flag is not usable for its purpose, so
we add a new 'json-cli-hotplug' feature to indicate the
-device supports JSON without breaking hotplug.
Fixes: 5dacda5167
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/802
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-Id: <20220105123847.4047954-2-berrange@redhat.com>
Reviewed-by: Laurent Vivier <lvivier@redhat.com>
Tested-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
162 lines
4.5 KiB
Python
162 lines
4.5 KiB
Python
# -*- Mode: Python -*-
|
|
# vim: filetype=python
|
|
#
|
|
# This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
# See the COPYING file in the top-level directory.
|
|
|
|
##
|
|
# = Device infrastructure (qdev)
|
|
##
|
|
|
|
{ 'include': 'qom.json' }
|
|
|
|
##
|
|
# @device-list-properties:
|
|
#
|
|
# List properties associated with a device.
|
|
#
|
|
# @typename: the type name of a device
|
|
#
|
|
# Returns: a list of ObjectPropertyInfo describing a devices properties
|
|
#
|
|
# Note: objects can create properties at runtime, for example to describe
|
|
# links between different devices and/or objects. These properties
|
|
# are not included in the output of this command.
|
|
#
|
|
# Since: 1.2
|
|
##
|
|
{ 'command': 'device-list-properties',
|
|
'data': { 'typename': 'str'},
|
|
'returns': [ 'ObjectPropertyInfo' ] }
|
|
|
|
##
|
|
# @device_add:
|
|
#
|
|
# Add a device.
|
|
#
|
|
# @driver: the name of the new device's driver
|
|
#
|
|
# @bus: the device's parent bus (device tree path)
|
|
#
|
|
# @id: the device's ID, must be unique
|
|
#
|
|
# Features:
|
|
# @json-cli: If present, the "-device" command line option supports JSON
|
|
# syntax with a structure identical to the arguments of this
|
|
# command.
|
|
# @json-cli-hotplug: If present, the "-device" command line option supports JSON
|
|
# syntax without the reference counting leak that broke
|
|
# hot-unplug
|
|
#
|
|
# Notes:
|
|
#
|
|
# Additional arguments depend on the type.
|
|
#
|
|
# 1. For detailed information about this command, please refer to the
|
|
# 'docs/qdev-device-use.txt' file.
|
|
#
|
|
# 2. It's possible to list device properties by running QEMU with the
|
|
# "-device DEVICE,help" command-line argument, where DEVICE is the
|
|
# device's name
|
|
#
|
|
# Example:
|
|
#
|
|
# -> { "execute": "device_add",
|
|
# "arguments": { "driver": "e1000", "id": "net1",
|
|
# "bus": "pci.0",
|
|
# "mac": "52:54:00:12:34:56" } }
|
|
# <- { "return": {} }
|
|
#
|
|
# TODO: This command effectively bypasses QAPI completely due to its
|
|
# "additional arguments" business. It shouldn't have been added to
|
|
# the schema in this form. It should be qapified properly, or
|
|
# replaced by a properly qapified command.
|
|
#
|
|
# Since: 0.13
|
|
##
|
|
{ 'command': 'device_add',
|
|
'data': {'driver': 'str', '*bus': 'str', '*id': 'str'},
|
|
'gen': false, # so we can get the additional arguments
|
|
'features': ['json-cli', 'json-cli-hotplug'] }
|
|
|
|
##
|
|
# @device_del:
|
|
#
|
|
# Remove a device from a guest
|
|
#
|
|
# @id: the device's ID or QOM path
|
|
#
|
|
# Returns: Nothing on success
|
|
# If @id is not a valid device, DeviceNotFound
|
|
#
|
|
# Notes: When this command completes, the device may not be removed from the
|
|
# guest. Hot removal is an operation that requires guest cooperation.
|
|
# This command merely requests that the guest begin the hot removal
|
|
# process. Completion of the device removal process is signaled with a
|
|
# DEVICE_DELETED event. Guest reset will automatically complete removal
|
|
# for all devices. If a guest-side error in the hot removal process is
|
|
# detected, the device will not be removed and a DEVICE_UNPLUG_GUEST_ERROR
|
|
# event is sent. Some errors cannot be detected.
|
|
#
|
|
# Since: 0.14
|
|
#
|
|
# Example:
|
|
#
|
|
# -> { "execute": "device_del",
|
|
# "arguments": { "id": "net1" } }
|
|
# <- { "return": {} }
|
|
#
|
|
# -> { "execute": "device_del",
|
|
# "arguments": { "id": "/machine/peripheral-anon/device[0]" } }
|
|
# <- { "return": {} }
|
|
#
|
|
##
|
|
{ 'command': 'device_del', 'data': {'id': 'str'} }
|
|
|
|
##
|
|
# @DEVICE_DELETED:
|
|
#
|
|
# Emitted whenever the device removal completion is acknowledged by the guest.
|
|
# At this point, it's safe to reuse the specified device ID. Device removal can
|
|
# be initiated by the guest or by HMP/QMP commands.
|
|
#
|
|
# @device: the device's ID if it has one
|
|
#
|
|
# @path: the device's QOM path
|
|
#
|
|
# Since: 1.5
|
|
#
|
|
# Example:
|
|
#
|
|
# <- { "event": "DEVICE_DELETED",
|
|
# "data": { "device": "virtio-net-pci-0",
|
|
# "path": "/machine/peripheral/virtio-net-pci-0" },
|
|
# "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
|
#
|
|
##
|
|
{ 'event': 'DEVICE_DELETED',
|
|
'data': { '*device': 'str', 'path': 'str' } }
|
|
|
|
##
|
|
# @DEVICE_UNPLUG_GUEST_ERROR:
|
|
#
|
|
# Emitted when a device hot unplug fails due to a guest reported error.
|
|
#
|
|
# @device: the device's ID if it has one
|
|
#
|
|
# @path: the device's QOM path
|
|
#
|
|
# Since: 6.2
|
|
#
|
|
# Example:
|
|
#
|
|
# <- { "event": "DEVICE_UNPLUG_GUEST_ERROR"
|
|
# "data": { "device": "core1",
|
|
# "path": "/machine/peripheral/core1" },
|
|
# },
|
|
# "timestamp": { "seconds": 1615570772, "microseconds": 202844 } }
|
|
#
|
|
##
|
|
{ 'event': 'DEVICE_UNPLUG_GUEST_ERROR',
|
|
'data': { '*device': 'str', 'path': 'str' } }
|