Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+48 -11
+1 -1
drivers/net/virtio_net.c
··· 756 756 int num_skb_frags; 757 757 758 758 buf = virtqueue_get_buf_ctx(rq->vq, &len, &ctx); 759 - if (unlikely(!ctx)) { 759 + if (unlikely(!buf)) { 760 760 pr_debug("%s: rx error: %d buffers out of %d missing\n", 761 761 dev->name, num_buf, 762 762 virtio16_to_cpu(vi->vdev,
+47 -10
drivers/virtio/virtio_mmio.c
··· 493 493 }; 494 494 495 495 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 + } 497 506 498 507 /* Platform device */ 499 508 ··· 522 513 return -EBUSY; 523 514 524 515 vm_dev = devm_kzalloc(&pdev->dev, sizeof(*vm_dev), GFP_KERNEL); 525 - if (!vm_dev) 526 - return -ENOMEM; 516 + if (!vm_dev) { 517 + rc = -ENOMEM; 518 + goto free_mem; 519 + } 527 520 528 521 vm_dev->vdev.dev.parent = &pdev->dev; 529 - vm_dev->vdev.dev.release = virtio_mmio_release_dev_empty; 522 + vm_dev->vdev.dev.release = virtio_mmio_release_dev; 530 523 vm_dev->vdev.config = &virtio_mmio_config_ops; 531 524 vm_dev->pdev = pdev; 532 525 INIT_LIST_HEAD(&vm_dev->virtqueues); 533 526 spin_lock_init(&vm_dev->lock); 534 527 535 528 vm_dev->base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); 536 - if (vm_dev->base == NULL) 537 - return -EFAULT; 529 + if (vm_dev->base == NULL) { 530 + rc = -EFAULT; 531 + goto free_vmdev; 532 + } 538 533 539 534 /* Check magic value */ 540 535 magic = readl(vm_dev->base + VIRTIO_MMIO_MAGIC_VALUE); 541 536 if (magic != ('v' | 'i' << 8 | 'r' << 16 | 't' << 24)) { 542 537 dev_warn(&pdev->dev, "Wrong magic value 0x%08lx!\n", magic); 543 - return -ENODEV; 538 + rc = -ENODEV; 539 + goto unmap; 544 540 } 545 541 546 542 /* Check device version */ ··· 553 539 if (vm_dev->version < 1 || vm_dev->version > 2) { 554 540 dev_err(&pdev->dev, "Version %ld not supported!\n", 555 541 vm_dev->version); 556 - return -ENXIO; 542 + rc = -ENXIO; 543 + goto unmap; 557 544 } 558 545 559 546 vm_dev->vdev.id.device = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_ID); ··· 563 548 * virtio-mmio device with an ID 0 is a (dummy) placeholder 564 549 * with no function. End probing now with no error reported. 565 550 */ 566 - return -ENODEV; 551 + rc = -ENODEV; 552 + goto unmap; 567 553 } 568 554 vm_dev->vdev.id.vendor = readl(vm_dev->base + VIRTIO_MMIO_VENDOR_ID); 569 555 ··· 589 573 590 574 platform_set_drvdata(pdev, vm_dev); 591 575 592 - return register_virtio_device(&vm_dev->vdev); 576 + rc = register_virtio_device(&vm_dev->vdev); 577 + if (rc) { 578 + iounmap(vm_dev->base); 579 + devm_release_mem_region(&pdev->dev, mem->start, 580 + resource_size(mem)); 581 + put_device(&vm_dev->vdev.dev); 582 + } 583 + return rc; 584 + unmap: 585 + iounmap(vm_dev->base); 586 + free_mem: 587 + devm_release_mem_region(&pdev->dev, mem->start, 588 + resource_size(mem)); 589 + free_vmdev: 590 + devm_kfree(&pdev->dev, vm_dev); 591 + return rc; 593 592 } 594 593 595 594 static int virtio_mmio_remove(struct platform_device *pdev) 596 595 { 597 596 struct virtio_mmio_device *vm_dev = platform_get_drvdata(pdev); 597 + struct resource *mem; 598 598 599 + iounmap(vm_dev->base); 600 + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 601 + if (mem) 602 + devm_release_mem_region(&pdev->dev, mem->start, 603 + resource_size(mem)); 599 604 unregister_virtio_device(&vm_dev->vdev); 600 605 601 606 return 0;