]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/virtio_ccw: Fix dma_parm pointer not set up
authorHalil Pasic <pasic@linux.ibm.com>
Mon, 7 Oct 2024 20:10:30 +0000 (22:10 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Thu, 10 Oct 2024 13:32:43 +0000 (15:32 +0200)
At least since commit 334304ac2bac ("dma-mapping: don't return errors
from dma_set_max_seg_size") setting up device.dma_parms is basically
mandated by the DMA API. As of now Channel (CCW) I/O in general does not
utilize the DMA API, except for virtio. For virtio-ccw however the
common virtio DMA infrastructure is such that most of the DMA stuff
hinges on the virtio parent device, which is a CCW device.

So lets set up the dma_parms pointer for the CCW parent device and hope
for the best!

Fixes: 334304ac2bac ("dma-mapping: don't return errors from dma_set_max_seg_size")
Reported-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Eric Farman <farman@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Link: https://lore.kernel.org/r/20241007201030.204028-1-pasic@linux.ibm.com
Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
drivers/s390/virtio/virtio_ccw.c

index 62eca9419ad76ea30029d8a69518632557438c6f..21fa7ac849e5c372e99f1d98092c8538c061527b 100644 (file)
@@ -58,6 +58,8 @@ struct virtio_ccw_device {
        struct virtio_device vdev;
        __u8 config[VIRTIO_CCW_CONFIG_SIZE];
        struct ccw_device *cdev;
+       /* we make cdev->dev.dma_parms point to this */
+       struct device_dma_parameters dma_parms;
        __u32 curr_io;
        int err;
        unsigned int revision; /* Transport revision */
@@ -1303,6 +1305,7 @@ static int virtio_ccw_offline(struct ccw_device *cdev)
        unregister_virtio_device(&vcdev->vdev);
        spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
        dev_set_drvdata(&cdev->dev, NULL);
+       cdev->dev.dma_parms = NULL;
        spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
        return 0;
 }
@@ -1366,6 +1369,7 @@ static int virtio_ccw_online(struct ccw_device *cdev)
        }
        vcdev->vdev.dev.parent = &cdev->dev;
        vcdev->cdev = cdev;
+       cdev->dev.dma_parms = &vcdev->dma_parms;
        vcdev->dma_area = ccw_device_dma_zalloc(vcdev->cdev,
                                                sizeof(*vcdev->dma_area),
                                                &vcdev->dma_area_addr);