• Alexander Lobakin's avatar
    virtio: virtio_console: fix DMA memory allocation for rproc serial · 9d516aa8
    Alexander Lobakin authored
    Since commit 086d0872 ("remoteproc: create vdev subdevice with
    specific dma memory pool"), every remoteproc has a DMA subdevice
    ("remoteprocX#vdevYbuffer") for each virtio device, which inherits
    DMA capabilities from the corresponding platform device. This allowed
    to associate different DMA pools with each vdev, and required from
    virtio drivers to perform DMA operations with the parent device
    (vdev->dev.parent) instead of grandparent (vdev->dev.parent->parent).
    
    virtio_rpmsg_bus was already changed in the same merge cycle with
    commit d999b622 ("rpmsg: virtio: allocate buffer from parent"),
    but virtio_console did not. In fact, operations using the grandparent
    worked fine while the grandparent was the platform device, but since
    commit c774ad01 ("remoteproc: Fix and restore the parenting
    hierarchy for vdev") this was changed, and now the grandparent device
    is the remoteproc device without any DMA capabilities.
    So, starting v5.8-rc1 the following warning is observed:
    
    [    2.483925] ------------[ cut here ]------------
    [    2.489148] WARNING: CPU: 3 PID: 101 at kernel/dma/mapping.c:427 0x80e7eee8
    [    2.489152] Modules linked in: virtio_console(+)
    [    2.503737]  virtio_rpmsg_bus rpmsg_core
    [    2.508903]
    [    2.528898] <Other modules, stack and call trace here>
    [    2.913043]
    [    2.914907] ---[ end trace 93ac8746beab612c ]---
    [    2.920102] virtio-ports vport1p0: Error allocating inbufs
    
    kernel/dma/mapping.c:427 is:
    
    WARN_ON_ONCE(!dev->coherent_dma_mask);
    
    obviously because the grandparent now is remoteproc dev without any
    DMA caps:
    
    [    3.104943] Parent: remoteproc0#vdev1buffer, grandparent: remoteproc0
    
    Fix this the same way as it was for virtio_rpmsg_bus, using just the
    parent device (vdev->dev.parent, "remoteprocX#vdevYbuffer") for DMA
    operations.
    This also allows now to reserve DMA pools/buffers for rproc serial
    via Device Tree.
    
    Fixes: c774ad01 ("remoteproc: Fix and restore the parenting hierarchy for vdev")
    Cc: stable@vger.kernel.org # 5.1+
    Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    Signed-off-by: default avatarAlexander Lobakin <alobakin@pm.me>
    Date: Thu, 5 Nov 2020 11:10:24 +0800
    Link: https://lore.kernel.org/r/AOKowLclCbOCKxyiJ71WeNyuAAj2q8EUtxrXbyky5E@cp7-web-042.plabs.chSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9d516aa8
virtio_console.c 54.5 KB