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:
commit
b11ecb2785
4 changed files with 13 additions and 12 deletions
|
@ -538,7 +538,7 @@ static int get_rx_bufs(struct vhost_virtqueue *vq,
|
||||||
++headcount;
|
++headcount;
|
||||||
seg += in;
|
seg += in;
|
||||||
}
|
}
|
||||||
heads[headcount - 1].len = cpu_to_vhost32(vq, len - datalen);
|
heads[headcount - 1].len = cpu_to_vhost32(vq, len + datalen);
|
||||||
*iovcount = seg;
|
*iovcount = seg;
|
||||||
if (unlikely(log))
|
if (unlikely(log))
|
||||||
*log_num = nlogs;
|
*log_num = nlogs;
|
||||||
|
|
|
@ -282,6 +282,7 @@ void vp_del_vqs(struct virtio_device *vdev)
|
||||||
|
|
||||||
vp_free_vectors(vdev);
|
vp_free_vectors(vdev);
|
||||||
kfree(vp_dev->vqs);
|
kfree(vp_dev->vqs);
|
||||||
|
vp_dev->vqs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vp_try_to_find_vqs(struct virtio_device *vdev, unsigned nvqs,
|
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;
|
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
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int virtio_pci_freeze(struct device *dev)
|
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
|
* - ignore the affinity request if we're using INTX
|
||||||
*/
|
*/
|
||||||
int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
|
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,
|
int virtio_pci_legacy_probe(struct pci_dev *pci_dev,
|
||||||
const struct pci_device_id *id);
|
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,
|
.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 */
|
/* the PCI probing function */
|
||||||
int virtio_pci_legacy_probe(struct pci_dev *pci_dev,
|
int virtio_pci_legacy_probe(struct pci_dev *pci_dev,
|
||||||
const struct pci_device_id *id)
|
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_iounmap(pci_dev, vp_dev->ioaddr);
|
||||||
pci_release_regions(pci_dev);
|
pci_release_regions(pci_dev);
|
||||||
pci_disable_device(pci_dev);
|
pci_disable_device(pci_dev);
|
||||||
kfree(vp_dev);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue