Messages in this thread |  | | Date | Tue, 9 Dec 2025 09:28:10 +0100 | | Subject | Re: [PATCH] mm: avoid use of BIT() macro for initialising VMA flags | | From | Vlastimil Babka <> |
| |
On 12/8/25 17:42, Lorenzo Stoakes wrote: > On Sat, Dec 06, 2025 at 04:43:57PM +0000, Lorenzo Stoakes wrote: >> On Fri, Dec 05, 2025 at 09:34:49PM +0000, David Laight wrote: >> > On Fri, 5 Dec 2025 19:18:56 +0000 >> > Lorenzo Stoakes <lorenzo.stoakes@oracle.com> wrote: >> > >> > > On Fri, Dec 05, 2025 at 06:43:42PM +0000, David Laight wrote: >> > > > On Fri, 5 Dec 2025 17:50:37 +0000 >> > > > Lorenzo Stoakes <lorenzo.stoakes@oracle.com> wrote: >> > > > >> > > > > Commit 2b6a3f061f11 ("mm: declare VMA flags by bit") significantly changed >> > > > > how VMA flags are declared, utilising an enum of VMA bit values and >> > > > > ifdef-fery VM_xxx flag declarations via macro. >> > > > > >> > > > > As part of this change, it uses INIT_VM_FLAG() to define VM_xxx flags from >> > > > > the newly introduced VMA bit numbers. >> > > > > >> > > > > However, use of this macro results in apparently unfortunate macro >> > > > > expansion and resulted in a performance degradation.This appears to be due >> > > > > to the (__force int), which is required for the sparse typechecking to >> > > > > work. >> > > > >> > > > Does sparse complain if you just add 0? As in: >> > > > #define INIT_VM_FLAG(name) BIT(VMA_ ## name ## _BIT + 0u) >> > > > >> > > > That should change the type without affecting what BIT() expands to. >> > > >> > > Thanks, checked that and unfortunately that doesn't satisfy sparse :) >> > > >> > > I don't think it's too crazy to use 1UL << here, just very frustrating (TM) >> > > that this is an issue. >> > >> > I might use some of my copious spare time (ha) to see why BIT() fails. >> > I bet it is just too complex for its own good. >> > Personally I'm fine with both explicit (1ul << n) and hex constants. >> > The latter are definitely most useful if you ever look at hexdumps. >> >> Thanks :) yeah I just didn't want to go down that rabbit hole myself as I seemed >> to have the answer and wanted to get it fixed, but obviously am quite curious as >> to what on earth is causing that. > > I did wonder about _calc_vm_trans(), given the 'interesting' stuff it does.
It's unlikely that this affects anything in what the benchmark stresses. As Mateusz pointed out off-list, the profiles look like mutexes are doing less optimistic spinning and more sleeping. Which IMHO isn't something that this change can directly affect.
My own bloat-o-meter test before/after the fix suggests no changed code generation (as I would indeed expect):
At least in my case it doesn't seem to be altering the generated code (and I would expect it wouldn't) except some weird symbols that don't look related at all:
> ./scripts/bloat-o-meter vmlinux.o vmlinux.o.after add/remove: 0/0 grow/shrink: 0/7 up/down: 0/-277 (-277) Function old new delta print_fmt_dax_pte_fault_class 1167 1160 -7 print_fmt_dax_pmd_load_hole_class 308 301 -7 print_fmt_dax_pmd_fault_class 1252 1245 -7 saved_rsp 3117296 3117232 -64 saved_rdi 3117312 3117248 -64 saved_rbx 3117304 3117240 -64 saved_rbp 3117328 3117264 -64 Total: Before=3350750464, After=3350750187, chg -0.00%
I don't know what happened to those functions above. Could be just insufficient build reproducibility? Maybe the effect is just that something slightly shifts in the cpu caches?
|  |