]> Pileus Git - ~andy/linux/blobdiff - drivers/virtio/virtio_mmio.c
virtio: support reserved vqs
[~andy/linux] / drivers / virtio / virtio_mmio.c
index 453db0c403d807dbd0f2482f9d8dfc7c77f2f57e..5d7fee385b70f1b004218a5458f49ac6485e1fd0 100644 (file)
@@ -131,9 +131,6 @@ struct virtio_mmio_vq_info {
        /* the number of entries in the queue */
        unsigned int num;
 
-       /* the index of the queue */
-       int queue_index;
-
        /* the virtual address of the ring queue */
        void *queue;
 
@@ -225,11 +222,10 @@ static void vm_reset(struct virtio_device *vdev)
 static void vm_notify(struct virtqueue *vq)
 {
        struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev);
-       struct virtio_mmio_vq_info *info = vq->priv;
 
        /* We write the queue's selector into the notification register to
         * signal the other end */
-       writel(info->queue_index, vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY);
+       writel(virtqueue_get_queue_index(vq), vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY);
 }
 
 /* Notify all virtqueues on an interrupt. */
@@ -270,6 +266,7 @@ static void vm_del_vq(struct virtqueue *vq)
        struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev);
        struct virtio_mmio_vq_info *info = vq->priv;
        unsigned long flags, size;
+       unsigned int index = virtqueue_get_queue_index(vq);
 
        spin_lock_irqsave(&vm_dev->lock, flags);
        list_del(&info->node);
@@ -278,7 +275,7 @@ static void vm_del_vq(struct virtqueue *vq)
        vring_del_virtqueue(vq);
 
        /* Select and deactivate the queue */
-       writel(info->queue_index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL);
+       writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL);
        writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_PFN);
 
        size = PAGE_ALIGN(vring_size(info->num, VIRTIO_MMIO_VRING_ALIGN));
@@ -309,6 +306,9 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned index,
        unsigned long flags, size;
        int err;
 
+       if (!name)
+               return NULL;
+
        /* Select the queue we're interested in */
        writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL);
 
@@ -324,7 +324,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned index,
                err = -ENOMEM;
                goto error_kmalloc;
        }
-       info->queue_index = index;
 
        /* Allocate pages for the queue - start with a queue as big as
         * possible (limited by maximum size allowed by device), drop down
@@ -356,7 +355,7 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned index,
                        vm_dev->base + VIRTIO_MMIO_QUEUE_PFN);
 
        /* Create the vring */
-       vq = vring_new_virtqueue(info->num, VIRTIO_MMIO_VRING_ALIGN, vdev,
+       vq = vring_new_virtqueue(index, info->num, VIRTIO_MMIO_VRING_ALIGN, vdev,
                                 true, info->queue, vm_notify, callback, name);
        if (!vq) {
                err = -ENOMEM;