On Tue, Aug 03, 2021 at 07:02:28AM -0600, Jens Axboe wrote: > On 8/3/21 1:06 AM, Ming Lei wrote: > > blkcg->lock depends on q->queue_lock which may depend on another driver > > lock required in irq context, one example is dm-thin: > > > > Chain exists of: > > &pool->lock#3 --> &q->queue_lock --> &blkcg->lock > > > > Possible interrupt unsafe locking scenario: > > > > CPU0 CPU1 > > ---- ---- > > lock(&blkcg->lock); > > local_irq_disable(); > > lock(&pool->lock#3); > > lock(&q->queue_lock); > > <Interrupt> > > lock(&pool->lock#3); > > > > Fix the issue by using spin_lock_irq(&blkcg->lock) in ioc_weight_write(). > > This looks fine to me for blk-iocost, but block/blk-cgroup.c:blkg_create() > also looks like it gets the IRQ state of the same lock wrong? blkg_create() is called with irq disabled in all three callers: blkg_lookup_create(), blkg_conf_prep() and blkcg_init_queue(). -- Ming