Patch "virtio_mmio: Set DMA masks appropriately" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
virtio_mmio: Set DMA masks appropriately
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
virtio_mmio-set-dma-masks-appropriately.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f7f6634d23830ff74335734fbdb28ea109c1f349Mon Sep 17 00:00:00 2001
From: Robin Murphy <[email protected]>
Date: Tue, 10 Jan 2017 17:51:17 +0000
Subject: virtio_mmio: Set DMA masks appropriately
From: Robin Murphy <[email protected]>
commit f7f6634d23830ff74335734fbdb28ea109c1f349 upstream.
Once DMA API usage is enabled, it becomes apparent that virtio-mmio is inadvertently relying on the default 32-bit DMA mask, which leads to problems like rapidly exhausting SWIOTLB bounce buffers.
Ensure that we set the appropriate 64-bit DMA mask whenever possible, with the coherent mask suitably limited for the legacy vring as per a0be1db4304f ("virtio_pci: Limit DMA mask to 44 bits for legacy virtio devices").
--- drivers/virtio/virtio_mmio.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
drivers/virtio/virtio_mmio.c +19 -1
@@ -59,6 +59,7 @@#define pr_fmt (fmt) "virtio-mmio: " fmt#include <linux/acpi.h> +#include <linux/dma-mapping.h> #include <linux/highmem.h> #include <linux/interrupt.h> #include <linux/io.h>
@@ -497,6 +498,7 @@ static int virtio_mmio_probe(struct platstruct virtio_mmio_device *vm_dev;struct resource *mem;unsigned long magic; +int rc; mem =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (!mem)
@@ -545,9 +547,25 @@ static int virtio_mmio_probe(struct plat } vm_dev->vdev.id.vendor =readl (vm_dev->base +VIRTIO_MMIO_VENDOR_ID ); -if (vm_dev->version ==1 ) +if (vm_dev->version ==1 ) {writel (PAGE_SIZE , vm_dev->base +VIRTIO_MMIO_GUEST_PAGE_SIZE ); + rc =dma_set_mask (&pdev->dev,DMA_BIT_MASK (64 )); +/* +* In the legacy case, ensure our coherently-allocated virtio +* ring will be at an address expressable as a 32-bit PFN. +*/ +if (!rc) +dma_set_coherent_mask (&pdev->dev, +DMA_BIT_MASK (32 +PAGE_SHIFT )); + }else { + rc =dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (64 )); + } +if (rc) + rc =dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (32 )); +if (rc) +dev_warn (&pdev->dev,"Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might not work.\n" ); +platform_set_drvdata (pdev, vm_dev);return register_virtio_device (&vm_dev->vdev);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/virtio_mmio-set-dma-masks-appropriately.patch