On 12.08.25 17:44, Lorenzo Stoakes wrote:
There is an issue with the mask declarations in linux/mm_types.h, which naively do (1 << bit) operations. Unfortunately this results in the 1 being defaulted as a signed (32-bit) integer. When the compiler expands the MMF_INIT_MASK bitmask it comes up with: (((1 << 2) - 1) | (((1 << 9) - 1) << 2) | (1 << 24) | (1 << 28) | (1 << 30) | (1 << 31)) Which overflows the signed integer to -788,527,105. Implicitly casting this to an unsigned integer results in sign-expansion, and thus this value becomes 0xffffffffd10007ff, rather than the intended 0xd10007ff. While we're limited to a maximum of 32 bits in mm->flags, this isn't an issue as the remaining bits being masked will always be zero. However, now we are moving towards having more bits in this flag, this becomes an issue. Simply resolve this by using the _BITUL() helper to cast the shifted value to an unsigned long.
Hmm, I thought BIT() should be used and would just fine? include/linux/bits.h includes <vdso/bits.h> where we have #define BIT(nr) (UL(1) << (nr)) In contrast, _BITUL is a uapi thingy from include/uapi/linux/const.h ... as it seems. $ git grep "_BITUL" -- include/linux/ include/linux/mm_types.h:#define MMF_DUMPABLE_MASK (_BITUL(MMF_DUMPABLE_BITS) - 1) include/linux/mm_types.h: ((_BITUL(MMF_DUMP_FILTER_BITS) - 1) << MMF_DUMP_FILTER_SHIFT) include/linux/mm_types.h: (_BITUL(MMF_DUMP_ANON_PRIVATE) | _BITUL(MMF_DUMP_ANON_SHARED) | \ include/linux/mm_types.h: _BITUL(MMF_DUMP_HUGETLB_PRIVATE) | MMF_DUMP_MASK_DEFAULT_ELF) include/linux/mm_types.h:# define MMF_DUMP_MASK_DEFAULT_ELF _BITUL(MMF_DUMP_ELF_HEADERS) include/linux/mm_types.h:#define MMF_DISABLE_THP_MASK (_BITUL(MMF_DISABLE_THP_COMPLETELY) | \ include/linux/mm_types.h: _BITUL(MMF_DISABLE_THP_EXCEPT_ADVISED)) include/linux/mm_types.h:#define MMF_HAS_MDWE_MASK _BITUL(MMF_HAS_MDWE) include/linux/mm_types.h:#define MMF_VM_MERGE_ANY_MASK _BITUL(MMF_VM_MERGE_ANY) include/linux/mm_types.h:#define MMF_TOPDOWN_MASK _BITUL(MMF_TOPDOWN) Oh, hey, it's only your changes :P We should better just be using BIT(). -- Cheers David / dhildenb