Commit b11ecb27 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 1c169383 99975cc6
...@@ -538,7 +538,7 @@ static int get_rx_bufs(struct vhost_virtqueue *vq, ...@@ -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) ...@@ -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) ...@@ -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); ...@@ -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 = { ...@@ -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) ...@@ -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);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment