]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/lguest/lguest_device.c
Merge branch 'fix/acer-alc889-fix' into fix/hda
[karo-tx-linux.git] / drivers / lguest / lguest_device.c
index 595d7319701680d9360e9f252d9f0273e7de8726..9e8388efd88e2cffeb4c11fc8c432d2a5a7eb371 100644 (file)
@@ -241,7 +241,7 @@ static void lg_notify(struct virtqueue *vq)
 }
 
 /* An extern declaration inside a C file is bad form.  Don't do it. */
-extern void lguest_setup_irq(unsigned int irq);
+extern int lguest_setup_irq(unsigned int irq);
 
 /*
  * This routine finds the Nth virtqueue described in the configuration of
@@ -292,17 +292,21 @@ static struct virtqueue *lg_find_vq(struct virtio_device *vdev,
 
        /*
         * OK, tell virtio_ring.c to set up a virtqueue now we know its size
-        * and we've got a pointer to its pages.
+        * and we've got a pointer to its pages.  Note that we set weak_barriers
+        * to 'true': the host just a(nother) SMP CPU, so we only need inter-cpu
+        * barriers.
         */
-       vq = vring_new_virtqueue(lvq->config.num, LGUEST_VRING_ALIGN,
-                                vdev, lvq->pages, lg_notify, callback, name);
+       vq = vring_new_virtqueue(lvq->config.num, LGUEST_VRING_ALIGN, vdev,
+                                true, lvq->pages, lg_notify, callback, name);
        if (!vq) {
                err = -ENOMEM;
                goto unmap;
        }
 
        /* Make sure the interrupt is allocated. */
-       lguest_setup_irq(lvq->config.irq);
+       err = lguest_setup_irq(lvq->config.irq);
+       if (err)
+               goto destroy_vring;
 
        /*
         * Tell the interrupt for this virtqueue to go to the virtio_ring
@@ -315,7 +319,7 @@ static struct virtqueue *lg_find_vq(struct virtio_device *vdev,
        err = request_irq(lvq->config.irq, vring_interrupt, IRQF_SHARED,
                          dev_name(&vdev->dev), vq);
        if (err)
-               goto destroy_vring;
+               goto free_desc;
 
        /*
         * Last of all we hook up our 'struct lguest_vq_info" to the
@@ -324,6 +328,8 @@ static struct virtqueue *lg_find_vq(struct virtio_device *vdev,
        vq->priv = lvq;
        return vq;
 
+free_desc:
+       irq_free_desc(lvq->config.irq);
 destroy_vring:
        vring_del_virtqueue(vq);
 unmap: