Skip to content
  • Philippe Mathieu-Daudé's avatar
    15a730e7
    block/nvme: Fix VFIO_MAP_DMA failed: No space left on device · 15a730e7
    Philippe Mathieu-Daudé authored
    
    
    When the NVMe block driver was introduced (see commit bdd6a90a,
    January 2018), Linux VFIO_IOMMU_MAP_DMA ioctl was only returning
    -ENOMEM in case of error. The driver was correctly handling the
    error path to recycle its volatile IOVA mappings.
    
    To fix CVE-2019-3882, Linux commit 492855939bdb ("vfio/type1: Limit
    DMA mappings per container", April 2019) added the -ENOSPC error to
    signal the user exhausted the DMA mappings available for a container.
    
    The block driver started to mis-behave:
    
      qemu-system-x86_64: VFIO_MAP_DMA failed: No space left on device
      (qemu)
      (qemu) info status
      VM status: paused (io-error)
      (qemu) c
      VFIO_MAP_DMA failed: No space left on device
      (qemu) c
      VFIO_MAP_DMA failed: No space left on device
    
    (The VM is not resumable from here, hence stuck.)
    
    Fix by handling the new -ENOSPC error (when DMA mappings are
    exhausted) without any distinction to the current -ENOMEM error,
    so we don't change the behavior on old kernels where the CVE-2019-3882
    fix is not present.
    
    An easy way to reproduce this bug is to restrict the DMA mapping
    limit (65535 by default) when loading the VFIO IOMMU module:
    
      # modprobe vfio_iommu_type1 dma_entry_limit=666
    
    Cc: qemu-stable@nongnu.org
    Cc: Fam Zheng <fam@euphon.net>
    Cc: Maxim Levitsky <mlevitsk@redhat.com>
    Cc: Alex Williamson <alex.williamson@redhat.com>
    Reported-by: default avatarMichal Prívozník <mprivozn@redhat.com>
    Signed-off-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
    Message-id: 20210723195843.1032825-1-philmd@redhat.com
    Fixes: bdd6a90a ("block: Add VFIO based NVMe driver")
    Buglink: https://bugs.launchpad.net/qemu/+bug/1863333
    Resolves: https://gitlab.com/qemu-project/qemu/-/issues/65
    
    
    Signed-off-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    15a730e7
    block/nvme: Fix VFIO_MAP_DMA failed: No space left on device
    Philippe Mathieu-Daudé authored
    
    
    When the NVMe block driver was introduced (see commit bdd6a90a,
    January 2018), Linux VFIO_IOMMU_MAP_DMA ioctl was only returning
    -ENOMEM in case of error. The driver was correctly handling the
    error path to recycle its volatile IOVA mappings.
    
    To fix CVE-2019-3882, Linux commit 492855939bdb ("vfio/type1: Limit
    DMA mappings per container", April 2019) added the -ENOSPC error to
    signal the user exhausted the DMA mappings available for a container.
    
    The block driver started to mis-behave:
    
      qemu-system-x86_64: VFIO_MAP_DMA failed: No space left on device
      (qemu)
      (qemu) info status
      VM status: paused (io-error)
      (qemu) c
      VFIO_MAP_DMA failed: No space left on device
      (qemu) c
      VFIO_MAP_DMA failed: No space left on device
    
    (The VM is not resumable from here, hence stuck.)
    
    Fix by handling the new -ENOSPC error (when DMA mappings are
    exhausted) without any distinction to the current -ENOMEM error,
    so we don't change the behavior on old kernels where the CVE-2019-3882
    fix is not present.
    
    An easy way to reproduce this bug is to restrict the DMA mapping
    limit (65535 by default) when loading the VFIO IOMMU module:
    
      # modprobe vfio_iommu_type1 dma_entry_limit=666
    
    Cc: qemu-stable@nongnu.org
    Cc: Fam Zheng <fam@euphon.net>
    Cc: Maxim Levitsky <mlevitsk@redhat.com>
    Cc: Alex Williamson <alex.williamson@redhat.com>
    Reported-by: default avatarMichal Prívozník <mprivozn@redhat.com>
    Signed-off-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
    Message-id: 20210723195843.1032825-1-philmd@redhat.com
    Fixes: bdd6a90a ("block: Add VFIO based NVMe driver")
    Buglink: https://bugs.launchpad.net/qemu/+bug/1863333
    Resolves: https://gitlab.com/qemu-project/qemu/-/issues/65
    
    
    Signed-off-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Loading