6565#include <linux/platform_device.h>
6666#include <linux/pm.h>
6767#include <linux/slab.h>
68- #include <linux/spinlock.h>
6968#include <linux/virtio.h>
7069#include <linux/virtio_config.h>
7170#include <uapi/linux/virtio_mmio.h>
@@ -88,22 +87,8 @@ struct virtio_mmio_device {
8887
8988 void __iomem * base ;
9089 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 ;
10390};
10491
105-
106-
10792/* Configuration interface */
10893
10994static u64 vm_get_features (struct virtio_device * vdev )
@@ -300,9 +285,8 @@ static bool vm_notify_with_data(struct virtqueue *vq)
300285static irqreturn_t vm_interrupt (int irq , void * opaque )
301286{
302287 struct virtio_mmio_device * vm_dev = opaque ;
303- struct virtio_mmio_vq_info * info ;
288+ struct virtqueue * vq ;
304289 unsigned long status ;
305- unsigned long flags ;
306290 irqreturn_t ret = IRQ_NONE ;
307291
308292 /* Read and acknowledge interrupts */
@@ -315,10 +299,8 @@ static irqreturn_t vm_interrupt(int irq, void *opaque)
315299 }
316300
317301 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 );
322304 }
323305
324306 return ret ;
@@ -329,14 +311,8 @@ static irqreturn_t vm_interrupt(int irq, void *opaque)
329311static void vm_del_vq (struct virtqueue * vq )
330312{
331313 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 ;
334314 unsigned int index = vq -> index ;
335315
336- spin_lock_irqsave (& vm_dev -> lock , flags );
337- list_del (& info -> node );
338- spin_unlock_irqrestore (& vm_dev -> lock , flags );
339-
340316 /* Select and deactivate the queue */
341317 writel (index , vm_dev -> base + VIRTIO_MMIO_QUEUE_SEL );
342318 if (vm_dev -> version == 1 ) {
@@ -347,8 +323,6 @@ static void vm_del_vq(struct virtqueue *vq)
347323 }
348324
349325 vring_del_virtqueue (vq );
350-
351- kfree (info );
352326}
353327
354328static 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
375349{
376350 struct virtio_mmio_device * vm_dev = to_virtio_mmio_device (vdev );
377351 bool (* notify )(struct virtqueue * vq );
378- struct virtio_mmio_vq_info * info ;
379352 struct virtqueue * vq ;
380- unsigned long flags ;
381353 unsigned int num ;
382354 int err ;
383355
@@ -399,13 +371,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
399371 goto error_available ;
400372 }
401373
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-
409374 num = readl (vm_dev -> base + VIRTIO_MMIO_QUEUE_NUM_MAX );
410375 if (num == 0 ) {
411376 err = - ENOENT ;
@@ -463,13 +428,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
463428 writel (1 , vm_dev -> base + VIRTIO_MMIO_QUEUE_READY );
464429 }
465430
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-
473431 return vq ;
474432
475433error_bad_pfn :
@@ -481,8 +439,6 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned int in
481439 writel (0 , vm_dev -> base + VIRTIO_MMIO_QUEUE_READY );
482440 WARN_ON (readl (vm_dev -> base + VIRTIO_MMIO_QUEUE_READY ));
483441 }
484- kfree (info );
485- error_kmalloc :
486442error_available :
487443 return ERR_PTR (err );
488444}
@@ -627,8 +583,6 @@ static int virtio_mmio_probe(struct platform_device *pdev)
627583 vm_dev -> vdev .dev .release = virtio_mmio_release_dev ;
628584 vm_dev -> vdev .config = & virtio_mmio_config_ops ;
629585 vm_dev -> pdev = pdev ;
630- INIT_LIST_HEAD (& vm_dev -> virtqueues );
631- spin_lock_init (& vm_dev -> lock );
632586
633587 vm_dev -> base = devm_platform_ioremap_resource (pdev , 0 );
634588 if (IS_ERR (vm_dev -> base )) {
0 commit comments