Re: [PATCH] mm: avoid use of BIT() macro for initialising VMA flags

From: Lorenzo Stoakes

Date: Fri Dec 12 2025 - 10:04:21 EST


On Fri, Dec 12, 2025 at 01:24:57PM +0100, Mateusz Guzik wrote:
> So I had a look where the timing difference is coming from and I think
> I have the answer: init_ipc_ns does not have a guaranteed cacheline
> placement and things get moved around with the patch.
>
> On my kernels (nm vmlinux-newbits | sort -nk 1 | less)
>
> before:
> ffffffff839ffb60 T init_ipc_ns
> ffffffff83a00020 t event_exit__msgrcv
>
> after:
> ffffffff839ffbc0 T init_ipc_ns
> ffffffff83a00080 t event_exit__msgrcv
>
> This is the pervasive problem of vars from all .o files placed
> adjacent to each other, meaning changes in one .o file result in
> offsets changing in other files and then you get performance
> fluctuations as not-explicitly-padded variables share (or no longer
> share) cachelines.
>
> I brought this up a year ago elsewhere:
> https://gcc.gnu.org/pipermail/gcc/2024-October/245004.html
>
> maybe i should pick it up again and see it through
>
> as for the thing at hand, someone(tm) will want to make sure the
> namespace is cacheline aligned and possibly pad its own internals
> afterwards. Personally I can't be bothered.

Thanks! Looking it seems we accumulate a bunch of offsets in:

print_fmt_dax_pte_fault_class
print_fmt_dax_pmd_load_hole_class
print_fmt_dax_pmd_fault_class

(entries that the bloat-o-meter confirms changed in size)

That continue on to eventually offset init_ipc_ns.

It actually looked in my testing like performance _improved_ with the change,
and I notice locally I end up aligned on the struct:

ffffffff82be16a0 T init_ipc_ns

->

ffffffff82be1700 T init_ipc_ns

Examining stress-ng before 2b6a3f061f11:

Command is:
$ stress-ng --timeout 60 --times --verify --metrics --no-rand-seed --msg $(nproc)

Results:

stress-ng: metrc: [1662] stressor bogo ops real time usr time sys time bogo ops/s bogo ops/s CPU used per RSS Max

stress-ng: metrc: [776] msg 964459758 60.00 154.63 632.77 16073484.12 1224879.38 21.17 2132

After 2b6a3f061f11:

stress-ng: metrc: [782] msg 1326214608 60.00 194.19 713.34 22102974.72 1461348.11 24.40 2140

And if I simply do:

ipc/msgutil.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ipc/msgutil.c b/ipc/msgutil.c
index 7a03f6d03de3..df0d7a067bcf 100644
--- a/ipc/msgutil.c
+++ b/ipc/msgutil.c
@@ -26,7 +26,7 @@ DEFINE_SPINLOCK(mq_lock);
* compiled when either CONFIG_SYSVIPC and CONFIG_POSIX_MQUEUE
* and not CONFIG_IPC_NS.
*/
-struct ipc_namespace init_ipc_ns = {
+struct ipc_namespace init_ipc_ns ____cacheline_aligned_in_smp = {
.ns.__ns_ref = REFCOUNT_INIT(1),
.user_ns = &init_user_ns,
.ns.inum = ns_init_inum(&init_ipc_ns),
--
2.52.0

We observe:

stress-ng: metrc: [764] msg 1321700290 60.00 196.73 723.82 22028700.93 1435779.72 24.75 2116 aligned

So this really _does_ look like an alignment issue.

So I think I should just submit the above patch right? Can you see how it behaves for you?

Cheers, Lorenzo