65
65
#include <linux/platform_device.h>
66
66
#include <linux/pm.h>
67
67
#include <linux/slab.h>
68
- #include <linux/spinlock.h>
69
68
#include <linux/virtio.h>
70
69
#include <linux/virtio_config.h>
71
70
#include <uapi/linux/virtio_mmio.h>
@@ -88,22 +87,8 @@ struct virtio_mmio_device {
88
87
89
88
void __iomem * base ;
90
89
unsigned long version ;
91
-
92
- /* a list of queues so we can dispatch IRQs */
93
- spinlock_t lock ;
94
- struct list_head virtqueues ;
95
- };
96
-
97
- struct virtio_mmio_vq_info {
98
- /* the actual virtqueue */
99
- struct virtqueue * vq ;
100
-
101
- /* the list node for the virtqueues list */
102
- struct list_head node ;
103
90
};
104
91
105
-
106
-
107
92
/* Configuration interface */
108
93
109
94
static u64 vm_get_features (struct virtio_device * vdev )
@@ -300,9 +285,8 @@ static bool vm_notify_with_data(struct virtqueue *vq)
300
285
static irqreturn_t vm_interrupt (int irq , void * opaque )
301
286
{
302
287
struct virtio_mmio_device * vm_dev = opaque ;
303
- struct virtio_mmio_vq_info * info ;
288
+ struct virtqueue * vq ;
304
289
unsigned long status ;
305
- unsigned long flags ;
306
290
irqreturn_t ret = IRQ_NONE ;
307
291
308
292
/* Read and acknowledge interrupts */
@@ -315,10 +299,8 @@ static irqreturn_t vm_interrupt(int irq, void *opaque)
315
299
}
316
300
317
301
if (likely (status & VIRTIO_MMIO_INT_VRING )) {
318
- spin_lock_irqsave (& vm_dev -> lock , flags );
319
- list_for_each_entry (info , & vm_dev -> virtqueues , node )
320
- ret |= vring_interrupt (irq , info -> vq );
321
- spin_unlock_irqrestore (& vm_dev -> lock , flags );
302
+ virtio_device_for_each_vq (& vm_dev -> vdev , vq )
303
+ ret |= vring_interrupt (irq , vq );
322
304
}
323
305
324
306
return ret ;
@@ -329,14 +311,8 @@ static irqreturn_t vm_interrupt(int irq, void *opaque)
329
311
static void vm_del_vq (struct virtqueue * vq )
330
312
{
331
313
struct virtio_mmio_device * vm_dev = to_virtio_mmio_device (vq -> vdev );
332
- struct virtio_mmio_vq_info * info = vq -> priv ;
333
- unsigned long flags ;
334
314
unsigned int index = vq -> index ;
335
315
336
- spin_lock_irqsave (& vm_dev -> lock , flags );
337
- list_del (& info -> node );
338
- spin_unlock_irqrestore (& vm_dev -> lock , flags );
339
-
340
316
/* Select and deactivate the queue */
341
317
writel (index , vm_dev -> base + VIRTIO_MMIO_QUEUE_SEL );
342
318
if (vm_dev -> version == 1 ) {
@@ -347,8 +323,6 @@ static void vm_del_vq(struct virtqueue *vq)
347
323
}
348
324
349
325
vring_del_virtqueue (vq );
350
-
351
- kfree (info );
352
326
}
353
327
354
328
static void vm_del_vqs (struct virtio_device * vdev )
@@ -375,9 +349,7 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
375
349
{
376
350
struct virtio_mmio_device * vm_dev = to_virtio_mmio_device (vdev );
377
351
bool (* notify )(struct virtqueue * vq );
378
- struct virtio_mmio_vq_info * info ;
379
352
struct virtqueue * vq ;
380
- unsigned long flags ;
381
353
unsigned int num ;
382
354
int err ;
383
355
@@ -399,13 +371,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
399
371
goto error_available ;
400
372
}
401
373
402
- /* Allocate and fill out our active queue description */
403
- info = kmalloc (sizeof (* info ), GFP_KERNEL );
404
- if (!info ) {
405
- err = - ENOMEM ;
406
- goto error_kmalloc ;
407
- }
408
-
409
374
num = readl (vm_dev -> base + VIRTIO_MMIO_QUEUE_NUM_MAX );
410
375
if (num == 0 ) {
411
376
err = - ENOENT ;
@@ -463,13 +428,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
463
428
writel (1 , vm_dev -> base + VIRTIO_MMIO_QUEUE_READY );
464
429
}
465
430
466
- vq -> priv = info ;
467
- info -> vq = vq ;
468
-
469
- spin_lock_irqsave (& vm_dev -> lock , flags );
470
- list_add (& info -> node , & vm_dev -> virtqueues );
471
- spin_unlock_irqrestore (& vm_dev -> lock , flags );
472
-
473
431
return vq ;
474
432
475
433
error_bad_pfn :
@@ -481,8 +439,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
481
439
writel (0 , vm_dev -> base + VIRTIO_MMIO_QUEUE_READY );
482
440
WARN_ON (readl (vm_dev -> base + VIRTIO_MMIO_QUEUE_READY ));
483
441
}
484
- kfree (info );
485
- error_kmalloc :
486
442
error_available :
487
443
return ERR_PTR (err );
488
444
}
@@ -627,8 +583,6 @@ static int virtio_mmio_probe(struct platform_device *pdev)
627
583
vm_dev -> vdev .dev .release = virtio_mmio_release_dev ;
628
584
vm_dev -> vdev .config = & virtio_mmio_config_ops ;
629
585
vm_dev -> pdev = pdev ;
630
- INIT_LIST_HEAD (& vm_dev -> virtqueues );
631
- spin_lock_init (& vm_dev -> lock );
632
586
633
587
vm_dev -> base = devm_platform_ioremap_resource (pdev , 0 );
634
588
if (IS_ERR (vm_dev -> base )) {
0 commit comments