qdev: unplug blocker for devices

Add blocker to prevent hot-unplug of devices

TYPE_VFIO_USER_SERVER, which is introduced shortly, attaches itself to a
PCIDevice on which it depends. If the attached PCIDevice gets removed
while the server in use, it could cause it crash. To prevent this,
TYPE_VFIO_USER_SERVER adds an unplug blocker for the PCIDevice.

Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: c41ef80b7cc063314d629737bed2159e5713f2e0.1655151679.git.jag.raman@oracle.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Jagannathan Raman 2022-06-13 16:26:21 -04:00 committed by Stefan Hajnoczi
parent e2848bc574
commit 217c7f01ad
3 changed files with 57 additions and 0 deletions

View file

@ -193,6 +193,7 @@ struct DeviceState {
int instance_id_alias;
int alias_required_for_version;
ResettableState reset;
GSList *unplug_blockers;
};
struct DeviceListener {
@ -419,6 +420,34 @@ void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
void qdev_machine_creation_done(void);
bool qdev_machine_modified(void);
/**
* qdev_add_unplug_blocker: Add an unplug blocker to a device
*
* @dev: Device to be blocked from unplug
* @reason: Reason for blocking
*/
void qdev_add_unplug_blocker(DeviceState *dev, Error *reason);
/**
* qdev_del_unplug_blocker: Remove an unplug blocker from a device
*
* @dev: Device to be unblocked
* @reason: Pointer to the Error used with qdev_add_unplug_blocker.
* Used as a handle to lookup the blocker for deletion.
*/
void qdev_del_unplug_blocker(DeviceState *dev, Error *reason);
/**
* qdev_unplug_blocked: Confirm if a device is blocked from unplug
*
* @dev: Device to be tested
* @reason: Returns one of the reasons why the device is blocked,
* if any
*
* Returns: true if device is blocked from unplug, false otherwise
*/
bool qdev_unplug_blocked(DeviceState *dev, Error **errp);
/**
* GpioPolarity: Polarity of a GPIO line
*