From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
Ingo Molnar <mingo@elte.hu>
Subject: [patch 18/24] x86/i386: Make sure stack-protector segment base is cache aligned
Date: Wed, 16 Sep 2009 15:28:37 -0700 [thread overview]
Message-ID: <20090916222903.695585319@mini.kroah.org> (raw)
In-Reply-To: <20090916222934.GA31846@kroah.com>
[-- Attachment #1: x86-i386-make-sure-stack-protector-segment-base-is-cache-aligned.patch --]
[-- Type: text/plain, Size: 4076 bytes --]
2.6.30-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jeremy Fitzhardinge <jeremy@goop.org>
commit 1ea0d14e480c245683927eecc03a70faf06e80c8 upstream.
The Intel Optimization Reference Guide says:
In Intel Atom microarchitecture, the address generation unit
assumes that the segment base will be 0 by default. Non-zero
segment base will cause load and store operations to experience
a delay.
- If the segment base isn't aligned to a cache line
boundary, the max throughput of memory operations is
reduced to one [e]very 9 cycles.
[...]
Assembly/Compiler Coding Rule 15. (H impact, ML generality)
For Intel Atom processors, use segments with base set to 0
whenever possible; avoid non-zero segment base address that is
not aligned to cache line boundary at all cost.
We can't avoid having a non-zero base for the stack-protector
segment, but we can make it cache-aligned.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
LKML-Reference: <4AA01893.6000507@goop.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/x86/include/asm/processor.h | 12 +++++++++++-
arch/x86/include/asm/stackprotector.h | 4 ++--
arch/x86/include/asm/system.h | 2 +-
arch/x86/kernel/cpu/common.c | 2 +-
arch/x86/kernel/head_32.S | 1 -
5 files changed, 15 insertions(+), 6 deletions(-)
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -402,7 +402,17 @@ extern unsigned long kernel_eflags;
extern asmlinkage void ignore_sysret(void);
#else /* X86_64 */
#ifdef CONFIG_CC_STACKPROTECTOR
-DECLARE_PER_CPU(unsigned long, stack_canary);
+/*
+ * Make sure stack canary segment base is cached-aligned:
+ * "For Intel Atom processors, avoid non zero segment base address
+ * that is not aligned to cache line boundary at all cost."
+ * (Optim Ref Manual Assembly/Compiler Coding Rule 15.)
+ */
+struct stack_canary {
+ char __pad[20]; /* canary at %gs:20 */
+ unsigned long canary;
+};
+DECLARE_PER_CPU(struct stack_canary, stack_canary) ____cacheline_aligned;
#endif
#endif /* X86_64 */
--- a/arch/x86/include/asm/stackprotector.h
+++ b/arch/x86/include/asm/stackprotector.h
@@ -78,14 +78,14 @@ static __always_inline void boot_init_st
#ifdef CONFIG_X86_64
percpu_write(irq_stack_union.stack_canary, canary);
#else
- percpu_write(stack_canary, canary);
+ percpu_write(stack_canary.canary, canary);
#endif
}
static inline void setup_stack_canary_segment(int cpu)
{
#ifdef CONFIG_X86_32
- unsigned long canary = (unsigned long)&per_cpu(stack_canary, cpu) - 20;
+ unsigned long canary = (unsigned long)&per_cpu(stack_canary, cpu);
struct desc_struct *gdt_table = get_cpu_gdt_table(cpu);
struct desc_struct desc;
--- a/arch/x86/include/asm/system.h
+++ b/arch/x86/include/asm/system.h
@@ -31,7 +31,7 @@ void __switch_to_xtra(struct task_struct
"movl %P[task_canary](%[next]), %%ebx\n\t" \
"movl %%ebx, "__percpu_arg([stack_canary])"\n\t"
#define __switch_canary_oparam \
- , [stack_canary] "=m" (per_cpu_var(stack_canary))
+ , [stack_canary] "=m" (per_cpu_var(stack_canary.canary))
#define __switch_canary_iparam \
, [task_canary] "i" (offsetof(struct task_struct, stack_canary))
#else /* CC_STACKPROTECTOR */
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1033,7 +1033,7 @@ DEFINE_PER_CPU(struct orig_ist, orig_ist
#else /* CONFIG_X86_64 */
#ifdef CONFIG_CC_STACKPROTECTOR
-DEFINE_PER_CPU(unsigned long, stack_canary);
+DEFINE_PER_CPU(struct stack_canary, stack_canary) ____cacheline_aligned;
#endif
/* Make sure %fs and %gs are initialized properly in idle threads */
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -442,7 +442,6 @@ is386: movl $2,%ecx # set MP
jne 1f
movl $per_cpu__gdt_page,%eax
movl $per_cpu__stack_canary,%ecx
- subl $20, %ecx
movw %cx, 8 * GDT_ENTRY_STACK_CANARY + 2(%eax)
shrl $16, %ecx
movb %cl, 8 * GDT_ENTRY_STACK_CANARY + 4(%eax)
next prev parent reply other threads:[~2009-09-16 22:33 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090916222819.244332644@mini.kroah.org>
2009-09-16 22:29 ` [patch 00/24] 2.6.30.8-stable review Greg KH
2009-09-16 22:28 ` [patch 01/24] Input: joydev - decouple axis and button map ioctls from input constants Greg KH
2009-09-16 22:28 ` [patch 02/24] [SCSI] sg: fix oops in the error path in sg_build_indirect() Greg KH
2009-09-16 22:28 ` [patch 03/24] agp/intel: remove restore in resume Greg KH
2009-09-16 22:28 ` [patch 04/24] ath5k: write PCU registers on initial reset Greg KH
2009-09-16 22:28 ` [patch 05/24] binfmt_elf: fix PT_INTERP bss handling Greg KH
2009-09-16 22:28 ` [patch 06/24] cfg80211: fix looping soft lockup in find_ie() Greg KH
2009-09-16 22:28 ` [patch 07/24] fix undefined reference to user_shm_unlock Greg KH
2009-09-16 22:28 ` [patch 08/24] powerpc/ps3: Workaround for flash memory I/O error Greg KH
2009-09-16 22:28 ` [patch 09/24] TPM: Fixup boot probe timeout for tpm_tis driver Greg KH
2009-09-16 22:28 ` [patch 10/24] udf: Use device size when drive reported bogus number of written blocks Greg KH
2009-09-16 22:28 ` [patch 11/24] ALSA: cs46xx - Fix minimum period size Greg KH
2009-09-16 22:28 ` [patch 12/24] ARM: 5691/1: fix cache aliasing issues between kmap() and kmap_atomic() with highmem Greg KH
2009-09-16 22:28 ` [patch 13/24] ASoC: Fix WM835x Out4 capture enumeration Greg KH
2009-09-16 22:28 ` [patch 14/24] mlx4_core: Allocate and map sufficient ICM memory for EQ context Greg KH
2009-09-16 22:28 ` [patch 15/24] PCI: apply nv_msi_ht_cap_quirk on resume too Greg KH
2009-09-16 22:28 ` [patch 16/24] sound: oxygen: work around MCE when changing volume Greg KH
2009-09-16 22:28 ` [patch 17/24] x86: Fix x86_model test in es7000_apic_is_cluster() Greg KH
2009-09-16 22:28 ` Greg KH [this message]
2009-09-16 22:28 ` [patch 19/24] x86, pat: Fix cacheflush address in change_page_attr_set_clr() Greg KH
2009-09-16 22:28 ` [patch 20/24] V4L: em28xx: set up tda9887_conf in em28xx_card_setup() Greg KH
2009-09-16 22:28 ` [patch 21/24] virtio_blk: dont bounce highmem requests Greg KH
2009-09-16 22:28 ` [patch 22/24] libata: fix off-by-one error in ata_tf_read_block() Greg KH
2009-09-16 22:28 ` [patch 23/24] PCI: Unhide the SMBus on the Compaq Evo D510 USDT Greg KH
2009-09-16 22:28 ` [patch 24/24] powerpc/pseries: Fix to handle slb resize across migration Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090916222903.695585319@mini.kroah.org \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=jeremy.fitzhardinge@citrix.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.