Skip to content
  • Eric Blake's avatar
    3482b9bc
    block: Pass unaligned discard requests to drivers · 3482b9bc
    Eric Blake authored
    
    
    Discard is advisory, so rounding the requests to alignment
    boundaries is never semantically wrong from the data that
    the guest sees.  But at least the Dell Equallogic iSCSI SANs
    has an interesting property that its advertised discard
    alignment is 15M, yet documents that discarding a sequence
    of 1M slices will eventually result in the 15M page being
    marked as discarded, and it is possible to observe which
    pages have been discarded.
    
    Between commits 9f1963b3 and b8d0a980, we converted the block
    layer to a byte-based interface that ultimately ignores any
    unaligned head or tail based on the driver's advertised
    discard granularity, which means that qemu 2.7 refuses to
    pass any discard request smaller than 15M down to the Dell
    Equallogic hardware.  This is a slight regression in behavior
    compared to earlier qemu, where a guest executing discards
    in power-of-2 chunks used to be able to get every page
    discarded, but is now left with various pages still allocated
    because the guest requests did not align with the hardware's
    15M pages.
    
    Since the SCSI specification says nothing about a minimum
    discard granularity, and only documents the preferred
    alignment, it is best if the block layer gives the driver
    every bit of information about discard requests, rather than
    rounding it to alignment boundaries early.
    
    Rework the block layer discard algorithm to mirror the write
    zero algorithm: always peel off any unaligned head or tail
    and manage that in isolation, then do the bulk of the request
    on an aligned boundary.  The fallback when the driver returns
    -ENOTSUP for an unaligned request is to silently ignore that
    portion of the discard request; but for devices that can pass
    the partial request all the way down to hardware, this can
    result in the hardware coalescing requests and discarding
    aligned pages after all.
    
    Reported by: Peter Lieven <pl@kamp.de>
    CC: qemu-stable@nongnu.org
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    3482b9bc
    block: Pass unaligned discard requests to drivers
    Eric Blake authored
    
    
    Discard is advisory, so rounding the requests to alignment
    boundaries is never semantically wrong from the data that
    the guest sees.  But at least the Dell Equallogic iSCSI SANs
    has an interesting property that its advertised discard
    alignment is 15M, yet documents that discarding a sequence
    of 1M slices will eventually result in the 15M page being
    marked as discarded, and it is possible to observe which
    pages have been discarded.
    
    Between commits 9f1963b3 and b8d0a980, we converted the block
    layer to a byte-based interface that ultimately ignores any
    unaligned head or tail based on the driver's advertised
    discard granularity, which means that qemu 2.7 refuses to
    pass any discard request smaller than 15M down to the Dell
    Equallogic hardware.  This is a slight regression in behavior
    compared to earlier qemu, where a guest executing discards
    in power-of-2 chunks used to be able to get every page
    discarded, but is now left with various pages still allocated
    because the guest requests did not align with the hardware's
    15M pages.
    
    Since the SCSI specification says nothing about a minimum
    discard granularity, and only documents the preferred
    alignment, it is best if the block layer gives the driver
    every bit of information about discard requests, rather than
    rounding it to alignment boundaries early.
    
    Rework the block layer discard algorithm to mirror the write
    zero algorithm: always peel off any unaligned head or tail
    and manage that in isolation, then do the bulk of the request
    on an aligned boundary.  The fallback when the driver returns
    -ENOTSUP for an unaligned request is to silently ignore that
    portion of the discard request; but for devices that can pass
    the partial request all the way down to hardware, this can
    result in the hardware coalescing requests and discarding
    aligned pages after all.
    
    Reported by: Peter Lieven <pl@kamp.de>
    CC: qemu-stable@nongnu.org
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Loading