On 22.08.2025 13:01, Marek Szyprowski wrote: > On 08.07.2025 01:46, Joanne Koong wrote: >> There are no users of BDI_CAP_WRITEBACK_ACCT now that fuse doesn't do >> its own writeback accounting. This commit removes >> BDI_CAP_WRITEBACK_ACCT. >> >> Signed-off-by: Joanne Koong <joannelkoong@xxxxxxxxx> >> Acked-by: David Hildenbrand <david@xxxxxxxxxx> > > This patch landed recently in linux-next as commit 167f21a81a9c ("mm: > remove BDI_CAP_WRITEBACK_ACCT"). In my tests I found that it triggers > the ./include/linux/backing-dev.h:239 warning. Reverting $subject on > top of current linux-next fixes/hides this issue. Here is a detailed log: > > ------------[ cut here ]------------ > WARNING: ./include/linux/backing-dev.h:239 at > __folio_start_writeback+0x25a/0x26a, CPU#1: swapper/0/1 > Modules linked in: > CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted > 6.17.0-rc2-next-20250822 #10852 NONE > Hardware name: StarFive VisionFive 2 v1.2A (DT) > epc : __folio_start_writeback+0x25a/0x26a > ra : __folio_start_writeback+0x258/0x26a > > [<ffffffff80202222>] __folio_start_writeback+0x25a/0x26a > [<ffffffff802f3260>] __block_write_full_folio+0x124/0x39c > [<ffffffff802f4b6e>] block_write_full_folio+0x8a/0xbc > [<ffffffff804dbf42>] blkdev_writepages+0x3e/0x8a > [<ffffffff802030fa>] do_writepages+0x78/0x11a > [<ffffffff801f2e0e>] filemap_fdatawrite_wbc+0x4a/0x62 > [<ffffffff801f6d66>] __filemap_fdatawrite_range+0x52/0x78 > [<ffffffff801f6fdc>] filemap_write_and_wait_range+0x40/0x68 > [<ffffffff804dacae>] set_blocksize+0xd8/0x152 > [<ffffffff804dae18>] sb_min_blocksize+0x44/0xce > [<ffffffff803a0c7a>] ext4_fill_super+0x182/0x2914 > [<ffffffff802a72e6>] get_tree_bdev_flags+0xf0/0x168 > [<ffffffff802a736c>] get_tree_bdev+0xe/0x16 > [<ffffffff8039a09e>] ext4_get_tree+0x14/0x1c > [<ffffffff802a5062>] vfs_get_tree+0x1a/0xa4 > [<ffffffff802d17d4>] path_mount+0x23a/0x8ae > [<ffffffff80c20cd4>] init_mount+0x4e/0x86 > [<ffffffff80c01622>] do_mount_root+0xe0/0x166 > [<ffffffff80c01814>] mount_root_generic+0x11e/0x2d6 > [<ffffffff80c02746>] initrd_load+0xf8/0x2b6 > [<ffffffff80c01d38>] prepare_namespace+0x150/0x258 > [<ffffffff80c01310>] kernel_init_freeable+0x2f2/0x316 > [<ffffffff80b6d896>] kernel_init+0x1e/0x13a > [<ffffffff80012288>] ret_from_fork_kernel+0x14/0x208 > [<ffffffff80b79392>] ret_from_fork_kernel_asm+0x16/0x18 > irq event stamp: 159263 > hardirqs last enabled at (159263): [<ffffffff805e7e4a>] > percpu_counter_add_batch+0xa6/0xda > hardirqs last disabled at (159262): [<ffffffff805e7e40>] > percpu_counter_add_batch+0x9c/0xda > softirqs last enabled at (159248): [<ffffffff8002e972>] > handle_softirqs+0x3ca/0x462 > softirqs last disabled at (159241): [<ffffffff8002eb72>] > __irq_exit_rcu+0xe2/0x10c > ---[ end trace 0000000000000000 ]--- I've played a bit with the code modified by the $subject patch and it looks that the following change fixes the issue, although I didn't analyze exactly where struct bdi_writeback is being modified: diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 99e80bdb3084..3887ac2e6475 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -2984,7 +2984,7 @@ bool __folio_end_writeback(struct folio *folio) if (mapping && mapping_use_writeback_tags(mapping)) { struct inode *inode = mapping->host; - struct bdi_writeback *wb = inode_to_wb(inode); + struct bdi_writeback *wb; unsigned long flags; xa_lock_irqsave(&mapping->i_pages, flags); @@ -2992,6 +2992,7 @@ bool __folio_end_writeback(struct folio *folio) __xa_clear_mark(&mapping->i_pages, folio_index(folio), PAGECACHE_TAG_WRITEBACK); + wb = inode_to_wb(inode); wb_stat_mod(wb, WB_WRITEBACK, -nr); __wb_writeout_add(wb, nr); if (!mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) { @@ -3024,7 +3025,7 @@ void __folio_start_writeback(struct folio *folio, bool keep_write) if (mapping && mapping_use_writeback_tags(mapping)) { XA_STATE(xas, &mapping->i_pages, folio_index(folio)); struct inode *inode = mapping->host; - struct bdi_writeback *wb = inode_to_wb(inode); + struct bdi_writeback *wb; unsigned long flags; bool on_wblist; @@ -3035,6 +3036,7 @@ void __folio_start_writeback(struct folio *folio, bool keep_write) on_wblist = mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK); xas_set_mark(&xas, PAGECACHE_TAG_WRITEBACK); + wb = inode_to_wb(inode); wb_stat_mod(wb, WB_WRITEBACK, nr); if (!on_wblist) { wb_inode_writeback_start(wb); > ... Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland