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:
Коммит
91151240ed
|
@ -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
|
||||
hardware interrupt (i.e. not a nested hardware interrupt) then the
|
||||
kernel switches from the current task to the interrupt stack. Like
|
||||
the split thread and interrupt stacks on i386 (with CONFIG_4KSTACKS),
|
||||
this gives more room for kernel interrupt processing without having
|
||||
to increase the size of every per thread stack.
|
||||
the split thread and interrupt stacks on i386, this gives more room
|
||||
for kernel interrupt processing without having to increase the size
|
||||
of every per thread stack.
|
||||
|
||||
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.
|
||||
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
|
||||
default y
|
||||
bool "Enable doublefault exception handler" if EMBEDDED
|
||||
|
|
|
@ -19,18 +19,16 @@ static inline int irq_canonicalize(int irq)
|
|||
# define ARCH_HAS_NMI_WATCHDOG
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_4KSTACKS
|
||||
extern void irq_ctx_init(int cpu);
|
||||
extern void irq_ctx_exit(int cpu);
|
||||
# define __ARCH_HAS_DO_SOFTIRQ
|
||||
#ifdef CONFIG_X86_32
|
||||
extern void irq_ctx_init(int cpu);
|
||||
extern void irq_ctx_exit(int cpu);
|
||||
#else
|
||||
# define irq_ctx_init(cpu) do { } while (0)
|
||||
# define irq_ctx_exit(cpu) do { } while (0)
|
||||
# ifdef CONFIG_X86_64
|
||||
# define __ARCH_HAS_DO_SOFTIRQ
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define __ARCH_HAS_DO_SOFTIRQ
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#include <linux/cpumask.h>
|
||||
extern void fixup_irqs(void);
|
||||
|
|
|
@ -60,12 +60,7 @@
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# ifdef CONFIG_4KSTACKS
|
||||
# define MODULE_STACKSIZE "4KSTACKS "
|
||||
# else
|
||||
# define MODULE_STACKSIZE ""
|
||||
# endif
|
||||
# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_STACKSIZE
|
||||
# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_MODULE_H */
|
||||
|
|
|
@ -15,11 +15,7 @@
|
|||
*/
|
||||
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
|
||||
|
||||
#ifdef CONFIG_4KSTACKS
|
||||
#define THREAD_ORDER 0
|
||||
#else
|
||||
#define THREAD_ORDER 1
|
||||
#endif
|
||||
#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
|
||||
|
||||
#define STACKFAULT_STACK 0
|
||||
|
|
|
@ -49,20 +49,19 @@ static inline int check_stack_overflow(void) { return 0; }
|
|||
static inline void print_stack_overflow(void) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_4KSTACKS
|
||||
/*
|
||||
* per-CPU IRQ handling contexts (thread information and stack)
|
||||
*/
|
||||
union irq_ctx {
|
||||
struct thread_info tinfo;
|
||||
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 *, softirq_ctx);
|
||||
|
||||
static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, hardirq_stack);
|
||||
static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, softirq_stack);
|
||||
static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, hardirq_stack, THREAD_SIZE);
|
||||
static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, softirq_stack, THREAD_SIZE);
|
||||
|
||||
static void call_on_stack(void *func, void *stack)
|
||||
{
|
||||
|
@ -187,11 +186,6 @@ asmlinkage void do_softirq(void)
|
|||
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)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
|
|
|
@ -301,7 +301,7 @@ SECTIONS
|
|||
}
|
||||
|
||||
#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP)
|
||||
PERCPU(PAGE_SIZE)
|
||||
PERCPU(THREAD_SIZE)
|
||||
#endif
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
|
|
|
@ -147,6 +147,18 @@
|
|||
#define DEFINE_PER_CPU_READ_MOSTLY(type, name) \
|
||||
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
|
||||
* address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to
|
||||
|
|
Загрузка…
Ссылка в новой задаче