Skip to content
  • Stefan Hajnoczi's avatar
    e8b65355
    block: add BDRV_REQ_REGISTERED_BUF request flag · e8b65355
    Stefan Hajnoczi authored
    
    
    Block drivers may optimize I/O requests accessing buffers previously
    registered with bdrv_register_buf(). Checking whether all elements of a
    request's QEMUIOVector are within previously registered buffers is
    expensive, so we need a hint from the user to avoid costly checks.
    
    Add a BDRV_REQ_REGISTERED_BUF request flag to indicate that all
    QEMUIOVector elements in an I/O request are known to be within
    previously registered buffers.
    
    Always pass the flag through to driver read/write functions. There is
    little harm in passing the flag to a driver that does not use it.
    Passing the flag to drivers avoids changes across many block drivers.
    Filter drivers would need to explicitly support the flag and pass
    through to their children when the children support it. That's a lot of
    code changes and it's hard to remember to do that everywhere, leading to
    silent reduced performance when the flag is accidentally dropped.
    
    The only problematic scenario with the approach in this patch is when a
    driver passes the flag through to internal I/O requests that don't use
    the same I/O buffer. In that case the hint may be set when it should
    actually be clear. This is a rare case though so the risk is low.
    
    Some drivers have assert(!flags), which no longer works when
    BDRV_REQ_REGISTERED_BUF is passed in. These assertions aren't very
    useful anyway since the functions are called almost exclusively by
    bdrv_driver_preadv/pwritev() so if we get flags handling right there
    then the assertion is not needed.
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 20221013185908.1297568-7-stefanha@redhat.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    e8b65355
    block: add BDRV_REQ_REGISTERED_BUF request flag
    Stefan Hajnoczi authored
    
    
    Block drivers may optimize I/O requests accessing buffers previously
    registered with bdrv_register_buf(). Checking whether all elements of a
    request's QEMUIOVector are within previously registered buffers is
    expensive, so we need a hint from the user to avoid costly checks.
    
    Add a BDRV_REQ_REGISTERED_BUF request flag to indicate that all
    QEMUIOVector elements in an I/O request are known to be within
    previously registered buffers.
    
    Always pass the flag through to driver read/write functions. There is
    little harm in passing the flag to a driver that does not use it.
    Passing the flag to drivers avoids changes across many block drivers.
    Filter drivers would need to explicitly support the flag and pass
    through to their children when the children support it. That's a lot of
    code changes and it's hard to remember to do that everywhere, leading to
    silent reduced performance when the flag is accidentally dropped.
    
    The only problematic scenario with the approach in this patch is when a
    driver passes the flag through to internal I/O requests that don't use
    the same I/O buffer. In that case the hint may be set when it should
    actually be clear. This is a rare case though so the risk is low.
    
    Some drivers have assert(!flags), which no longer works when
    BDRV_REQ_REGISTERED_BUF is passed in. These assertions aren't very
    useful anyway since the functions are called almost exclusively by
    bdrv_driver_preadv/pwritev() so if we get flags handling right there
    then the assertion is not needed.
    
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    Message-id: 20221013185908.1297568-7-stefanha@redhat.com
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Loading