Skip to content
Snippets Groups Projects
  • Emanuele Giuseppe Esposito's avatar
    1e97be91
    block: Convert bdrv_is_inserted() to co_wrapper · 1e97be91
    Emanuele Giuseppe Esposito authored
    
    bdrv_is_inserted() is categorized as an I/O function, and it currently
    doesn't run in a coroutine. We should let it take a graph rdlock since
    it traverses the block nodes graph, which however is only possible in a
    coroutine.
    
    Therefore turn it into a co_wrapper to move the actual function into a
    coroutine where the lock can be taken.
    
    At the same time, add also blk_is_inserted as co_wrapper_mixed, since it
    is called in both coroutine and non-coroutine contexts.
    
    Because now this function creates a new coroutine and polls, we need to
    take the AioContext lock where it is missing, for the only reason that
    internally c_w_mixed_bdrv_rdlock calls AIO_WAIT_WHILE and it expects to
    release the AioContext lock. Once the rwlock is ultimated and placed in
    every place it needs to be, we will poll using AIO_WAIT_WHILE_UNLOCKED
    and remove the AioContext lock.
    
    Signed-off-by: default avatarEmanuele Giuseppe Esposito <eesposit@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Message-Id: <20230113204212.359076-5-kwolf@redhat.com>
    Reviewed-by: default avatarEmanuele Giuseppe Esposito <eesposit@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    1e97be91
    History
    block: Convert bdrv_is_inserted() to co_wrapper
    Emanuele Giuseppe Esposito authored
    
    bdrv_is_inserted() is categorized as an I/O function, and it currently
    doesn't run in a coroutine. We should let it take a graph rdlock since
    it traverses the block nodes graph, which however is only possible in a
    coroutine.
    
    Therefore turn it into a co_wrapper to move the actual function into a
    coroutine where the lock can be taken.
    
    At the same time, add also blk_is_inserted as co_wrapper_mixed, since it
    is called in both coroutine and non-coroutine contexts.
    
    Because now this function creates a new coroutine and polls, we need to
    take the AioContext lock where it is missing, for the only reason that
    internally c_w_mixed_bdrv_rdlock calls AIO_WAIT_WHILE and it expects to
    release the AioContext lock. Once the rwlock is ultimated and placed in
    every place it needs to be, we will poll using AIO_WAIT_WHILE_UNLOCKED
    and remove the AioContext lock.
    
    Signed-off-by: default avatarEmanuele Giuseppe Esposito <eesposit@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    Message-Id: <20230113204212.359076-5-kwolf@redhat.com>
    Reviewed-by: default avatarEmanuele Giuseppe Esposito <eesposit@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>