mirror of
https://github.com/qemu/qemu.git
synced 2025-08-09 19:15:32 +00:00
block-coroutine-wrapper.py: support functions without bs arg
Right now, we take the first parameter of the function to get the BlockDriverState to pass to bdrv_poll_co(), that internally calls functions that figure in which aiocontext the coroutine should run. However, it is useless to pass a bs just to get its own AioContext, so instead pass it directly, and default to the main loop if no BlockDriverState is passed as parameter. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Message-Id: <20221128142337.657646-12-eesposit@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
76a2f554c1
commit
0582fb8293
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
/* Base structure for argument packing structures */
|
/* Base structure for argument packing structures */
|
||||||
typedef struct BdrvPollCo {
|
typedef struct BdrvPollCo {
|
||||||
BlockDriverState *bs;
|
AioContext *ctx;
|
||||||
bool in_progress;
|
bool in_progress;
|
||||||
int ret;
|
int ret;
|
||||||
Coroutine *co; /* Keep pointer here for debugging */
|
Coroutine *co; /* Keep pointer here for debugging */
|
||||||
@ -40,8 +40,8 @@ static inline int bdrv_poll_co(BdrvPollCo *s)
|
|||||||
{
|
{
|
||||||
assert(!qemu_in_coroutine());
|
assert(!qemu_in_coroutine());
|
||||||
|
|
||||||
bdrv_coroutine_enter(s->bs, s->co);
|
aio_co_enter(s->ctx, s->co);
|
||||||
BDRV_POLL_WHILE(s->bs, s->in_progress);
|
AIO_WAIT_WHILE(s->ctx, s->in_progress);
|
||||||
|
|
||||||
return s->ret;
|
return s->ret;
|
||||||
}
|
}
|
||||||
|
@ -75,12 +75,14 @@ def __init__(self, return_type: str, name: str, args: str,
|
|||||||
|
|
||||||
t = self.args[0].type
|
t = self.args[0].type
|
||||||
if t == 'BlockDriverState *':
|
if t == 'BlockDriverState *':
|
||||||
bs = 'bs'
|
ctx = 'bdrv_get_aio_context(bs)'
|
||||||
elif t == 'BdrvChild *':
|
elif t == 'BdrvChild *':
|
||||||
bs = 'child->bs'
|
ctx = 'bdrv_get_aio_context(child->bs)'
|
||||||
|
elif t == 'BlockBackend *':
|
||||||
|
ctx = 'blk_get_aio_context(blk)'
|
||||||
else:
|
else:
|
||||||
bs = 'blk_bs(blk)'
|
ctx = 'qemu_get_aio_context()'
|
||||||
self.bs = bs
|
self.ctx = ctx
|
||||||
|
|
||||||
def gen_list(self, format: str) -> str:
|
def gen_list(self, format: str) -> str:
|
||||||
return ', '.join(format.format_map(arg.__dict__) for arg in self.args)
|
return ', '.join(format.format_map(arg.__dict__) for arg in self.args)
|
||||||
@ -127,7 +129,7 @@ def create_mixed_wrapper(func: FuncDecl) -> str:
|
|||||||
return {name}({ func.gen_list('{name}') });
|
return {name}({ func.gen_list('{name}') });
|
||||||
}} else {{
|
}} else {{
|
||||||
{struct_name} s = {{
|
{struct_name} s = {{
|
||||||
.poll_state.bs = {func.bs},
|
.poll_state.ctx = {func.ctx},
|
||||||
.poll_state.in_progress = true,
|
.poll_state.in_progress = true,
|
||||||
|
|
||||||
{ func.gen_block(' .{name} = {name},') }
|
{ func.gen_block(' .{name} = {name},') }
|
||||||
@ -150,7 +152,7 @@ def create_co_wrapper(func: FuncDecl) -> str:
|
|||||||
int {func.name}({ func.gen_list('{decl}') })
|
int {func.name}({ func.gen_list('{decl}') })
|
||||||
{{
|
{{
|
||||||
{struct_name} s = {{
|
{struct_name} s = {{
|
||||||
.poll_state.bs = {func.bs},
|
.poll_state.ctx = {func.ctx},
|
||||||
.poll_state.in_progress = true,
|
.poll_state.in_progress = true,
|
||||||
|
|
||||||
{ func.gen_block(' .{name} = {name},') }
|
{ func.gen_block(' .{name} = {name},') }
|
||||||
@ -166,8 +168,6 @@ def create_co_wrapper(func: FuncDecl) -> str:
|
|||||||
def gen_wrapper(func: FuncDecl) -> str:
|
def gen_wrapper(func: FuncDecl) -> str:
|
||||||
assert not '_co_' in func.name
|
assert not '_co_' in func.name
|
||||||
assert func.return_type == 'int'
|
assert func.return_type == 'int'
|
||||||
assert func.args[0].type in ['BlockDriverState *', 'BdrvChild *',
|
|
||||||
'BlockBackend *']
|
|
||||||
|
|
||||||
name = func.co_name
|
name = func.co_name
|
||||||
struct_name = func.struct_name
|
struct_name = func.struct_name
|
||||||
|
Loading…
Reference in New Issue
Block a user