Merge branch 'x86-irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, 32-bit: Align percpu area and irq stacks to THREAD_SIZE x86: Move alloc_desk_mask variables inside ifdef x86-32: Align IRQ stacks properly x86: Remove CONFIG_4KSTACKS x86: Always use irq stacks Fixed up trivial conflicts in include/linux/{irq.h, percpu-defs.h}
This commit is contained in:
@@ -18,9 +18,9 @@ specialized stacks contain no useful data. The main CPU stacks are:
|
|||||||
Used for external hardware interrupts. If this is the first external
|
Used for external hardware interrupts. If this is the first external
|
||||||
hardware interrupt (i.e. not a nested hardware interrupt) then the
|
hardware interrupt (i.e. not a nested hardware interrupt) then the
|
||||||
kernel switches from the current task to the interrupt stack. Like
|
kernel switches from the current task to the interrupt stack. Like
|
||||||
the split thread and interrupt stacks on i386 (with CONFIG_4KSTACKS),
|
the split thread and interrupt stacks on i386, this gives more room
|
||||||
this gives more room for kernel interrupt processing without having
|
for kernel interrupt processing without having to increase the size
|
||||||
to increase the size of every per thread stack.
|
of every per thread stack.
|
||||||
|
|
||||||
The interrupt stack is also used when processing a softirq.
|
The interrupt stack is also used when processing a softirq.
|
||||||
|
|
||||||
|
@@ -125,16 +125,6 @@ config DEBUG_NX_TEST
|
|||||||
and the software setup of this feature.
|
and the software setup of this feature.
|
||||||
If in doubt, say "N"
|
If in doubt, say "N"
|
||||||
|
|
||||||
config 4KSTACKS
|
|
||||||
bool "Use 4Kb for kernel stacks instead of 8Kb"
|
|
||||||
depends on X86_32
|
|
||||||
---help---
|
|
||||||
If you say Y here the kernel will use a 4Kb stacksize for the
|
|
||||||
kernel stack attached to each process/thread. This facilitates
|
|
||||||
running more threads on a system and also reduces the pressure
|
|
||||||
on the VM subsystem for higher order allocations. This option
|
|
||||||
will also use IRQ stacks to compensate for the reduced stackspace.
|
|
||||||
|
|
||||||
config DOUBLEFAULT
|
config DOUBLEFAULT
|
||||||
default y
|
default y
|
||||||
bool "Enable doublefault exception handler" if EMBEDDED
|
bool "Enable doublefault exception handler" if EMBEDDED
|
||||||
|
@@ -19,18 +19,16 @@ static inline int irq_canonicalize(int irq)
|
|||||||
# define ARCH_HAS_NMI_WATCHDOG
|
# define ARCH_HAS_NMI_WATCHDOG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_4KSTACKS
|
#ifdef CONFIG_X86_32
|
||||||
extern void irq_ctx_init(int cpu);
|
extern void irq_ctx_init(int cpu);
|
||||||
extern void irq_ctx_exit(int cpu);
|
extern void irq_ctx_exit(int cpu);
|
||||||
# define __ARCH_HAS_DO_SOFTIRQ
|
|
||||||
#else
|
#else
|
||||||
# define irq_ctx_init(cpu) do { } while (0)
|
# define irq_ctx_init(cpu) do { } while (0)
|
||||||
# define irq_ctx_exit(cpu) do { } while (0)
|
# define irq_ctx_exit(cpu) do { } while (0)
|
||||||
# ifdef CONFIG_X86_64
|
|
||||||
# define __ARCH_HAS_DO_SOFTIRQ
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define __ARCH_HAS_DO_SOFTIRQ
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
extern void fixup_irqs(void);
|
extern void fixup_irqs(void);
|
||||||
|
@@ -60,12 +60,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
# ifdef CONFIG_4KSTACKS
|
# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
|
||||||
# define MODULE_STACKSIZE "4KSTACKS "
|
|
||||||
# else
|
|
||||||
# define MODULE_STACKSIZE ""
|
|
||||||
# endif
|
|
||||||
# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_STACKSIZE
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_X86_MODULE_H */
|
#endif /* _ASM_X86_MODULE_H */
|
||||||
|
@@ -15,11 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
|
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
|
||||||
|
|
||||||
#ifdef CONFIG_4KSTACKS
|
|
||||||
#define THREAD_ORDER 0
|
|
||||||
#else
|
|
||||||
#define THREAD_ORDER 1
|
#define THREAD_ORDER 1
|
||||||
#endif
|
|
||||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
|
#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
|
||||||
|
|
||||||
#define STACKFAULT_STACK 0
|
#define STACKFAULT_STACK 0
|
||||||
|
@@ -49,20 +49,19 @@ static inline int check_stack_overflow(void) { return 0; }
|
|||||||
static inline void print_stack_overflow(void) { }
|
static inline void print_stack_overflow(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_4KSTACKS
|
|
||||||
/*
|
/*
|
||||||
* per-CPU IRQ handling contexts (thread information and stack)
|
* per-CPU IRQ handling contexts (thread information and stack)
|
||||||
*/
|
*/
|
||||||
union irq_ctx {
|
union irq_ctx {
|
||||||
struct thread_info tinfo;
|
struct thread_info tinfo;
|
||||||
u32 stack[THREAD_SIZE/sizeof(u32)];
|
u32 stack[THREAD_SIZE/sizeof(u32)];
|
||||||
} __attribute__((aligned(PAGE_SIZE)));
|
} __attribute__((aligned(THREAD_SIZE)));
|
||||||
|
|
||||||
static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx);
|
static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx);
|
||||||
static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx);
|
static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx);
|
||||||
|
|
||||||
static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, hardirq_stack);
|
static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, hardirq_stack, THREAD_SIZE);
|
||||||
static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, softirq_stack);
|
static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, softirq_stack, THREAD_SIZE);
|
||||||
|
|
||||||
static void call_on_stack(void *func, void *stack)
|
static void call_on_stack(void *func, void *stack)
|
||||||
{
|
{
|
||||||
@@ -187,11 +186,6 @@ asmlinkage void do_softirq(void)
|
|||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
static inline int
|
|
||||||
execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool handle_irq(unsigned irq, struct pt_regs *regs)
|
bool handle_irq(unsigned irq, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct irq_desc *desc;
|
struct irq_desc *desc;
|
||||||
|
@@ -301,7 +301,7 @@ SECTIONS
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP)
|
#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP)
|
||||||
PERCPU(PAGE_SIZE)
|
PERCPU(THREAD_SIZE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
@@ -147,6 +147,18 @@
|
|||||||
#define DEFINE_PER_CPU_READ_MOSTLY(type, name) \
|
#define DEFINE_PER_CPU_READ_MOSTLY(type, name) \
|
||||||
DEFINE_PER_CPU_SECTION(type, name, "..readmostly")
|
DEFINE_PER_CPU_SECTION(type, name, "..readmostly")
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Declaration/definition used for large per-CPU variables that must be
|
||||||
|
* aligned to something larger than the pagesize.
|
||||||
|
*/
|
||||||
|
#define DECLARE_PER_CPU_MULTIPAGE_ALIGNED(type, name, size) \
|
||||||
|
DECLARE_PER_CPU_SECTION(type, name, "..page_aligned") \
|
||||||
|
__aligned(size)
|
||||||
|
|
||||||
|
#define DEFINE_PER_CPU_MULTIPAGE_ALIGNED(type, name, size) \
|
||||||
|
DEFINE_PER_CPU_SECTION(type, name, "..page_aligned") \
|
||||||
|
__aligned(size)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Intermodule exports for per-CPU variables. sparse forgets about
|
* Intermodule exports for per-CPU variables. sparse forgets about
|
||||||
* address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to
|
* address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to
|
||||||
|
Reference in New Issue
Block a user