From: Hyesoo Yu <hyesoo.yu@samsung.com>
To: Vishal Moola <vishal.moola@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm: page_alloc: check the order of compound page event when the order is 0
Date: Mon, 16 Oct 2023 09:32:00 +0900 [thread overview]
Message-ID: <20231016003200.GA445850@tiffany> (raw)
In-Reply-To: <ZSmucNWBMj/mNVeE@dhcp-10-159-238-251.vpn.oracle.com>
[-- Attachment #1: Type: text/plain, Size: 1752 bytes --]
On Fri, Oct 13, 2023 at 01:54:08PM -0700, Vishal Moola wrote:
> On Thu, Oct 12, 2023 at 10:11:06AM +0900, Hyesoo Yu wrote:
> > For compound pages, the head sets the PG_head flag and
> > the tail sets the compound_head to indicate the head page.
> > If a user allocates a compound page and frees it with a different
> > order, the compound page information will not be properly
> > initialized. To detect this problem, compound_page(page) and
> > the order are compared, but it is not checked when the order is 0.
> > That error should be checked regardless of the order.
>
> I believe all compound pages are order >= 1, so this error can't occur
> when the order is 0.
>
Yes. All compound pages are order >= 1.
However if the user uses the API incorrectly, the order value could be zero.
For example,
addr = alloc_pages(GFP_COMP, 2);
free_pages(addr, 0);
(struct page[16])0xFFFFFFFE21715100 = (
(flags = 0x4000000000000200, lru = (next = 0x0, prev = 0xDEAD000000000122),// Clear PG_head
(flags = 0x4000000000000000, lru = (next = 0xFFFFFFFE21715101, prev = 0xFFFFFFFF00000201), // Remain compound head
It is memory leak, and it also makes system stability problem.
on isolation_single_pageblock, That case makes infinite loops.
for (pfn = start_pfn; pfn < boundary_pfn; ) {
if (PageCompound(page)) { // page[1] is compound page
struct page *head = compound_head(page); // page[0]
unsigned long head_pfn = page_to_pfn(head);
unsigned long nr_pages = compound_nr(head); // nr_pages is 1 since page[0] is not compound page.
if (head_pfn + nr_pages <= boundary_pfn) {
pfn = head_pfn + nr_pages; // pfn is set as page[1].
continue;
}
}
So, I guess, we have to check the incorrect use in free_pages_prepare.
Thanks,
Hyesoo Yu.
[-- Attachment #2: Type: text/plain, Size: 0 bytes --]
next prev parent reply other threads:[~2023-10-16 0:42 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20231012012153epcas2p34b8e9e8a898ace8d50411cadf937ef5d@epcas2p3.samsung.com>
2023-10-12 1:11 ` [PATCH] mm: page_alloc: check the order of compound page event when the order is 0 Hyesoo Yu
2023-10-12 1:11 ` Hyesoo Yu
2023-10-13 20:54 ` Vishal Moola
2023-10-16 0:32 ` Hyesoo Yu [this message]
2023-10-16 3:28 ` Vishal Moola
2023-10-16 7:23 ` Hyesoo Yu
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=20231016003200.GA445850@tiffany \
--to=hyesoo.yu@samsung.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=vishal.moola@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.