Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2855b335 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin
Browse files

virtio_console: don't tie bufs to a vq



an allocated buffer doesn't need to be tied to a vq -
only vq->vdev is ever used. Pass the function the
just what it needs - the vdev.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent b4000032
Loading
Loading
Loading
Loading
+7 −7
Original line number Original line Diff line number Diff line
@@ -422,7 +422,7 @@ static void reclaim_dma_bufs(void)
	}
	}
}
}


static struct port_buffer *alloc_buf(struct virtqueue *vq, size_t buf_size,
static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size,
				     int pages)
				     int pages)
{
{
	struct port_buffer *buf;
	struct port_buffer *buf;
@@ -445,16 +445,16 @@ static struct port_buffer *alloc_buf(struct virtqueue *vq, size_t buf_size,
		return buf;
		return buf;
	}
	}


	if (is_rproc_serial(vq->vdev)) {
	if (is_rproc_serial(vdev)) {
		/*
		/*
		 * Allocate DMA memory from ancestor. When a virtio
		 * Allocate DMA memory from ancestor. When a virtio
		 * device is created by remoteproc, the DMA memory is
		 * device is created by remoteproc, the DMA memory is
		 * associated with the grandparent device:
		 * associated with the grandparent device:
		 * vdev => rproc => platform-dev.
		 * vdev => rproc => platform-dev.
		 */
		 */
		if (!vq->vdev->dev.parent || !vq->vdev->dev.parent->parent)
		if (!vdev->dev.parent || !vdev->dev.parent->parent)
			goto free_buf;
			goto free_buf;
		buf->dev = vq->vdev->dev.parent->parent;
		buf->dev = vdev->dev.parent->parent;


		/* Increase device refcnt to avoid freeing it */
		/* Increase device refcnt to avoid freeing it */
		get_device(buf->dev);
		get_device(buf->dev);
@@ -838,7 +838,7 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf,


	count = min((size_t)(32 * 1024), count);
	count = min((size_t)(32 * 1024), count);


	buf = alloc_buf(port->out_vq, count, 0);
	buf = alloc_buf(port->portdev->vdev, count, 0);
	if (!buf)
	if (!buf)
		return -ENOMEM;
		return -ENOMEM;


@@ -957,7 +957,7 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
	if (ret < 0)
	if (ret < 0)
		goto error_out;
		goto error_out;


	buf = alloc_buf(port->out_vq, 0, pipe->nrbufs);
	buf = alloc_buf(port->portdev->vdev, 0, pipe->nrbufs);
	if (!buf) {
	if (!buf) {
		ret = -ENOMEM;
		ret = -ENOMEM;
		goto error_out;
		goto error_out;
@@ -1374,7 +1374,7 @@ static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock)


	nr_added_bufs = 0;
	nr_added_bufs = 0;
	do {
	do {
		buf = alloc_buf(vq, PAGE_SIZE, 0);
		buf = alloc_buf(vq->vdev, PAGE_SIZE, 0);
		if (!buf)
		if (!buf)
			break;
			break;