• Ming Lei's avatar
    blk-mq: make sure hctx->next_cpu is set correctly · 7bed4595
    Ming Lei authored
    When hctx->next_cpu is set from possible online CPUs, there is one
    race in which hctx->next_cpu may be set as >= nr_cpu_ids, and finally
    break workqueue.
    
    The race can be triggered in the following two sitations:
    
    1) when one CPU is becoming DEAD, blk_mq_hctx_notify_dead() is called
    to dispatch requests from the DEAD cpu context, but at that
    time, this DEAD CPU has been cleared from 'cpu_online_mask', so all
    CPUs in hctx->cpumask may become offline, and cause hctx->next_cpu set
    a bad value.
    
    2) blk_mq_delay_run_hw_queue() is called from CPU B, and found the queue
    should be run on the other CPU A, then CPU A may become offline at the
    same time and all CPUs in hctx->cpumask become offline.
    
    This patch deals with this issue by re-selecting next CPU, and making
    sure it is set correctly.
    
    Cc: Christian Borntraeger <borntraeger@de.ibm.com>
    Cc: Stefan Haberland <sth@linux.vnet.ibm.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Reported-by: default avatar"jianchao.wang" <jianchao.w.wang@oracle.com>
    Tested-by: default avatar"jianchao.wang" <jianchao.w.wang@oracle.com>
    Fixes: 20e4d813 ("blk-mq: simplify queue mapping & schedule with each possisble CPU")
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    7bed4595
blk-mq.c 75.8 KB