From: Matthew Wilcox <willy@infradead.org>
To: sashiko-reviews@lists.linux.dev
Cc: yukuai@fygo.io, linux-raid@vger.kernel.org,
Zi Yan <ziy@nvidia.com>, David Hildenbrand <david@kernel.org>,
linux-mm@kvack.org
Subject: Re: [PATCH 2/3] md: Use folio APIs in free_page()
Date: Mon, 14 Sep 2026 17:21:23 +0100 [thread overview]
Message-ID: <aqgfA0QFi98gXYG2@casper.infradead.org> (raw)
In-Reply-To: <20260914043129.C6F8D1F000FF@smtp.kernel.org>
On Mon, Sep 14, 2026 at 04:31:29AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
>
> Pre-existing issues:
> - [High] Memory leak of internal bitmap pages and uninitialized file bitmap pages during teardown or error handling due to an early return in free_buffers().
> --
Yes, I thought the early return looked weird. I just believed that I
hadn't looked into the code enough to understand why it looked weird but
was right. Since the AI says it's wrong, I'm happy to believe it's wrong.
It's probably not really a high seveirty problem because most RAIDs are
set up once and then never removed, so the leak doesn't matter.
The other thing that looks weird is that this code believes the b_this_page
list is NULL terminated. Most loops over "all BHs attached to a folio"
have a circular list. However, that is established by link_dev_buffers()
which is not called by md-bitmap. So it's correct, even though weird.
The good news is this is an easy fix:
@@ -536,9 +536,6 @@ static void free_buffers(struct page *page)
struct folio *folio = page_folio(page);
struct buffer_head *bh = folio_detach_private(folio);
- if (!bh)
- return;
-
while (bh) {
struct buffer_head *next = bh->b_this_page;
free_buffer_head(bh);
I can submit a new vrsion, or Zi can just pick this up.
> commit d68f524234e61e6567e52a27e09b9d2546ab54af
> Author: Matthew Wilcox (Oracle) <willy@infradead.org>
>
> md: Use folio APIs in free_page()
>
> This commit converts the page to a folio, removing some of the last uses of
> a few page APIs and replacing two calls to compound_head() with one.
>
> > diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
> > index 5f1637f974c15..7b42db87d536d 100644
> > --- a/drivers/md/md-bitmap.c
> > +++ b/drivers/md/md-bitmap.c
> > @@ -533,19 +533,18 @@ static void write_file_page(struct bitmap *bitmap, struct page *page, int wait)
> >
> > static void free_buffers(struct page *page)
> > {
> > - struct buffer_head *bh;
> > + struct folio *folio = page_folio(page);
> > + struct buffer_head *bh = folio_detach_private(folio);
> >
> > - if (!PagePrivate(page))
> > + if (!bh)
> > return;
>
> [Severity: High]
> This is a pre-existing issue, but this early return skips the folio_put()
> required to drop the base allocation reference for pages that do not have
> buffers attached.
>
> For internal bitmaps, pages are allocated via alloc_page() with a refcount
> of 1 in md_bitmap_storage_alloc():
>
> drivers/md/md-bitmap.c:md_bitmap_storage_alloc() {
> ...
> store->filemap[pnum] = alloc_page(GFP_KERNEL|__GFP_ZERO);
> ...
> }
>
> During MD array teardown or failure, md_bitmap_file_unmap() calls
> free_buffers() on these pages:
>
> drivers/md/md-bitmap.c:md_bitmap_file_unmap() {
> ...
> free_buffers(map[pages]);
> ...
> }
>
> Because internal bitmap pages don't have buffers attached, (!bh) evaluates
> to true, triggering the early return and completely bypassing the folio_put()
> at the end of the function.
>
> This permanently leaks the pages allocated for the internal bitmap's filemap
> and superblock.
>
> Does this early return need to be updated so that folio_put() is still
> called for folios without buffers?
>
> > - bh = page_buffers(page);
> > while (bh) {
> > struct buffer_head *next = bh->b_this_page;
> > free_buffer_head(bh);
> > bh = next;
> > }
> > - detach_page_private(page);
> > - put_page(page);
> > + folio_put(folio);
> > }
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20260913-remove-pg_private-v4-0-848550f7574e@nvidia.com?part=2
next prev parent reply other threads:[~2026-09-14 16:21 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 2:23 [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Zi Yan
2026-09-14 2:24 ` [PATCH v4 13/16] md/md-bitmap: replace PagePrivate() with page_private() Zi Yan
2026-09-14 2:24 ` [PATCH v4 14/16] buffer: replace page_buffer() with page_private() and delete it Zi Yan
2026-09-14 3:39 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Andrew Morton
2026-09-15 17:16 ` Zi Yan
2026-09-14 4:18 ` [PATCH 1/3] md: Use folio_alloc_buffers() Matthew Wilcox (Oracle)
2026-09-14 4:27 ` sashiko-bot
2026-09-14 13:12 ` David Hildenbrand (Arm)
2026-09-14 13:17 ` Matthew Wilcox
2026-09-14 13:20 ` David Hildenbrand (Arm)
2026-09-14 14:36 ` Zi Yan
2026-09-14 4:18 ` [PATCH 2/3] md: Use folio APIs in free_page() Matthew Wilcox (Oracle)
2026-09-14 4:31 ` sashiko-bot
2026-09-14 16:21 ` Matthew Wilcox [this message]
2026-09-14 16:25 ` Zi Yan
2026-09-14 13:13 ` David Hildenbrand (Arm)
2026-09-14 4:18 ` [PATCH 3/3] md: Remove the last use of page_buffers() Matthew Wilcox (Oracle)
2026-09-14 4:29 ` sashiko-bot
2026-09-14 13:14 ` David Hildenbrand (Arm)
2026-09-14 4:21 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Matthew Wilcox
2026-09-14 13:10 ` David Hildenbrand (Arm)
2026-09-14 15:30 ` [f2fs-dev] " patchwork-bot+f2fs
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aqgfA0QFi98gXYG2@casper.infradead.org \
--to=willy@infradead.org \
--cc=david@kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-raid@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=yukuai@fygo.io \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox