Thread (26 messages) flat view 26 messages, 6 authors, 2020-11-10

Re: [PATCH v2 3/4] arm64: mm: make vmemmap region a projection of the linear region

From: Catalin Marinas <catalin.marinas@arm.com>
Date: 2020-11-10 16:15:19

On Tue, Nov 10, 2020 at 04:42:53PM +0100, Ard Biesheuvel wrote:
On Tue, 10 Nov 2020 at 16:39, Catalin Marinas [off-list ref] wrote:
quoted
On Tue, Nov 10, 2020 at 03:08:45PM +0100, Ard Biesheuvel wrote:
quoted
On Tue, 10 Nov 2020 at 14:10, Ard Biesheuvel [off-list ref] wrote:
quoted
On Tue, 10 Nov 2020 at 13:55, Geert Uytterhoeven [off-list ref] wrote:
quoted
On Thu, Oct 8, 2020 at 5:43 PM Ard Biesheuvel [off-list ref] wrote:
quoted
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -504,6 +504,8 @@ static void __init free_unused_memmap(void)
  */
 void __init mem_init(void)
 {
+       BUILD_BUG_ON(!is_power_of_2(sizeof(struct page)));
This check is triggering for me.

If CONFIG_MEMCG=n, sizeof(struct page) = 56.

If CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y, this is mitigated by
the explicit alignment:

    #ifdef CONFIG_HAVE_ALIGNED_STRUCT_PAGE
    #define _struct_page_alignment  __aligned(2 * sizeof(unsigned long))
    #else
    #define _struct_page_alignment
    #endif

    struct page { ... } _struct_page_alignment;

However, HAVE_ALIGNED_STRUCT_PAGE is selected only if SLUB,
while my .config is using SLAB.
Thanks for the report. I will look into this.
OK, so we can obviously fix this easily by setting
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y unconditionally instead of only 'if
SLUB'. The question is whether that is likely to lead to any
performance regressions.
I'm not sure I understand. The mem_init() bug triggers if sizeof(struct
page) is not a power of 2. HAVE_ALIGNED_STRUCT_PAGE forces the page
alignment to 16 bytes but, for example, a 48-byte structure is not a
power of 2.
True, but looking at include/linux/mm_types.h, I don't see how that
would happen.
Not with 48 and probably won't ever go beyond 64 for "production"
builds. But say someone wants to experiment with some debug data in
struct page and adds a long. The structure (I think 64 now with MEMCG=y)
becomes 72, force-aligned to 80. That triggers the build-bug.

Anyway, I don't mind the forced alignment, only that the build-bug you
added has a different requirement than what HAVE_ALIGNED_STRUCT_PAGE
provides (power of 2 vs 16-byte aligned).

AFAICT, VMEMMAP_START is a compile-time value, PAGE_OFFSET is also
compile-time, so can we not revert to the original virt_to_page and
page_to_virt macros? They'd not be as efficient but it may not matter
much (and if the struct size is a power of 2, the compiler should change
the division/multiplication by shifts).

-- 
Catalin

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help