diff options
Diffstat (limited to 'drivers/lguest/lguest_device.c')
-rw-r--r-- | drivers/lguest/lguest_device.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/lguest/lguest_device.c b/drivers/lguest/lguest_device.c index 595d73197016..9e8388efd88e 100644 --- a/drivers/lguest/lguest_device.c +++ b/drivers/lguest/lguest_device.c | |||
@@ -241,7 +241,7 @@ static void lg_notify(struct virtqueue *vq) | |||
241 | } | 241 | } |
242 | 242 | ||
243 | /* An extern declaration inside a C file is bad form. Don't do it. */ | 243 | /* An extern declaration inside a C file is bad form. Don't do it. */ |
244 | extern void lguest_setup_irq(unsigned int irq); | 244 | extern int lguest_setup_irq(unsigned int irq); |
245 | 245 | ||
246 | /* | 246 | /* |
247 | * This routine finds the Nth virtqueue described in the configuration of | 247 | * 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, | |||
292 | 292 | ||
293 | /* | 293 | /* |
294 | * OK, tell virtio_ring.c to set up a virtqueue now we know its size | 294 | * OK, tell virtio_ring.c to set up a virtqueue now we know its size |
295 | * and we've got a pointer to its pages. | 295 | * and we've got a pointer to its pages. Note that we set weak_barriers |
296 | * to 'true': the host just a(nother) SMP CPU, so we only need inter-cpu | ||
297 | * barriers. | ||
296 | */ | 298 | */ |
297 | vq = vring_new_virtqueue(lvq->config.num, LGUEST_VRING_ALIGN, | 299 | vq = vring_new_virtqueue(lvq->config.num, LGUEST_VRING_ALIGN, vdev, |
298 | vdev, lvq->pages, lg_notify, callback, name); | 300 | true, lvq->pages, lg_notify, callback, name); |
299 | if (!vq) { | 301 | if (!vq) { |
300 | err = -ENOMEM; | 302 | err = -ENOMEM; |
301 | goto unmap; | 303 | goto unmap; |
302 | } | 304 | } |
303 | 305 | ||
304 | /* Make sure the interrupt is allocated. */ | 306 | /* Make sure the interrupt is allocated. */ |
305 | lguest_setup_irq(lvq->config.irq); | 307 | err = lguest_setup_irq(lvq->config.irq); |
308 | if (err) | ||
309 | goto destroy_vring; | ||
306 | 310 | ||
307 | /* | 311 | /* |
308 | * Tell the interrupt for this virtqueue to go to the virtio_ring | 312 | * 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, | |||
315 | err = request_irq(lvq->config.irq, vring_interrupt, IRQF_SHARED, | 319 | err = request_irq(lvq->config.irq, vring_interrupt, IRQF_SHARED, |
316 | dev_name(&vdev->dev), vq); | 320 | dev_name(&vdev->dev), vq); |
317 | if (err) | 321 | if (err) |
318 | goto destroy_vring; | 322 | goto free_desc; |
319 | 323 | ||
320 | /* | 324 | /* |
321 | * Last of all we hook up our 'struct lguest_vq_info" to the | 325 | * 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, | |||
324 | vq->priv = lvq; | 328 | vq->priv = lvq; |
325 | return vq; | 329 | return vq; |
326 | 330 | ||
331 | free_desc: | ||
332 | irq_free_desc(lvq->config.irq); | ||
327 | destroy_vring: | 333 | destroy_vring: |
328 | vring_del_virtqueue(vq); | 334 | vring_del_virtqueue(vq); |
329 | unmap: | 335 | unmap: |