mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
virtio-bus: Plug devices after features are negotiated
Currently, devices are plugged before features are negotiated. If the backend doesn't support VIRTIO_F_VERSION_1, the transport needs to rewind some settings. This is the case for CCW, for which a post_plugged callback had been introduced, where max_rev field is just updated if VIRTIO_F_VERSION_1 is not supported by the backend. For PCI, implementing post_plugged would be much more complicated, so it needs to know whether the backend supports VIRTIO_F_VERSION_1 at plug time. Currently, nothing is done for PCI. Modern capabilities get exposed to the guest even if VIRTIO_F_VERSION_1 is not supported by the backend, which confuses the guest. This patch replaces existing post_plugged solution with an approach that fits with both transports. Features negotiation is performed before ->device_plugged() call. A pre_plugged callback is introduced so that the transports can set their supported features. Cc: Michael S. Tsirkin <mst@redhat.com> Cc: qemu-stable@nongnu.org Tested-by: Cornelia Huck <cornelia.huck@de.ibm.com> [ccw] Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> Reviewed-by: Marcel Apfelbaum <marcel@redhat.com> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
parent
d1eb8f2acb
commit
d1b4259f1a
5 changed files with 62 additions and 28 deletions
|
@ -53,16 +53,16 @@ typedef struct VirtioBusClass {
|
|||
bool (*query_guest_notifiers)(DeviceState *d);
|
||||
int (*set_guest_notifiers)(DeviceState *d, int nvqs, bool assign);
|
||||
void (*vmstate_change)(DeviceState *d, bool running);
|
||||
/*
|
||||
* Expose the features the transport layer supports before
|
||||
* the negotiation takes place.
|
||||
*/
|
||||
void (*pre_plugged)(DeviceState *d, Error **errp);
|
||||
/*
|
||||
* transport independent init function.
|
||||
* This is called by virtio-bus just after the device is plugged.
|
||||
*/
|
||||
void (*device_plugged)(DeviceState *d, Error **errp);
|
||||
/*
|
||||
* Re-evaluate setup after feature bits have been validated
|
||||
* by the device backend.
|
||||
*/
|
||||
void (*post_plugged)(DeviceState *d, Error **errp);
|
||||
/*
|
||||
* transport independent exit function.
|
||||
* This is called by virtio-bus just before the device is unplugged.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue