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


Reply via email to