mirror of
https://github.com/qemu/qemu.git
synced 2024-12-04 01:03:38 +08:00
vhost: Always store new kick fd on vhost_svq_set_svq_kick_fd
We can unbind twice a file descriptor if we call twice
vhost_svq_set_svq_kick_fd because of this. Since it comes from vhost and
not from SVQ, that file descriptor could be a different thing that
guest's vhost notifier.
Likewise, it can happens the same if a guest start and stop the device
multiple times.
Reported-by: Lei Yang <leiyang@redhat.com>
Fixes: dff4426fa6
("vhost: Add Shadow VirtQueue kick forwarding capabilities")
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
5b590f51b9
commit
8b64e48642
@ -602,13 +602,13 @@ void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *svq, int svq_kick_fd)
|
|||||||
event_notifier_set_handler(svq_kick, NULL);
|
event_notifier_set_handler(svq_kick, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event_notifier_init_fd(svq_kick, svq_kick_fd);
|
||||||
/*
|
/*
|
||||||
* event_notifier_set_handler already checks for guest's notifications if
|
* event_notifier_set_handler already checks for guest's notifications if
|
||||||
* they arrive at the new file descriptor in the switch, so there is no
|
* they arrive at the new file descriptor in the switch, so there is no
|
||||||
* need to explicitly check for them.
|
* need to explicitly check for them.
|
||||||
*/
|
*/
|
||||||
if (poll_start) {
|
if (poll_start) {
|
||||||
event_notifier_init_fd(svq_kick, svq_kick_fd);
|
|
||||||
event_notifier_set(svq_kick);
|
event_notifier_set(svq_kick);
|
||||||
event_notifier_set_handler(svq_kick, vhost_handle_guest_kick_notifier);
|
event_notifier_set_handler(svq_kick, vhost_handle_guest_kick_notifier);
|
||||||
}
|
}
|
||||||
@ -655,7 +655,7 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev,
|
|||||||
*/
|
*/
|
||||||
void vhost_svq_stop(VhostShadowVirtqueue *svq)
|
void vhost_svq_stop(VhostShadowVirtqueue *svq)
|
||||||
{
|
{
|
||||||
event_notifier_set_handler(&svq->svq_kick, NULL);
|
vhost_svq_set_svq_kick_fd(svq, VHOST_FILE_UNBIND);
|
||||||
g_autofree VirtQueueElement *next_avail_elem = NULL;
|
g_autofree VirtQueueElement *next_avail_elem = NULL;
|
||||||
|
|
||||||
if (!svq->vq) {
|
if (!svq->vq) {
|
||||||
|
Loading…
Reference in New Issue
Block a user