Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4d53ced authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus:
  virtio: fix net driver loop case where we fail to restart
  module: fix and elaborate comments
  virtio: fix module/device unloading
  lguest: Fix uninitialized members in example launcher
parents 9bb9f222 8329d98e
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -1040,6 +1040,11 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
		/ getpagesize();
	p = get_pages(pages);

	/* Initialize the virtqueue */
	vq->next = NULL;
	vq->last_avail_idx = 0;
	vq->dev = dev;

	/* Initialize the configuration. */
	vq->config.num = num_descs;
	vq->config.irq = devices.next_irq++;
@@ -1057,9 +1062,6 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
	for (i = &dev->vq; *i; i = &(*i)->next);
	*i = vq;

	/* Link virtqueue back to device. */
	vq->dev = dev;

	/* Set the routine to call when the Guest does something to this
	 * virtqueue. */
	vq->handle_output = handle_output;
@@ -1093,6 +1095,7 @@ static struct device *new_device(const char *name, u16 type, int fd,
	dev->desc = new_dev_desc(type);
	dev->handle_input = handle_input;
	dev->name = name;
	dev->vq = NULL;
	return dev;
}

+7 −3
Original line number Diff line number Diff line
@@ -223,7 +223,7 @@ static int virtblk_probe(struct virtio_device *vdev)
	err = virtio_config_val(vdev, VIRTIO_CONFIG_BLK_F_CAPACITY, &cap);
	if (err) {
		dev_err(&vdev->dev, "Bad/missing capacity in config\n");
		goto out_put_disk;
		goto out_cleanup_queue;
	}

	/* If capacity is too big, truncate with warning. */
@@ -239,7 +239,7 @@ static int virtblk_probe(struct virtio_device *vdev)
		blk_queue_max_segment_size(vblk->disk->queue, v);
	else if (err != -ENOENT) {
		dev_err(&vdev->dev, "Bad SIZE_MAX in config\n");
		goto out_put_disk;
		goto out_cleanup_queue;
	}

	err = virtio_config_val(vdev, VIRTIO_CONFIG_BLK_F_SEG_MAX, &v);
@@ -247,12 +247,14 @@ static int virtblk_probe(struct virtio_device *vdev)
		blk_queue_max_hw_segments(vblk->disk->queue, v);
	else if (err != -ENOENT) {
		dev_err(&vdev->dev, "Bad SEG_MAX in config\n");
		goto out_put_disk;
		goto out_cleanup_queue;
	}

	add_disk(vblk->disk);
	return 0;

out_cleanup_queue:
	blk_cleanup_queue(vblk->disk->queue);
out_put_disk:
	put_disk(vblk->disk);
out_unregister_blkdev:
@@ -277,6 +279,8 @@ static void virtblk_remove(struct virtio_device *vdev)
	put_disk(vblk->disk);
	unregister_blkdev(major, "virtblk");
	mempool_destroy(vblk->pool);
	/* There should be nothing in the queue now, so no need to shutdown */
	vdev->config->del_vq(vblk->vq);
	kfree(vblk);
}

+2 −0
Original line number Diff line number Diff line
@@ -247,6 +247,8 @@ static void lg_del_vq(struct virtqueue *vq)
{
	struct lguest_vq_info *lvq = vq->priv;

	/* Release the interrupt */
	free_irq(lvq->config.irq, vq);
	/* Tell virtio_ring.c to free the virtqueue. */
	vring_del_virtqueue(vq);
	/* Unmap the pages containing the ring. */
+8 −4
Original line number Diff line number Diff line
@@ -198,8 +198,8 @@ again:
	if (vi->num < vi->max / 2)
		try_fill_recv(vi);

	/* All done? */
	if (!skb) {
	/* Out of packets? */
	if (received < budget) {
		netif_rx_complete(vi->dev, napi);
		if (unlikely(!vi->rvq->vq_ops->restart(vi->rvq))
		    && netif_rx_reschedule(vi->dev, napi))
@@ -404,8 +404,12 @@ free:

static void virtnet_remove(struct virtio_device *vdev)
{
	unregister_netdev(vdev->priv);
	free_netdev(vdev->priv);
	struct virtnet_info *vi = vdev->priv;

	vdev->config->del_vq(vi->svq);
	vdev->config->del_vq(vi->rvq);
	unregister_netdev(vi->dev);
	free_netdev(vi->dev);
}

static struct virtio_device_id id_table[] = {
+13 −0
Original line number Diff line number Diff line
@@ -96,10 +96,23 @@ static int virtio_dev_probe(struct device *_d)
	return err;
}

static int virtio_dev_remove(struct device *_d)
{
	struct virtio_device *dev = container_of(_d,struct virtio_device,dev);
	struct virtio_driver *drv = container_of(dev->dev.driver,
						 struct virtio_driver, driver);

	dev->config->set_status(dev, dev->config->get_status(dev)
				& ~VIRTIO_CONFIG_S_DRIVER);
	drv->remove(dev);
	return 0;
}

int register_virtio_driver(struct virtio_driver *driver)
{
	driver->driver.bus = &virtio_bus;
	driver->driver.probe = virtio_dev_probe;
	driver->driver.remove = virtio_dev_remove;
	return driver_register(&driver->driver);
}
EXPORT_SYMBOL_GPL(register_virtio_driver);
Loading