]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commit - arch/x86/kernel/cpu/common.c
x86/cpu: Align cpu_caps_cleared and cpu_caps_set to unsigned long
authorFenghua Yu <fenghua.yu@intel.com>
Mon, 16 Sep 2019 22:39:56 +0000 (15:39 -0700)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 15 Nov 2019 19:20:32 +0000 (20:20 +0100)
commitf6a892ddd53e555362dbf64d31b47fde0f550ec4
tree52215f9d0d018c31218aeed44ea3e12bc257f323
parent9774a96f785bf0fa6d956ce33300463f1704dbeb
x86/cpu: Align cpu_caps_cleared and cpu_caps_set to unsigned long

cpu_caps_cleared[] and cpu_caps_set[] are arrays of type u32 and therefore
naturally aligned to 4 bytes, which is also unsigned long aligned on
32-bit, but not on 64-bit.

The array pointer is handed into atomic bit operations. If the access not
aligned to unsigned long then the atomic bit operations can end up crossing
a cache line boundary, which causes the CPU to do a full bus lock as it
can't lock both cache lines at once. The bus lock operation is heavy weight
and can cause severe performance degradation.

The upcoming #AC split lock detection mechanism will issue warnings for
this kind of access.

Force the alignment of these arrays to unsigned long. This avoids the
massive code changes which would be required when converting the array data
type to unsigned long.

[ tglx: Rewrote changelog ]

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20190916223958.27048-2-tony.luck@intel.com
arch/x86/kernel/cpu/common.c