Patch "MIPS: Introduce irq_stack" has been added to the 4.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
MIPS: Introduce irq_stack
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mips-introduce-irq_stack.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
fe8bd18ffea5327344d4ec2bf11f47951212abd0Mon Sep 17 00:00:00 2001
From: Matt Redfearn <[email protected]>
Date: Mon, 19 Dec 2016 14:20:56 +0000
Subject: MIPS: Introduce irq_stack
From: Matt Redfearn <[email protected]>
commit fe8bd18ffea5327344d4ec2bf11f47951212abd0 upstream.
Allocate a per-cpu irq stack for use within interrupt handlers.
Also add a utility function on_irq_stack to determine if a given stack pointer is within the irq stack for that cpu.
Patchwork: https://patchwork.linux-mips.org/patch/14740/
--- arch/mips/include/asm/irq.h | 12 ++++++++++++ arch/mips/kernel/asm-offsets.c | 1 + arch/mips/kernel/irq.c | 11 +++++++++++ 3 files changed, 24 insertions(+)
arch/mips/include/asm/irq.h +12 -0
@@ -17,6 +17,18 @@#include <irq.h> +#define IRQ_STACK_SIZE THREAD_SIZE + +extern void *irq_stack[NR_CPUS ]; + +static inline bool on_irq_stack (int cpu,unsigned long sp) +{ +unsigned long low = (unsigned long )irq_stack[cpu]; +unsigned long high = low +IRQ_STACK_SIZE ; + +return (low <= sp && sp <= high); +} +#ifdef CONFIG_I8259 static inline int irq_canonicalize (int irq) {
arch/mips/kernel/asm-offsets.c +1 -0
@@ -102,6 +102,7 @@ void output_thread_info_defines(void)OFFSET (TI_REGS , thread_info, regs);DEFINE (_THREAD_SIZE,THREAD_SIZE );DEFINE (_THREAD_MASK,THREAD_MASK ); +DEFINE (_IRQ_STACK_SIZE,IRQ_STACK_SIZE );BLANK (); }
arch/mips/kernel/irq.c +11 -0
@@ -25,6 +25,8 @@#include <linux/atomic.h> #include <linux/uaccess.h> +void *irq_stack[NR_CPUS ]; +/* * 'what should we do if we get a hw irq event on an illegal vector'. * each architecture has to answer this themselves.
@@ -58,6 +60,15 @@ void __init init_IRQ(void)clear_c0_status (ST0_IM );arch_init_irq (); + +for_each_possible_cpu (i) { +int irq_pages =IRQ_STACK_SIZE /PAGE_SIZE ; +void *s = (void *)__get_free_pages (GFP_KERNEL , irq_pages); + + irq_stack[i] = s; +pr_debug ("CPU%d IRQ stack at 0x%p - 0x%p\n" , i, + irq_stack[i], irq_stack[i] +IRQ_STACK_SIZE ); + } }#ifdef CONFIG_DEBUG_STACKOVERFLOW
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/mips-only-change-28-to-thread_info-if-coming-from-user-mode.patch queue-4.10/mips-stack-unwinding-while-on-irq-stack.patch queue-4.10/mips-introduce-irq_stack.patch