On Wed, Nov 20, 2024 at 04:33:37PM -0800, Suren Baghdasaryan wrote: [...] > > > > > > > > Do we just want 'struct vm_area_struct' to be cacheline aligned or do we > > > > want 'struct vma_lock vm_lock' to be on a separate cacheline as well? > > > > > > We want both to minimize cacheline sharing. > > > > > > > For later, you will need to add a pad after vm_lock as well, so any > > future addition will not share the cacheline with vm_lock. I would do > > something like below. This is a nit and can be done later. > > > > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > > index 7654c766cbe2..5cc4fff163a0 100644 > > --- a/include/linux/mm_types.h > > +++ b/include/linux/mm_types.h > > @@ -751,10 +751,12 @@ struct vm_area_struct { > > #endif > > struct vm_userfaultfd_ctx vm_userfaultfd_ctx; > > #ifdef CONFIG_PER_VMA_LOCK > > + CACHELINE_PADDING(__pad1__); > > /* Unstable RCU readers are allowed to read this. */ > > - struct vma_lock vm_lock ____cacheline_aligned_in_smp; > > + struct vma_lock vm_lock; > > + CACHELINE_PADDING(__pad2__); > > #endif > > -} __randomize_layout; > > +} __randomize_layout ____cacheline_aligned_in_smp; > > I thought SLAB_HWCACHE_ALIGN for vm_area_cachep added in this patch > would have the same result, no? > SLAB_HWCACHE_ALIGN is more about the slub allocator allocating cache aligned memory. It does not say anything about the internals of the struct for which the kmem_cache is being created. The ____cacheline_aligned_in_smp tag in your patch made sure that the field vm_lock will be put in a new cacheline and there can be a hole between vm_lock and the previous field if the previous field is not ending at the cacheline boundary. Please note that if you add a new field after vm_lock (without cacheline alignment tag), it will be on the same cacheline as vm_lock. So, your code is achieving the vm_lock on its own cacheline goal but vm_lock being the only field on that cacheline is not being achieved.