• Damien Le Moal's avatar
    block: use a per disk workqueue for zone write plugging · a8f59e5a
    Damien Le Moal authored
    A zone write plug BIO work function blk_zone_wplug_bio_work() calls
    submit_bio_noacct_nocheck() to execute the next unplugged BIO. This
    function may block. So executing zone plugs BIO works using the block
    layer global kblockd workqueue can potentially lead to preformance or
    latency issues as the number of concurrent work for a workqueue is
    limited to WQ_DFL_ACTIVE (256).
    1) For a system with a large number of zoned disks, issuing write
       requests to otherwise unused zones may be delayed wiating for a work
       thread to become available.
    2) Requeue operations which use kblockd but are independent of zone
       write plugging may alsoi end up being delayed.
    
    To avoid these potential performance issues, create a workqueue per
    zoned device to execute zone plugs BIO work. The workqueue max active
    parameter is set to the maximum number of zone write plugs allocated
    with the zone write plug mempool. This limit is equal to the maximum
    number of open zones of the disk and defaults to 128 for disks that do
    not have a limit on the number of open zones.
    
    Fixes: dd291d77 ("block: Introduce zone write plugging")
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20240420075811.1276893-3-dlemoal@kernel.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    a8f59e5a
blk-zoned.c 50.6 KB