All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Lutomirski <luto@kernel.org>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Cornelia Huck <cornelia.huck@de.ibm.com>,
	Joerg Roedel <jroedel@suse.de>, KVM <kvm@vger.kernel.org>,
	linux-s390 <linux-s390@vger.kernel.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Sebastian Ott <sebott@linux.vnet.ibm.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Christoph Hellwig <hch@lst.de>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	David Vrabel <david.vrabel@citrix.com>,
	Andy Lutomirski <luto@kernel.org>,
	xen-devel@lists.xenproject.org, sparclinux@vger.kernel.org,
	Paolo Bonzini <pbonzini@redhat.com>,
	Linux Virtualization <virtualization@lists.linux-foundation.org>,
	David Woodhouse <dwmw2@infradead.org>,
	"David S. Miller" <davem@davemloft.net>,
	Martin Schwidefsky <schwidefsky@de.ibm.com>
Subject: [PATCH v7 7/9] virtio_mmio: Use the DMA API if enabled
Date: Tue,  2 Feb 2016 21:46:38 -0800	[thread overview]
Message-ID: <a5dcce6d76c55c528dfc0d51482daa255e9317d5.1454477782.git.luto__29992.9260895171$1454478508$gmane$org@kernel.org> (raw)
In-Reply-To: <cover.1454477782.git.luto@kernel.org>
In-Reply-To: <cover.1454477782.git.luto@kernel.org>

This switches to vring_create_virtqueue, simplifying the driver and
adding DMA API support.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
---
 drivers/virtio/virtio_mmio.c | 67 ++++++++++----------------------------------
 1 file changed, 15 insertions(+), 52 deletions(-)

diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
index 745c6ee1bb3e..48bfea91dbca 100644
--- a/drivers/virtio/virtio_mmio.c
+++ b/drivers/virtio/virtio_mmio.c
@@ -99,12 +99,6 @@ struct virtio_mmio_vq_info {
 	/* the actual virtqueue */
 	struct virtqueue *vq;
 
-	/* the number of entries in the queue */
-	unsigned int num;
-
-	/* the virtual address of the ring queue */
-	void *queue;
-
 	/* the list node for the virtqueues list */
 	struct list_head node;
 };
@@ -322,15 +316,13 @@ 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 long flags;
 	unsigned int index = vq->index;
 
 	spin_lock_irqsave(&vm_dev->lock, flags);
 	list_del(&info->node);
 	spin_unlock_irqrestore(&vm_dev->lock, flags);
 
-	vring_del_virtqueue(vq);
-
 	/* Select and deactivate the queue */
 	writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL);
 	if (vm_dev->version == 1) {
@@ -340,8 +332,8 @@ static void vm_del_vq(struct virtqueue *vq)
 		WARN_ON(readl(vm_dev->base + VIRTIO_MMIO_QUEUE_READY));
 	}
 
-	size = PAGE_ALIGN(vring_size(info->num, VIRTIO_MMIO_VRING_ALIGN));
-	free_pages_exact(info->queue, size);
+	vring_del_virtqueue(vq);
+
 	kfree(info);
 }
 
@@ -356,8 +348,6 @@ static void vm_del_vqs(struct virtio_device *vdev)
 	free_irq(platform_get_irq(vm_dev->pdev, 0), vm_dev);
 }
 
-
-
 static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned index,
 				  void (*callback)(struct virtqueue *vq),
 				  const char *name)
@@ -365,7 +355,8 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned index,
 	struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
 	struct virtio_mmio_vq_info *info;
 	struct virtqueue *vq;
-	unsigned long flags, size;
+	unsigned long flags;
+	unsigned int num;
 	int err;
 
 	if (!name)
@@ -388,66 +379,40 @@ static struct virtqueue *vm_setup_vq(struct virtio_device *vdev, unsigned index,
 		goto error_kmalloc;
 	}
 
-	/* Allocate pages for the queue - start with a queue as big as
-	 * possible (limited by maximum size allowed by device), drop down
-	 * to a minimal size, just big enough to fit descriptor table
-	 * and two rings (which makes it "alignment_size * 2")
-	 */
-	info->num = readl(vm_dev->base + VIRTIO_MMIO_QUEUE_NUM_MAX);
-
-	/* If the device reports a 0 entry queue, we won't be able to
-	 * use it to perform I/O, and vring_new_virtqueue() can't create
-	 * empty queues anyway, so don't bother to set up the device.
-	 */
-	if (info->num == 0) {
+	num = readl(vm_dev->base + VIRTIO_MMIO_QUEUE_NUM_MAX);
+	if (num == 0) {
 		err = -ENOENT;
-		goto error_alloc_pages;
-	}
-
-	while (1) {
-		size = PAGE_ALIGN(vring_size(info->num,
-				VIRTIO_MMIO_VRING_ALIGN));
-		/* Did the last iter shrink the queue below minimum size? */
-		if (size < VIRTIO_MMIO_VRING_ALIGN * 2) {
-			err = -ENOMEM;
-			goto error_alloc_pages;
-		}
-
-		info->queue = alloc_pages_exact(size, GFP_KERNEL | __GFP_ZERO);
-		if (info->queue)
-			break;
-
-		info->num /= 2;
+		goto error_new_virtqueue;
 	}
 
 	/* Create the vring */
-	vq = vring_new_virtqueue(index, info->num, VIRTIO_MMIO_VRING_ALIGN, vdev,
-				 true, info->queue, vm_notify, callback, name);
+	vq = vring_create_virtqueue(index, num, VIRTIO_MMIO_VRING_ALIGN, vdev,
+				 true, true, vm_notify, callback, name);
 	if (!vq) {
 		err = -ENOMEM;
 		goto error_new_virtqueue;
 	}
 
 	/* Activate the queue */
-	writel(info->num, vm_dev->base + VIRTIO_MMIO_QUEUE_NUM);
+	writel(virtqueue_get_vring_size(vq), vm_dev->base + VIRTIO_MMIO_QUEUE_NUM);
 	if (vm_dev->version == 1) {
 		writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_QUEUE_ALIGN);
-		writel(virt_to_phys(info->queue) >> PAGE_SHIFT,
+		writel(virtqueue_get_desc_addr(vq) >> PAGE_SHIFT,
 				vm_dev->base + VIRTIO_MMIO_QUEUE_PFN);
 	} else {
 		u64 addr;
 
-		addr = virt_to_phys(info->queue);
+		addr = virtqueue_get_desc_addr(vq);
 		writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_DESC_LOW);
 		writel((u32)(addr >> 32),
 				vm_dev->base + VIRTIO_MMIO_QUEUE_DESC_HIGH);
 
-		addr = virt_to_phys(virtqueue_get_avail(vq));
+		addr = virtqueue_get_avail_addr(vq);
 		writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_AVAIL_LOW);
 		writel((u32)(addr >> 32),
 				vm_dev->base + VIRTIO_MMIO_QUEUE_AVAIL_HIGH);
 
