lkml.org 
[lkml]   [2021]   [Dec]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 022/177] virtio_ring: Fix querying of maximum DMA mapping size for virtio device
    Date
    From: Will Deacon <will@kernel.org>

    commit 817fc978b5a29b039db0418a91072b31c9aab152 upstream.

    virtio_max_dma_size() returns the maximum DMA mapping size of the virtio
    device by querying dma_max_mapping_size() for the device when the DMA
    API is in use for the vring. Unfortunately, the device passed is
    initialised by register_virtio_device() and does not inherit the DMA
    configuration from its parent, resulting in SWIOTLB errors when bouncing
    is enabled and the default 256K mapping limit (IO_TLB_SEGSIZE) is not
    respected:

    | virtio-pci 0000:00:01.0: swiotlb buffer is full (sz: 294912 bytes), total 1024 (slots), used 725 (slots)

    Follow the pattern used elsewhere in the virtio_ring code when calling
    into the DMA layer and pass the parent device to dma_max_mapping_size()
    instead.

    Cc: Marc Zyngier <maz@kernel.org>
    Cc: Quentin Perret <qperret@google.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Signed-off-by: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20211201112018.25276-1-will@kernel.org
    Acked-by: Jason Wang <jasowang@redhat.com>
    Tested-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Fixes: e6d6dd6c875e ("virtio: Introduce virtio_max_dma_size()")
    Cc: Joerg Roedel <jroedel@suse.de>
    Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Robin Murphy <robin.murphy@arm.com>
    Signed-off-by: Steven Price <steven.price@arm.com>
    Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/virtio/virtio_ring.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/drivers/virtio/virtio_ring.c
    +++ b/drivers/virtio/virtio_ring.c
    @@ -268,7 +268,7 @@ size_t virtio_max_dma_size(struct virtio
    size_t max_segment_size = SIZE_MAX;

    if (vring_use_dma_api(vdev))
    - max_segment_size = dma_max_mapping_size(&vdev->dev);
    + max_segment_size = dma_max_mapping_size(vdev->dev.parent);

    return max_segment_size;
    }

    \
     
     \ /
      Last update: 2021-12-20 16:06    [W:4.020 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site