virtio, vhost fixes for 3.19
This fixes a couple of bugs triggered by hot-unplug of virtio devices, as well as a regression in vhost-net. Cc: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUrQ7bAAoJECgfDbjSjVRptOUH/R8uZWxD2LY8cyUpGuUKkhXi SX727WQXMYd5tZH0MAiakFvL8+rGz5A/MAZFr+kT1xjgt3WAYHk9CwdvPBpd0YlD uawqr2t5t+AzGbNLmn5S7D2OD89Yzk6dOsvotgvjtlOxWTcMhZxS6ynNB6iSM4Ul K/5DCnDxgm3BYyljtdAEStQS7pft1BITtK1BBmJZ5EYR2+sOKcNAM7imYKJ0XA52 Spvkn/SIqLCaapLcDg451f3T1BupqqceaUMO0XKDDrGcLesJC1X1nXcxs4Q6zMED Zh6frLnoKrCvzInuIrW5VyLwLn72HTJZ1EtKmp/Q1IdfXXuoBhOZxS8mFnvG09E= =q55J -----END PGP SIGNATURE----- Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost pull virtio/vhost fixes from Michael Tsirkin: "This fixes a couple of bugs triggered by hot-unplug of virtio devices, as well as a regression in vhost-net" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: vhost/net: length miscalculation virtio_pci: document why we defer kfree virtio_pci: defer kfree until release callback virtio_pci: device-specific release callback virtio: make del_vqs idempotent
This commit is contained in:
Коммит
b11ecb2785
|
@ -538,7 +538,7 @@ static int get_rx_bufs(struct vhost_virtqueue *vq,
|
|||
++headcount;
|
||||
seg += in;
|
||||
}
|
||||
heads[headcount - 1].len = cpu_to_vhost32(vq, len - datalen);
|
||||
heads[headcount - 1].len = cpu_to_vhost32(vq, len + datalen);
|
||||
*iovcount = seg;
|
||||
if (unlikely(log))
|
||||
*log_num = nlogs;
|
||||
|
|
|
@ -282,6 +282,7 @@ void vp_del_vqs(struct virtio_device *vdev)
|
|||
|
||||
vp_free_vectors(vdev);
|
||||
kfree(vp_dev->vqs);
|
||||
vp_dev->vqs = NULL;
|
||||
}
|
||||
|
||||
static int vp_try_to_find_vqs(struct virtio_device *vdev, unsigned nvqs,
|
||||
|
@ -421,15 +422,6 @@ int vp_set_vq_affinity(struct virtqueue *vq, int cpu)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void virtio_pci_release_dev(struct device *_d)
|
||||
{
|
||||
/*
|
||||
* No need for a release method as we allocate/free
|
||||
* all devices together with the pci devices.
|
||||
* Provide an empty one to avoid getting a warning from core.
|
||||
*/
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int virtio_pci_freeze(struct device *dev)
|
||||
{
|
||||
|
|
|
@ -126,7 +126,6 @@ const char *vp_bus_name(struct virtio_device *vdev);
|
|||
* - ignore the affinity request if we're using INTX
|
||||
*/
|
||||
int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
|
||||
void virtio_pci_release_dev(struct device *);
|
||||
|
||||
int virtio_pci_legacy_probe(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *id);
|
||||
|
|
|
@ -211,6 +211,17 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
|
|||
.set_vq_affinity = vp_set_vq_affinity,
|
||||
};
|
||||
|
||||
static void virtio_pci_release_dev(struct device *_d)
|
||||
{
|
||||
struct virtio_device *vdev = dev_to_virtio(_d);
|
||||
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
||||
|
||||
/* As struct device is a kobject, it's not safe to
|
||||
* free the memory (including the reference counter itself)
|
||||
* until it's release callback. */
|
||||
kfree(vp_dev);
|
||||
}
|
||||
|
||||
/* the PCI probing function */
|
||||
int virtio_pci_legacy_probe(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *id)
|
||||
|
@ -302,5 +313,4 @@ void virtio_pci_legacy_remove(struct pci_dev *pci_dev)
|
|||
pci_iounmap(pci_dev, vp_dev->ioaddr);
|
||||
pci_release_regions(pci_dev);
|
||||
pci_disable_device(pci_dev);
|
||||
kfree(vp_dev);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче