On 8/3/21 7:25 PM, Ming Lei wrote: > 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(). Yes I know, see email sent 1 min after the one you're replying to. -- Jens Axboe