• John Garry's avatar
    blk-mq: Use request queue-wide tags for tagset-wide sbitmap · d97e594c
    John Garry authored
    The tags used for an IO scheduler are currently per hctx.
    
    As such, when q->nr_hw_queues grows, so does the request queue total IO
    scheduler tag depth.
    
    This may cause problems for SCSI MQ HBAs whose total driver depth is
    fixed.
    
    Ming and Yanhui report higher CPU usage and lower throughput in scenarios
    where the fixed total driver tag depth is appreciably lower than the total
    scheduler tag depth:
    https://lore.kernel.org/linux-block/440dfcfc-1a2c-bd98-1161-cec4d78c6dfc@huawei.com/T/#mc0d6d4f95275a2743d1c8c3e4dc9ff6c9aa3a76b
    
    In that scenario, since the scheduler tag is got first, much contention
    is introduced since a driver tag may not be available after we have got
    the sched tag.
    
    Improve this scenario by introducing request queue-wide tags for when
    a tagset-wide sbitmap is used. The static sched requests are still
    allocated per hctx, as requests are initialised per hctx, as in
    blk_mq_init_request(..., hctx_idx, ...) ->
    set->ops->init_request(..,...
    d97e594c
blk-mq-tag.c 17.7 KB