Skip to content
Snippets Groups Projects
  1. Mar 07, 2022
    • Hanna Reitz's avatar
      ide: Increment BB in-flight counter for TRIM BH · 7e5cdb34
      Hanna Reitz authored
      When we still have an AIOCB registered for DMA operations, we try to
      settle the respective operation by draining the BlockBackend associated
      with the IDE device.
      
      However, this assumes that every DMA operation is associated with an
      increment of the BlockBackend’s in-flight counter (e.g. through some
      ongoing I/O operation), so that draining the BB until its in-flight
      counter reaches 0 will settle all DMA operations.  That is not the case:
      For TRIM, the guest can issue a zero-length operation that will not
      result in any I/O operation forwarded to the BlockBackend, and also not
      increment the in-flight counter in any other way.  In such a case,
      blk_drain() will be a no-op if no other operations are in flight.
      
      It is clear that if blk_drain() is a no-op, the value of
      s->bus->dma->aiocb will not change between checking it in the `if`
      condition and asserting that it is NULL after blk_drain().
      
      The particular problem is that ide_issue_trim() creates a BH
      (ide_trim_bh_cb()) to settle the TRIM request: iocb->common.cb() is
      ide_dma_cb(), which will either create a new request, or find the
      transfer to be done and call ide_set_inactive(), which clears
      s->bus->dma->aiocb.  Therefore, the blk_drain() must wait for
      ide_trim_bh_cb() to run, which currently it will not always do.
      
      To fix this issue, we increment the BlockBackend's in-flight counter
      when the TRIM operation begins (in ide_issue_trim(), when the
      ide_trim_bh_cb() BH is created) and decrement it when ide_trim_bh_cb()
      is done.
      
      Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2029980
      
      
      Suggested-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: default avatarHanna Reitz <hreitz@redhat.com>
      Message-Id: <20220120142259.120189-1-hreitz@redhat.com>
      Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
      Tested-by: default avatarJohn Snow <jsnow@redhat.com>
      7e5cdb34
  2. Mar 05, 2022
  3. Mar 04, 2022
Loading