[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <alpine.DEB.2.21.1806300803121.1595@nanos.tec.linutronix.de>
Date: Sat, 30 Jun 2018 08:23:59 +0200 (CEST)
From: Thomas Gleixner <tglx@...utronix.de>
To: Fenghua Yu <fenghua.yu@...el.com>
cc: Dave Hansen <dave.hansen@...el.com>,
Ingo Molnar <mingo@...hat.com>, H Peter Anvin <hpa@...or.com>,
Ashok Raj <ashok.raj@...el.com>,
Alan Cox <alan@...ux.intel.com>,
Peter Zijlstra <peterz@...radead.org>,
Rafael Wysocki <rafael.j.wysocki@...el.com>,
Tony Luck <tony.luck@...el.com>,
Ravi V Shankar <ravi.v.shankar@...el.com>,
linux-kernel <linux-kernel@...r.kernel.org>, x86 <x86@...nel.org>
Subject: Re: [PATCH v2 2/4] x86/split_lock: Align x86_capability to unsigned
long to avoid split locked access
On Fri, 29 Jun 2018, Fenghua Yu wrote:
> On Fri, Jun 29, 2018 at 05:00:51PM -0700, Fenghua Yu wrote:
> diff --git a/arch/x86/boot/cpuflags.h b/arch/x86/boot/cpuflags.h
> index 2e20814d3ce3..29de0ff74351 100644
> --- a/arch/x86/boot/cpuflags.h
> +++ b/arch/x86/boot/cpuflags.h
> @@ -9,7 +9,7 @@ struct cpu_features {
> int level; /* Family, or 64 for x86-64 */
> int family; /* Family, always */
> int model;
> - u32 flags[NCAPINTS];
> + u32 flags[NCAPINTS] __aligned(sizeof(unsigned long));
Lacks a comment WHY this needs the aligned() as Dave already said.
> };
>
> extern struct cpu_features cpu;
> diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
> index 8c7b3e5a2d01..444a2275c1f8 100644
> --- a/arch/x86/include/asm/mce.h
> +++ b/arch/x86/include/asm/mce.h
> @@ -133,7 +133,7 @@ struct mce_log_buffer {
> char signature[12]; /* "MACHINECHECK" */
> unsigned len; /* = MCE_LOG_LEN */
> unsigned next;
> - unsigned flags;
> + unsigned flags __aligned(sizeof(unsigned long));
And whats wrong with just making that flags field unsigned long and move it
behind recordlen?
flags is at offset 20 so forcing alignement puts it at offset 24 creating a
4 byte hole. While reordering it and making it type unsigned long just
fills the already existing hole and just works w/o the stray aligned()
struct mce_log_buffer {
char signature[12]; /* 0 12 */
unsigned int len; /* 12 4 */
unsigned int next; /* 16 4 */
unsigned int flags; /* 20 4 */
unsigned int recordlen; /* 24 4 */
/* XXX 4 bytes hole, try to pack */
struct mce entry[32]; /* 32 3840 */
The point is, that there is no requirement that flags is unsigned int,
while the u32 type for the capability array has a reason.
So you need to analyse first whether the data type is required or can be
changed to unsigned long which is the right thing to do.
See?
Thanks,
tglx
Powered by blists - more mailing lists