mirror of
https://github.com/xemu-project/xemu.git
synced 2025-04-02 11:11:48 -04:00
virtio-net: don't touch virtqueue if vm is stopped
Guest state should not be touched if VM is stopped, unfortunately we
didn't check running state and tried to drain tx queue unconditionally
in virtio_net_set_status(). A crash was then noticed as a migration
destination when user type quit after virtqueue state is loaded but
before region cache is initialized. In this case,
virtio_net_drop_tx_queue_data() tries to access the uninitialized
region cache.
Fix this by only dropping tx queue data when vm is running.
Fixes: 283e2c2adc
("net: virtio-net discards TX data after link down")
Cc: Yuri Benditovich <yuri.benditovich@daynix.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: qemu-stable@nongnu.org
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
5e19aed59a
commit
70e53e6e4d
1 changed files with 2 additions and 1 deletions
|
@ -288,7 +288,8 @@ static void virtio_net_set_status(struct VirtIODevice *vdev, uint8_t status)
|
|||
qemu_bh_cancel(q->tx_bh);
|
||||
}
|
||||
if ((n->status & VIRTIO_NET_S_LINK_UP) == 0 &&
|
||||
(queue_status & VIRTIO_CONFIG_S_DRIVER_OK)) {
|
||||
(queue_status & VIRTIO_CONFIG_S_DRIVER_OK) &&
|
||||
vdev->vm_running) {
|
||||
/* if tx is waiting we are likely have some packets in tx queue
|
||||
* and disabled notification */
|
||||
q->tx_waiting = 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue