Hello, Thanks for the fix. A couple comments below. On Sat, Nov 21, 2020 at 04:34:20PM +0800, Yu Kuai wrote: > +#define BLKG_DESTROY_BATH 4096 I think you meant BLKG_DESTROY_BATCH. > static void blkg_destroy_all(struct request_queue *q) > { > struct blkcg_gq *blkg, *n; > + int count = BLKG_DESTROY_BATH; But might as well just write 4096 here. > spin_lock_irq(&q->queue_lock); > list_for_each_entry_safe(blkg, n, &q->blkg_list, q_node) { > struct blkcg *blkcg = blkg->blkcg; > > + /* > + * If the list is too long, the loop can took a long time, > + * thus relese the lock for a while when a batch of blkcg > + * were destroyed. > + */ > + if (!(--count)) { > + count = BLKG_DESTROY_BATH; > + spin_unlock_irq(&q->queue_lock); > + cond_resched(); > + spin_lock_irq(&q->queue_lock); You can't continue iteration after dropping both locks. You'd have to jump out of loop and start list_for_each_entry_safe() again. > + } > spin_lock(&blkcg->lock); > blkg_destroy(blkg); > spin_unlock(&blkcg->lock); Thanks. -- tejun