On Wed, Jun 14, 2023 at 01:46:31PM +0200, Hannes Reinecke wrote: > static void brd_free_pages(struct brd_device *brd) > { > - unsigned long pos = 0; > - struct page *pages[FREE_BATCH]; > - int nr_pages; > - > - do { > - int i; > - > - nr_pages = radix_tree_gang_lookup(&brd->brd_pages, > - (void **)pages, pos, FREE_BATCH); > - > - for (i = 0; i < nr_pages; i++) { > - void *ret; > - > - BUG_ON(pages[i]->index < pos); > - pos = pages[i]->index; > - ret = radix_tree_delete(&brd->brd_pages, pos); > - BUG_ON(!ret || ret != pages[i]); > - __free_page(pages[i]); > - } > - > - pos++; > + struct page *page; > + pgoff_t idx; > > - /* > - * It takes 3.4 seconds to remove 80GiB ramdisk. > - * So, we need cond_resched to avoid stalling the CPU. > - */ > - cond_resched(); > + xa_for_each(&brd->brd_pages, idx, page) { > + __free_page(page); > + cond_resched_rcu(); This should be a regular cond_resched(). The body of the loop is run without the RCU read lock held. Surprised none of the bots have noticed an unlock-underflow. Perhaps they don't test brd ;-) With that fixed, Reviewed-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx>