Skip to content
  • Alberto Faria's avatar
    block: Add no_coroutine_fn and coroutine_mixed_fn marker · 0f3de970
    Alberto Faria authored and Kevin Wolf's avatar Kevin Wolf committed
    
    
    Add more annotations to functions, describing valid and invalid
    calls from coroutine to non-coroutine context.
    
    When applied to a function, no_coroutine_fn advertises that it should
    not be called from coroutine_fn functions.  This can be because the
    function blocks or, in the case of generated_co_wrapper, to enforce
    that coroutine_fn functions directly call the coroutine_fn that backs
    the generated_co_wrapper.
    
    coroutine_mixed_fn instead is for function that can be called in
    both coroutine and non-coroutine context, but will suspend when
    called in coroutine context.  Annotating them is a first step
    towards enforcing that non-annotated functions are absolutely
    not going to suspend.
    
    These can be used for example with the vrc tool:
    
        # find functions that *really* cannot be called from no_coroutine_fn
        (vrc) load --loader clang libblock.fa.p/meson-generated_.._block_block-gen.c.o
        (vrc) paths [no_coroutine_fn,!coroutine_mixed_fn]
        bdrv_remove_persistent_dirty_bitmap
        bdrv_create
        bdrv_can_store_new_dirty_bitmap
    
        # find how coroutine_fns end up calling a mixed function
        (vrc) load --loader clang --force libblock.fa.p/*.c.o
        (vrc) paths [coroutine_fn] [!no_coroutine_fn]* [coroutine_mixed_fn]
        ...
        bdrv_pread <- vhdx_log_write <- vhdx_log_write_and_flush <- vhdx_co_writev
        ...
    
    Signed-off-by: Alberto Faria's avatarAlberto Faria <afaria@redhat.com>
    [Rebase, add coroutine_mixed_fn. - Paolo]
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Message-Id: <20221216110758.559947-3-pbonzini@redhat.com>
    Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    0f3de970