Am 01.07.2025 um 13:44 hat Hanna Czenczek geschrieben:
> Make BlockExportType.iothread an alternate between a single-thread
> variant 'str' and a multi-threading variant '[str]'.
>
> In contrast to the single-thread setting, the multi-threading setting
> will not change the BDS's context (and so is incompatible with the
> fixed-iothread setting), but instead just pass a list to the export
> driver, with which it can do whatever it wants.
>
> Currently no export driver supports multi-threading, so they all return
> an error when receiving such a list.
>
> Suggested-by: Kevin Wolf <[email protected]>
> Acked-by: Markus Armbruster <[email protected]>
> Reviewed-by: Stefan Hajnoczi <[email protected]>
> Signed-off-by: Hanna Czenczek <[email protected]>
> diff --git a/include/block/export.h b/include/block/export.h
> index 4bd9531d4d..ca45da928c 100644
> --- a/include/block/export.h
> +++ b/include/block/export.h
> @@ -32,8 +32,16 @@ typedef struct BlockExportDriver {
> /* True if the export type supports running on an inactive node */
> bool supports_inactive;
>
> - /* Creates and starts a new block export */
> - int (*create)(BlockExport *, BlockExportOptions *, Error **);
> + /*
> + * Creates and starts a new block export.
> + *
> + * If the user passed a set of I/O threads for multi-threading,
> @multithread
> + * is a list of the @multithread_count corresponding contexts (freed by
> the
> + * caller). Note that @exp->ctx has no relation to that list.
Maybe worth stating that it's NULL in the single threaded case?
> + */
> + int (*create)(BlockExport *exp, BlockExportOptions *opts,
> + AioContext *const *multithread, size_t multithread_count,
> + Error **errp);
>
> /*
> * Frees a removed block export. This function is only called after all
> diff --git a/block/export/export.c b/block/export/export.c
> index f3bbf11070..b733f269f3 100644
> --- a/block/export/export.c
> +++ b/block/export/export.c
> @@ -76,16 +76,26 @@ BlockExport *blk_exp_add(BlockExportOptions *export,
> Error **errp)
> {
> bool fixed_iothread = export->has_fixed_iothread &&
> export->fixed_iothread;
> bool allow_inactive = export->has_allow_inactive &&
> export->allow_inactive;
> + bool multithread = export->iothread &&
> + export->iothread->type == QTYPE_QLIST;
> const BlockExportDriver *drv;
> BlockExport *exp = NULL;
> BlockDriverState *bs;
> BlockBackend *blk = NULL;
> AioContext *ctx;
> + AioContext **multithread_ctxs = NULL;
g_autofree?
Kevin