diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2011-11-17 17:41:15 +0200 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2011-11-24 13:04:48 +1030 |
commit | e6af578c5305be693a1bc7f4dc7b51dd82d41425 (patch) | |
tree | 7276a130a2d2eddf84660ec2573298e26611a442 /include | |
parent | fe1a7fe2c4456679b3402f04268bdfafca7b127a (diff) | |
download | linux-e6af578c5305be693a1bc7f4dc7b51dd82d41425.tar.gz linux-e6af578c5305be693a1bc7f4dc7b51dd82d41425.tar.bz2 linux-e6af578c5305be693a1bc7f4dc7b51dd82d41425.zip |
virtio-pci: make reset operation safer
virtio pci device reset actually just does an I/O
write, which in PCI is really posted, that is it
can complete on CPU before the device has received it.
Further, interrupts might have been pending on
another CPU, so device callback might get invoked after reset.
This conflicts with how drivers use reset, which is typically:
reset
unregister
a callback running after reset completed can race with
unregister, potentially leading to use after free bugs.
Fix by flushing out the write, and flushing pending interrupts.
This assumes that device is never reset from
its vq/config callbacks, or in parallel with being
added/removed, document this assumption.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/virtio_config.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index add4790b21fe..e9e72bda1b72 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h @@ -85,6 +85,8 @@ * @reset: reset the device * vdev: the virtio device * After this, status and feature negotiation must be done again + * Device must not be reset from its vq/config callbacks, or in + * parallel with being added/removed. * @find_vqs: find virtqueues and instantiate them. * vdev: the virtio_device * nvqs: the number of virtqueues to find |