diff for duplicates of <010001858025fc22-e619988e-c0a5-4545-bd93-783890b9ad14-000000@email.amazonses.com>
diff --git a/a/1.txt b/N1/1.txt
index 006d6ef..e1c302a 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,98 +1,84 @@
-If CONFIG_DEFERRED_STRUCT_PAGE_INIT is enabled, memblock_free_pages()
-only releases pages to the buddy allocator if they are not in the
-deferred range. This is correct for free pages (as defined by
-for_each_free_mem_pfn_range_in_zone()) because free pages in the
-deferred range will be initialized and released as part of the deferred
-init process. memblock_free_pages() is called by memblock_free_late(),
-which is used to free reserved ranges after memblock_free_all() has
-run. All pages in reserved ranges have been initialized at that point,
-and accordingly, those pages are not touched by the deferred init
-process. This means that currently, if the pages that
-memblock_free_late() intends to release are in the deferred range, they
-will never be released to the buddy allocator. They will forever be
-reserved.
+From: Aaron Thompson <dev@aaront.org>\r
-In addition, memblock_free_pages() calls kmsan_memblock_free_pages(),
-which is also correct for free pages but is not correct for reserved
-pages. KMSAN metadata for reserved pages is initialized by
-kmsan_init_shadow(), which runs shortly before memblock_free_all().
-
-For both of these reasons, memblock_free_pages() should only be called
-for free pages, and memblock_free_late() should call __free_pages_core()
-directly instead.
-
-One case where this issue can occur in the wild is EFI boot on
-x86_64. The x86 EFI code reserves all EFI boot services memory ranges
-via memblock_reserve() and frees them later via memblock_free_late()
-(efi_reserve_boot_services() and efi_free_boot_services(),
-respectively). If any of those ranges happen to fall within the deferred
-init range, the pages will not be released and that memory will be
-unavailable.
-
-For example, on an Amazon EC2 t3.micro VM (1 GB) booting via EFI:
-
-v6.2-rc2:
- # grep -E 'Node|spanned|present|managed' /proc/zoneinfo
- Node 0, zone DMA
- spanned 4095
- present 3999
- managed 3840
- Node 0, zone DMA32
- spanned 246652
- present 245868
- managed 178867
-
-v6.2-rc2 + patch:
- # grep -E 'Node|spanned|present|managed' /proc/zoneinfo
- Node 0, zone DMA
- spanned 4095
- present 3999
- managed 3840
- Node 0, zone DMA32
- spanned 246652
- present 245868
- managed 222816
-
-Fixes: 3a80a7fa7989 ("mm: meminit: initialise a subset of struct pages if CONFIG_DEFERRED_STRUCT_PAGE_INIT is set")
-Signed-off-by: Aaron Thompson <dev@aaront.org>
----
- mm/memblock.c | 8 +++++++-
- tools/testing/memblock/internal.h | 4 ++++
- 2 files changed, 11 insertions(+), 1 deletion(-)
-
-diff --git a/mm/memblock.c b/mm/memblock.c
-index 511d4783dcf1..fc3d8fbd2060 100644
---- a/mm/memblock.c
-+++ b/mm/memblock.c
-@@ -1640,7 +1640,13 @@ void __init memblock_free_late(phys_addr_t base, phys_addr_t size)
- end = PFN_DOWN(base + size);
-
- for (; cursor < end; cursor++) {
-- memblock_free_pages(pfn_to_page(cursor), cursor, 0);
-+ /*
-+ * Reserved pages are always initialized by the end of
-+ * memblock_free_all() (by memmap_init() and, if deferred
-+ * initialization is enabled, memmap_init_reserved_pages()), so
-+ * these pages can be released directly to the buddy allocator.
-+ */
-+ __free_pages_core(pfn_to_page(cursor), 0);
- totalram_pages_inc();
- }
- }
-diff --git a/tools/testing/memblock/internal.h b/tools/testing/memblock/internal.h
-index fdb7f5db7308..85973e55489e 100644
---- a/tools/testing/memblock/internal.h
-+++ b/tools/testing/memblock/internal.h
-@@ -15,6 +15,10 @@ bool mirrored_kernelcore = false;
-
- struct page {};
-
-+void __free_pages_core(struct page *page, unsigned int order)
-+{
-+}
-+
- void memblock_free_pages(struct page *page, unsigned long pfn,
- unsigned int order)
- {
---
+If CONFIG_DEFERRED_STRUCT_PAGE_INIT is enabled, memblock_free_pages()\r
+only releases pages to the buddy allocator if they are not in the\r
+deferred range. This is correct for free pages (as defined by\r
+for_each_free_mem_pfn_range_in_zone()) because free pages in the\r
+deferred range will be initialized and released as part of the deferred\r
+init process. memblock_free_pages() is called by memblock_free_late(),\r
+which is used to free reserved ranges after memblock_free_all() has\r
+run. All pages in reserved ranges have been initialized at that point,\r
+and accordingly, those pages are not touched by the deferred init\r
+process. This means that currently, if the pages that\r
+memblock_free_late() intends to release are in the deferred range, they\r
+will never be released to the buddy allocator. They will forever be\r
+reserved.\r
+\r
+In addition, memblock_free_pages() calls kmsan_memblock_free_pages(),\r
+which is also correct for free pages but is not correct for reserved\r
+pages. KMSAN metadata for reserved pages is initialized by\r
+kmsan_init_shadow(), which runs shortly before memblock_free_all().\r
+\r
+For both of these reasons, memblock_free_pages() should only be called\r
+for free pages, and memblock_free_late() should call __free_pages_core()\r
+directly instead.\r
+\r
+One case where this issue can occur in the wild is EFI boot on\r
+x86_64. The x86 EFI code reserves all EFI boot services memory ranges\r
+via memblock_reserve() and frees them later via memblock_free_late()\r
+(efi_reserve_boot_services() and efi_free_boot_services(),\r
+respectively). If any of those ranges happen to fall within the deferred\r
+init range, the pages will not be released and that memory will be\r
+unavailable.\r
+\r
+For example, on an Amazon EC2 t3.micro VM (1 GB) booting via EFI:\r
+\r
+v6.2-rc2:\r
+ # grep -E 'Node|spanned|present|managed' /proc/zoneinfo\r
+ Node 0, zone DMA\r
+ spanned 4095\r
+ present 3999\r
+ managed 3840\r
+ Node 0, zone DMA32\r
+ spanned 246652\r
+ present 245868\r
+ managed 178867\r
+\r
+v6.2-rc2 + patch:\r
+ # grep -E 'Node|spanned|present|managed' /proc/zoneinfo\r
+ Node 0, zone DMA\r
+ spanned 4095\r
+ present 3999\r
+ managed 3840\r
+ Node 0, zone DMA32\r
+ spanned 246652\r
+ present 245868\r
+ managed 222816\r
+\r
+Fixes: 3a80a7fa7989 ("mm: meminit: initialise a subset of struct pages if CONFIG_DEFERRED_STRUCT_PAGE_INIT is set")\r
+Signed-off-by: Aaron Thompson <dev@aaront.org>\r
+---\r
+ mm/memblock.c | 8 +++++++-\r
+ 2 files changed, 11 insertions(+), 1 deletion(-)\r
+\r
+diff --git a/mm/memblock.c b/mm/memblock.c\r
+index 511d4783dcf1..fc3d8fbd2060 100644\r
+--- a/mm/memblock.c\r
++++ b/mm/memblock.c\r
+@@ -1640,7 +1640,13 @@ void __init memblock_free_late(phys_addr_t base, phys_addr_t size)\r
+ end = PFN_DOWN(base + size);\r
+ \r
+ for (; cursor < end; cursor++) {\r
+- memblock_free_pages(pfn_to_page(cursor), cursor, 0);\r
++ /*\r
++ * Reserved pages are always initialized by the end of\r
++ * memblock_free_all() (by memmap_init() and, if deferred\r
++ * initialization is enabled, memmap_init_reserved_pages()), so\r
++ * these pages can be released directly to the buddy allocator.\r
++ */\r
++ __free_pages_core(pfn_to_page(cursor), 0);\r
+ totalram_pages_inc();\r
+ }\r
+ }\r
+-- \r
2.30.2
\ No newline at end of file
diff --git a/a/content_digest b/N1/content_digest
index 5e04e43..a23a996 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -5,38 +5,21 @@
"ref\00020230105041650.1485-1-dev\@aaront.org\0"
]
[
- "From\0Aaron Thompson <dev\@aaront.org>\0"
+ "From\0Xu Yu <xuyu\@linux.alibaba.com>\0"
]
[
"Subject\0[PATCH v2 1/1] mm: Always release pages to the buddy allocator in memblock_free_late().\0"
]
[
- "Date\0Thu, 5 Jan 2023 04:17:31 +0000\0"
+ "Date\0Mon, 30 Jan 2023 15:40:34 +0800\0"
]
[
- "To\0Mike Rapoport <rppt\@kernel.org>",
+ "To\0baolin.wang\@linux.alibaba.com",
+ " Mike Rapoport <rppt\@kernel.org>",
" linux-mm\@kvack.org\0"
]
[
- "Cc\0H. Peter Anvin <hpa\@zytor.com>",
- " Alexander Potapenko <glider\@google.com>",
- " Andrew Morton <akpm\@linux-foundation.org>",
- " Andy Shevchenko <andy\@infradead.org>",
- " Ard Biesheuvel <ardb\@kernel.org>",
- " Borislav Petkov <bp\@alien8.de>",
- " Darren Hart <dvhart\@infradead.org>",
- " Dave Hansen <dave.hansen\@linux.intel.com>",
- " David Rientjes <rientjes\@google.com>",
- " Dmitry Vyukov <dvyukov\@google.com>",
- " Ingo Molnar <mingo\@redhat.com>",
- " Marco Elver <elver\@google.com>",
- " Thomas Gleixner <tglx\@linutronix.de>",
- " kasan-dev\@googlegroups.com",
- " linux-efi\@vger.kernel.org",
- " linux-kernel\@vger.kernel.org",
- " platform-driver-x86\@vger.kernel.org",
- " x86\@kernel.org",
- " Aaron Thompson <dev\@aaront.org>\0"
+ "Cc\0alikernel-developer\@linux.alibaba.com\0"
]
[
"\0000:1\0"
@@ -45,104 +28,90 @@
"b\0"
]
[
- "If CONFIG_DEFERRED_STRUCT_PAGE_INIT is enabled, memblock_free_pages()\n",
- "only releases pages to the buddy allocator if they are not in the\n",
- "deferred range. This is correct for free pages (as defined by\n",
- "for_each_free_mem_pfn_range_in_zone()) because free pages in the\n",
- "deferred range will be initialized and released as part of the deferred\n",
- "init process. memblock_free_pages() is called by memblock_free_late(),\n",
- "which is used to free reserved ranges after memblock_free_all() has\n",
- "run. All pages in reserved ranges have been initialized at that point,\n",
- "and accordingly, those pages are not touched by the deferred init\n",
- "process. This means that currently, if the pages that\n",
- "memblock_free_late() intends to release are in the deferred range, they\n",
- "will never be released to the buddy allocator. They will forever be\n",
- "reserved.\n",
+ "From: Aaron Thompson <dev\@aaront.org>\r\n",
"\n",
- "In addition, memblock_free_pages() calls kmsan_memblock_free_pages(),\n",
- "which is also correct for free pages but is not correct for reserved\n",
- "pages. KMSAN metadata for reserved pages is initialized by\n",
- "kmsan_init_shadow(), which runs shortly before memblock_free_all().\n",
- "\n",
- "For both of these reasons, memblock_free_pages() should only be called\n",
- "for free pages, and memblock_free_late() should call __free_pages_core()\n",
- "directly instead.\n",
- "\n",
- "One case where this issue can occur in the wild is EFI boot on\n",
- "x86_64. The x86 EFI code reserves all EFI boot services memory ranges\n",
- "via memblock_reserve() and frees them later via memblock_free_late()\n",
- "(efi_reserve_boot_services() and efi_free_boot_services(),\n",
- "respectively). If any of those ranges happen to fall within the deferred\n",
- "init range, the pages will not be released and that memory will be\n",
- "unavailable.\n",
- "\n",
- "For example, on an Amazon EC2 t3.micro VM (1 GB) booting via EFI:\n",
- "\n",
- "v6.2-rc2:\n",
- " # grep -E 'Node|spanned|present|managed' /proc/zoneinfo\n",
- " Node 0, zone DMA\n",
- " spanned 4095\n",
- " present 3999\n",
- " managed 3840\n",
- " Node 0, zone DMA32\n",
- " spanned 246652\n",
- " present 245868\n",
- " managed 178867\n",
- "\n",
- "v6.2-rc2 + patch:\n",
- " # grep -E 'Node|spanned|present|managed' /proc/zoneinfo\n",
- " Node 0, zone DMA\n",
- " spanned 4095\n",
- " present 3999\n",
- " managed 3840\n",
- " Node 0, zone DMA32\n",
- " spanned 246652\n",
- " present 245868\n",
- " managed 222816\n",
- "\n",
- "Fixes: 3a80a7fa7989 (\"mm: meminit: initialise a subset of struct pages if CONFIG_DEFERRED_STRUCT_PAGE_INIT is set\")\n",
- "Signed-off-by: Aaron Thompson <dev\@aaront.org>\n",
- "---\n",
- " mm/memblock.c | 8 +++++++-\n",
- " tools/testing/memblock/internal.h | 4 ++++\n",
- " 2 files changed, 11 insertions(+), 1 deletion(-)\n",
- "\n",
- "diff --git a/mm/memblock.c b/mm/memblock.c\n",
- "index 511d4783dcf1..fc3d8fbd2060 100644\n",
- "--- a/mm/memblock.c\n",
- "+++ b/mm/memblock.c\n",
- "\@\@ -1640,7 +1640,13 \@\@ void __init memblock_free_late(phys_addr_t base, phys_addr_t size)\n",
- " \tend = PFN_DOWN(base + size);\n",
- " \n",
- " \tfor (; cursor < end; cursor++) {\n",
- "-\t\tmemblock_free_pages(pfn_to_page(cursor), cursor, 0);\n",
- "+\t\t/*\n",
- "+\t\t * Reserved pages are always initialized by the end of\n",
- "+\t\t * memblock_free_all() (by memmap_init() and, if deferred\n",
- "+\t\t * initialization is enabled, memmap_init_reserved_pages()), so\n",
- "+\t\t * these pages can be released directly to the buddy allocator.\n",
- "+\t\t */\n",
- "+\t\t__free_pages_core(pfn_to_page(cursor), 0);\n",
- " \t\ttotalram_pages_inc();\n",
- " \t}\n",
- " }\n",
- "diff --git a/tools/testing/memblock/internal.h b/tools/testing/memblock/internal.h\n",
- "index fdb7f5db7308..85973e55489e 100644\n",
- "--- a/tools/testing/memblock/internal.h\n",
- "+++ b/tools/testing/memblock/internal.h\n",
- "\@\@ -15,6 +15,10 \@\@ bool mirrored_kernelcore = false;\n",
- " \n",
- " struct page {};\n",
- " \n",
- "+void __free_pages_core(struct page *page, unsigned int order)\n",
- "+{\n",
- "+}\n",
- "+\n",
- " void memblock_free_pages(struct page *page, unsigned long pfn,\n",
- " \t\t\t unsigned int order)\n",
- " {\n",
- "-- \n",
+ "If CONFIG_DEFERRED_STRUCT_PAGE_INIT is enabled, memblock_free_pages()\r\n",
+ "only releases pages to the buddy allocator if they are not in the\r\n",
+ "deferred range. This is correct for free pages (as defined by\r\n",
+ "for_each_free_mem_pfn_range_in_zone()) because free pages in the\r\n",
+ "deferred range will be initialized and released as part of the deferred\r\n",
+ "init process. memblock_free_pages() is called by memblock_free_late(),\r\n",
+ "which is used to free reserved ranges after memblock_free_all() has\r\n",
+ "run. All pages in reserved ranges have been initialized at that point,\r\n",
+ "and accordingly, those pages are not touched by the deferred init\r\n",
+ "process. This means that currently, if the pages that\r\n",
+ "memblock_free_late() intends to release are in the deferred range, they\r\n",
+ "will never be released to the buddy allocator. They will forever be\r\n",
+ "reserved.\r\n",
+ "\r\n",
+ "In addition, memblock_free_pages() calls kmsan_memblock_free_pages(),\r\n",
+ "which is also correct for free pages but is not correct for reserved\r\n",
+ "pages. KMSAN metadata for reserved pages is initialized by\r\n",
+ "kmsan_init_shadow(), which runs shortly before memblock_free_all().\r\n",
+ "\r\n",
+ "For both of these reasons, memblock_free_pages() should only be called\r\n",
+ "for free pages, and memblock_free_late() should call __free_pages_core()\r\n",
+ "directly instead.\r\n",
+ "\r\n",
+ "One case where this issue can occur in the wild is EFI boot on\r\n",
+ "x86_64. The x86 EFI code reserves all EFI boot services memory ranges\r\n",
+ "via memblock_reserve() and frees them later via memblock_free_late()\r\n",
+ "(efi_reserve_boot_services() and efi_free_boot_services(),\r\n",
+ "respectively). If any of those ranges happen to fall within the deferred\r\n",
+ "init range, the pages will not be released and that memory will be\r\n",
+ "unavailable.\r\n",
+ "\r\n",
+ "For example, on an Amazon EC2 t3.micro VM (1 GB) booting via EFI:\r\n",
+ "\r\n",
+ "v6.2-rc2:\r\n",
+ " # grep -E 'Node|spanned|present|managed' /proc/zoneinfo\r\n",
+ " Node 0, zone DMA\r\n",
+ " spanned 4095\r\n",
+ " present 3999\r\n",
+ " managed 3840\r\n",
+ " Node 0, zone DMA32\r\n",
+ " spanned 246652\r\n",
+ " present 245868\r\n",
+ " managed 178867\r\n",
+ "\r\n",
+ "v6.2-rc2 + patch:\r\n",
+ " # grep -E 'Node|spanned|present|managed' /proc/zoneinfo\r\n",
+ " Node 0, zone DMA\r\n",
+ " spanned 4095\r\n",
+ " present 3999\r\n",
+ " managed 3840\r\n",
+ " Node 0, zone DMA32\r\n",
+ " spanned 246652\r\n",
+ " present 245868\r\n",
+ " managed 222816\r\n",
+ "\r\n",
+ "Fixes: 3a80a7fa7989 (\"mm: meminit: initialise a subset of struct pages if CONFIG_DEFERRED_STRUCT_PAGE_INIT is set\")\r\n",
+ "Signed-off-by: Aaron Thompson <dev\@aaront.org>\r\n",
+ "---\r\n",
+ " mm/memblock.c | 8 +++++++-\r\n",
+ " 2 files changed, 11 insertions(+), 1 deletion(-)\r\n",
+ "\r\n",
+ "diff --git a/mm/memblock.c b/mm/memblock.c\r\n",
+ "index 511d4783dcf1..fc3d8fbd2060 100644\r\n",
+ "--- a/mm/memblock.c\r\n",
+ "+++ b/mm/memblock.c\r\n",
+ "\@\@ -1640,7 +1640,13 \@\@ void __init memblock_free_late(phys_addr_t base, phys_addr_t size)\r\n",
+ " \tend = PFN_DOWN(base + size);\r\n",
+ " \r\n",
+ " \tfor (; cursor < end; cursor++) {\r\n",
+ "-\t\tmemblock_free_pages(pfn_to_page(cursor), cursor, 0);\r\n",
+ "+\t\t/*\r\n",
+ "+\t\t * Reserved pages are always initialized by the end of\r\n",
+ "+\t\t * memblock_free_all() (by memmap_init() and, if deferred\r\n",
+ "+\t\t * initialization is enabled, memmap_init_reserved_pages()), so\r\n",
+ "+\t\t * these pages can be released directly to the buddy allocator.\r\n",
+ "+\t\t */\r\n",
+ "+\t\t__free_pages_core(pfn_to_page(cursor), 0);\r\n",
+ " \t\ttotalram_pages_inc();\r\n",
+ " \t}\r\n",
+ " }\r\n",
+ "-- \r\n",
"2.30.2"
]
-3fef11ead3eb36e428a62229c5822fa16f066ec266873d645d6c3d63f0b37612
+1839eaf5c6acecf63baa18ed76b329dfde4a7b5ae767e2f36c57ac8e050b089b
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.