mirror of https://github.com/xemu-project/xemu.git
block-coroutine-wrapper: Add no_co_wrapper_bdrv_rdlock functions
Add a new wrapper type for GRAPH_RDLOCK functions that should be called from coroutine context. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20230929145157.45443-3-kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
903df115aa
commit
e84c07bc73
|
@ -66,13 +66,16 @@
|
||||||
* function. The coroutine yields after scheduling the BH and is reentered when
|
* function. The coroutine yields after scheduling the BH and is reentered when
|
||||||
* the wrapped function returns.
|
* the wrapped function returns.
|
||||||
*
|
*
|
||||||
* A no_co_wrapper_bdrv_wrlock function is a no_co_wrapper function that
|
* A no_co_wrapper_bdrv_rdlock function is a no_co_wrapper function that
|
||||||
* automatically takes the graph wrlock when calling the wrapped function.
|
* automatically takes the graph rdlock when calling the wrapped function. In
|
||||||
|
* the same way, no_co_wrapper_bdrv_wrlock functions automatically take the
|
||||||
|
* graph wrlock.
|
||||||
*
|
*
|
||||||
* If the first parameter of the function is a BlockDriverState, BdrvChild or
|
* If the first parameter of the function is a BlockDriverState, BdrvChild or
|
||||||
* BlockBackend pointer, the AioContext lock for it is taken in the wrapper.
|
* BlockBackend pointer, the AioContext lock for it is taken in the wrapper.
|
||||||
*/
|
*/
|
||||||
#define no_co_wrapper
|
#define no_co_wrapper
|
||||||
|
#define no_co_wrapper_bdrv_rdlock
|
||||||
#define no_co_wrapper_bdrv_wrlock
|
#define no_co_wrapper_bdrv_wrlock
|
||||||
|
|
||||||
#include "block/blockjob.h"
|
#include "block/blockjob.h"
|
||||||
|
|
|
@ -87,8 +87,9 @@ class FuncDecl:
|
||||||
raise ValueError(f"Invalid no_co function name: {self.name}")
|
raise ValueError(f"Invalid no_co function name: {self.name}")
|
||||||
if not self.create_only_co:
|
if not self.create_only_co:
|
||||||
raise ValueError(f"no_co function can't be mixed: {self.name}")
|
raise ValueError(f"no_co function can't be mixed: {self.name}")
|
||||||
if self.graph_rdlock:
|
if self.graph_rdlock and self.graph_wrlock:
|
||||||
raise ValueError(f"no_co function can't be rdlock: {self.name}")
|
raise ValueError("function can't be both rdlock and wrlock: "
|
||||||
|
f"{self.name}")
|
||||||
self.target_name = f'{subsystem}_{subname}'
|
self.target_name = f'{subsystem}_{subname}'
|
||||||
|
|
||||||
self.ctx = self.gen_ctx()
|
self.ctx = self.gen_ctx()
|
||||||
|
@ -256,7 +257,10 @@ def gen_no_co_wrapper(func: FuncDecl) -> str:
|
||||||
|
|
||||||
graph_lock=''
|
graph_lock=''
|
||||||
graph_unlock=''
|
graph_unlock=''
|
||||||
if func.graph_wrlock:
|
if func.graph_rdlock:
|
||||||
|
graph_lock=' bdrv_graph_rdlock_main_loop();'
|
||||||
|
graph_unlock=' bdrv_graph_rdunlock_main_loop();'
|
||||||
|
elif func.graph_wrlock:
|
||||||
graph_lock=' bdrv_graph_wrlock(NULL);'
|
graph_lock=' bdrv_graph_wrlock(NULL);'
|
||||||
graph_unlock=' bdrv_graph_wrunlock();'
|
graph_unlock=' bdrv_graph_wrunlock();'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue