Skip to content

Commit 900add2

Browse files
committed
Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull virtio bugfixes from Michael Tsirkin: "A couple of minor bugfixes" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: virtio_net: fix return value check in receive_mergeable() virtio_mmio: add cleanup for virtio_mmio_remove virtio_mmio: add cleanup for virtio_mmio_probe
2 parents 32abeb0 + 03e9f8a commit 900add2

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

drivers/net/virtio_net.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
756756
int num_skb_frags;
757757

758758
buf = virtqueue_get_buf_ctx(rq->vq, &len, &ctx);
759-
if (unlikely(!ctx)) {
759+
if (unlikely(!buf)) {
760760
pr_debug("%s: rx error: %d buffers out of %d missing\n",
761761
dev->name, num_buf,
762762
virtio16_to_cpu(vi->vdev,

drivers/virtio/virtio_mmio.c

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,16 @@ static const struct virtio_config_ops virtio_mmio_config_ops = {
493493
};
494494

495495

496-
static void virtio_mmio_release_dev_empty(struct device *_d) {}
496+
static void virtio_mmio_release_dev(struct device *_d)
497+
{
498+
struct virtio_device *vdev =
499+
container_of(_d, struct virtio_device, dev);
500+
struct virtio_mmio_device *vm_dev =
501+
container_of(vdev, struct virtio_mmio_device, vdev);
502+
struct platform_device *pdev = vm_dev->pdev;
503+
504+
devm_kfree(&pdev->dev, vm_dev);
505+
}
497506

498507
/* Platform device */
499508

@@ -513,33 +522,39 @@ static int virtio_mmio_probe(struct platform_device *pdev)
513522
return -EBUSY;
514523

515524
vm_dev = devm_kzalloc(&pdev->dev, sizeof(*vm_dev), GFP_KERNEL);
516-
if (!vm_dev)
517-
return -ENOMEM;
525+
if (!vm_dev) {
526+
rc = -ENOMEM;
527+
goto free_mem;
528+
}
518529

519530
vm_dev->vdev.dev.parent = &pdev->dev;
520-
vm_dev->vdev.dev.release = virtio_mmio_release_dev_empty;
531+
vm_dev->vdev.dev.release = virtio_mmio_release_dev;
521532
vm_dev->vdev.config = &virtio_mmio_config_ops;
522533
vm_dev->pdev = pdev;
523534
INIT_LIST_HEAD(&vm_dev->virtqueues);
524535
spin_lock_init(&vm_dev->lock);
525536

526537
vm_dev->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
527-
if (vm_dev->base == NULL)
528-
return -EFAULT;
538+
if (vm_dev->base == NULL) {
539+
rc = -EFAULT;
540+
goto free_vmdev;
541+
}
529542

530543
/* Check magic value */
531544
magic = readl(vm_dev->base + VIRTIO_MMIO_MAGIC_VALUE);
532545
if (magic != ('v' | 'i' << 8 | 'r' << 16 | 't' << 24)) {
533546
dev_warn(&pdev->dev, "Wrong magic value 0x%08lx!\n", magic);
534-
return -ENODEV;
547+
rc = -ENODEV;
548+
goto unmap;
535549
}
536550

537551
/* Check device version */
538552
vm_dev->version = readl(vm_dev->base + VIRTIO_MMIO_VERSION);
539553
if (vm_dev->version < 1 || vm_dev->version > 2) {
540554
dev_err(&pdev->dev, "Version %ld not supported!\n",
541555
vm_dev->version);
542-
return -ENXIO;
556+
rc = -ENXIO;
557+
goto unmap;
543558
}
544559

545560
vm_dev->vdev.id.device = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_ID);
@@ -548,7 +563,8 @@ static int virtio_mmio_probe(struct platform_device *pdev)
548563
* virtio-mmio device with an ID 0 is a (dummy) placeholder
549564
* with no function. End probing now with no error reported.
550565
*/
551-
return -ENODEV;
566+
rc = -ENODEV;
567+
goto unmap;
552568
}
553569
vm_dev->vdev.id.vendor = readl(vm_dev->base + VIRTIO_MMIO_VENDOR_ID);
554570

@@ -573,13 +589,34 @@ static int virtio_mmio_probe(struct platform_device *pdev)
573589

574590
platform_set_drvdata(pdev, vm_dev);
575591

576-
return register_virtio_device(&vm_dev->vdev);
592+
rc = register_virtio_device(&vm_dev->vdev);
593+
if (rc) {
594+
iounmap(vm_dev->base);
595+
devm_release_mem_region(&pdev->dev, mem->start,
596+
resource_size(mem));
597+
put_device(&vm_dev->vdev.dev);
598+
}
599+
return rc;
600+
unmap:
601+
iounmap(vm_dev->base);
602+
free_mem:
603+
devm_release_mem_region(&pdev->dev, mem->start,
604+
resource_size(mem));
605+
free_vmdev:
606+
devm_kfree(&pdev->dev, vm_dev);
607+
return rc;
577608
}
578609

579610
static int virtio_mmio_remove(struct platform_device *pdev)
580611
{
581612
struct virtio_mmio_device *vm_dev = platform_get_drvdata(pdev);
613+
struct resource *mem;
582614

615+
iounmap(vm_dev->base);
616+
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
617+
if (mem)
618+
devm_release_mem_region(&pdev->dev, mem->start,
619+
resource_size(mem));
583620
unregister_virtio_device(&vm_dev->vdev);
584621

585622
return 0;

0 commit comments

Comments
 (0)