-		addr = virt_to_phys(virtqueue_get_used(vq));
+		addr = virtqueue_get_used_addr(vq);
 		writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_USED_LOW);
 		writel((u32)(addr >> 32),
 				vm_dev->base + VIRTIO_MMIO_QUEUE_USED_HIGH);
@@ -471,8 +436,6 @@ error_new_virtqueue:
 		writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_READY);
 		WARN_ON(readl(vm_dev->base + VIRTIO_MMIO_QUEUE_READY));
 	}
-	free_pages_exact(info->queue, size);
-error_alloc_pages:
 	kfree(info);
 error_kmalloc:
 error_available:
-- 
2.5.0

  parent reply	other threads:[~2016-02-03  5:46 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-03  5:46 [PATCH v7 0/9] virtio DMA API, yet again Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 1/9] dma: Provide simple noop dma ops Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 2/9] alpha/dma: use common " Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 3/9] s390/dma: Allow per device " Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 4/9] vring: Introduce vring_use_dma_api() Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 5/9] virtio_ring: Support DMA APIs Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03 13:52   ` Michael S. Tsirkin
2016-02-03 13:52   ` Michael S. Tsirkin
2016-02-03 13:52     ` Michael S. Tsirkin
2016-02-03 13:52     ` Michael S. Tsirkin
2016-02-03 17:53     ` Andy Lutomirski
2016-02-03 17:53     ` Andy Lutomirski
2016-02-03 17:53     ` Andy Lutomirski
2016-02-03 17:53       ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 6/9] virtio: Add improved queue allocation API Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski [this message]
2016-02-03  5:46 ` [PATCH v7 7/9] virtio_mmio: Use the DMA API if enabled Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 8/9] virtio_pci: " Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46 ` [PATCH v7 9/9] vring: Use the DMA API on Xen Andy Lutomirski
2016-02-03  5:46   ` Andy Lutomirski
2016-02-03  9:49   ` David Vrabel
2016-02-03  9:49     ` David Vrabel
2016-02-03  9:49     ` David Vrabel
2016-02-04 17:49     ` Andy Lutomirski
2016-02-04 17:49     ` Andy Lutomirski
2016-02-04 17:49       ` Andy Lutomirski
2016-02-04 17:49       ` Andy Lutomirski
2016-02-03  9:49   ` David Vrabel
2016-02-03  9:49   ` David Vrabel
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03  5:46 ` Andy Lutomirski
2016-02-03 17:52 ` [PATCH v7 0/9] virtio DMA API, yet again Stefano Stabellini
2016-02-03 17:52 ` Stefano Stabellini
2016-02-03 17:52   ` Stefano Stabellini
2016-02-03 17:52   ` Stefano Stabellini
2016-02-03 17:52 ` Stefano Stabellini
2016-02-17  5:48 ` Andy Lutomirski
2016-02-17  5:48   ` Andy Lutomirski
2016-02-17  9:29   ` Michael S. Tsirkin
2016-02-17  9:29   ` Michael S. Tsirkin
2016-02-17  9:29     ` Michael S. Tsirkin
2016-02-17  9:29     ` Michael S. Tsirkin
2016-02-17  9:42     ` David Woodhouse
2016-02-17  9:42     ` David Woodhouse
2016-02-17  9:42     ` David Woodhouse
2016-02-17  5:48 ` Andy Lutomirski
2016-02-17  5:48 ` Andy Lutomirski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='a5dcce6d76c55c528dfc0d51482daa255e9317d5.1454477782.git.luto__29992.9260895171$1454478508$gmane$org@kernel.org' \
    --to=luto@kernel.org \
    --cc=benh@kernel.crashing.org \
    --cc=borntraeger@de.ibm.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=davem@davemloft.net \
    --cc=david.vrabel@citrix.com \
    --cc=dwmw2@infradead.org \
    --cc=hch@lst.de \
    --cc=jroedel@suse.de \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=schwidefsky@de.ibm.com \
    --cc=sebott@linux.vnet.ibm.com \
    --cc=sparclinux@vger.kernel.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.