Skip to content
Snippets Groups Projects
  • Leonardo Bras's avatar
    b88651cb
    QIOChannel: Add flags on io_writev and introduce io_flush callback · b88651cb
    Leonardo Bras authored
    
    Add flags to io_writev and introduce io_flush as optional callback to
    QIOChannelClass, allowing the implementation of zero copy writes by
    subclasses.
    
    How to use them:
    - Write data using qio_channel_writev*(...,QIO_CHANNEL_WRITE_FLAG_ZERO_COPY),
    - Wait write completion with qio_channel_flush().
    
    Notes:
    As some zero copy write implementations work asynchronously, it's
    recommended to keep the write buffer untouched until the return of
    qio_channel_flush(), to avoid the risk of sending an updated buffer
    instead of the buffer state during write.
    
    As io_flush callback is optional, if a subclass does not implement it, then:
    - io_flush will return 0 without changing anything.
    
    Also, some functions like qio_channel_writev_full_all() were adapted to
    receive a flag parameter. That allows shared code between zero copy and
    non-zero copy writev, and also an easier implementation on new flags.
    
    Signed-off-by: default avatarLeonardo Bras <leobras@redhat.com>
    Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Reviewed-by: default avatarJuan Quintela <quintela@redhat.com>
    Message-Id: <20220513062836.965425-3-leobras@redhat.com>
    Signed-off-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
    b88651cb
    History
    QIOChannel: Add flags on io_writev and introduce io_flush callback
    Leonardo Bras authored
    
    Add flags to io_writev and introduce io_flush as optional callback to
    QIOChannelClass, allowing the implementation of zero copy writes by
    subclasses.
    
    How to use them:
    - Write data using qio_channel_writev*(...,QIO_CHANNEL_WRITE_FLAG_ZERO_COPY),
    - Wait write completion with qio_channel_flush().
    
    Notes:
    As some zero copy write implementations work asynchronously, it's
    recommended to keep the write buffer untouched until the return of
    qio_channel_flush(), to avoid the risk of sending an updated buffer
    instead of the buffer state during write.
    
    As io_flush callback is optional, if a subclass does not implement it, then:
    - io_flush will return 0 without changing anything.
    
    Also, some functions like qio_channel_writev_full_all() were adapted to
    receive a flag parameter. That allows shared code between zero copy and
    non-zero copy writev, and also an easier implementation on new flags.
    
    Signed-off-by: default avatarLeonardo Bras <leobras@redhat.com>
    Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
    Reviewed-by: default avatarPeter Xu <peterx@redhat.com>
    Reviewed-by: default avatarJuan Quintela <quintela@redhat.com>
    Message-Id: <20220513062836.965425-3-leobras@redhat.com>
    Signed-off-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>