On 5/14/21 2:57 AM, Matthew Wilcox wrote: > On Thu, May 13, 2021 at 10:29:49AM -0700, Randy Dunlap wrote: >> On 5/12/21 10:44 PM, Stephen Rothwell wrote: >>> Hi all, >>> >>> Changes since 20210512: >>> >> >> on x86_64: >> >> In function ‘__mm_zero_struct_page.isra.75’, >> inlined from ‘__init_single_page.isra.76’ at ../mm/page_alloc.c:1494:2: >> ./../include/linux/compiler_types.h:328:38: error: call to ‘__compiletime_assert_162’ declared with attribute error: BUILD_BUG_ON failed: sizeof(struct page) > 80 > > Hmm. > > struct { > long unsigned int _pt_pad_1; /* 8 8 */ > pgtable_t pmd_huge_pte; /* 16 8 */ > long unsigned int _pt_pad_2; /* 24 8 */ > union { > struct mm_struct * pt_mm; /* 32 8 */ > atomic_t pt_frag_refcount; /* 32 4 */ > }; /* 32 8 */ > spinlock_t ptl; /* 40 72 */ > }; /* 8 104 */ > > #if ALLOC_SPLIT_PTLOCKS > spinlock_t *ptl; > #else > spinlock_t ptl; > #endif > > something has disabled ALLOC_SPLIT_PTLOCKS when it ought to be enabled. > > #if USE_SPLIT_PTE_PTLOCKS > #define ALLOC_SPLIT_PTLOCKS (SPINLOCK_SIZE > BITS_PER_LONG/8) > #else > #define ALLOC_SPLIT_PTLOCKS 0 > #endif > > Oh. This is Anshuman's fault. > > commit 9b8a39056e2472592a5e5897987387f43038b8ba > Author: Anshuman Khandual <anshuman.khandual@xxxxxxx> > Date: Tue May 11 15:06:01 2021 +1000 > > mm/thp: make ALLOC_SPLIT_PTLOCKS dependent on USE_SPLIT_PTE_PTLOCKS > > Previously ALLOC_SPLIT_PTLOCKS was evaluated and the spin lock element in struct page was getting created independent of whether split pte locks are being used or not. AFAICS without USE_SPLIT_PTE_PTLOCKS, it does not really matter whether struct page has spinlock_t *ptl or ptl element because that is not going to be used. Should the BUILD_BUG_ON() evaluation be changed when USE_SPLIT_PTE_PTLOCKS is not enabled or we could something like this which drops the ptl element in such cases ? --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -152,11 +152,13 @@ struct page { struct mm_struct *pt_mm; /* x86 pgds only */ atomic_t pt_frag_refcount; /* powerpc */ }; +#if USE_SPLIT_PTE_PTLOCKS #if ALLOC_SPLIT_PTLOCKS spinlock_t *ptl; #else spinlock_t ptl; #endif +#endif }; struct { /* ZONE_DEVICE pages */ /** @pgmap: Points to the hosting device page map. */