Commit-ID:  a70857e46dd13e87ae06bf0e64cb6a2d4f436265
Gitweb:     http://git.kernel.org/tip/a70857e46dd13e87ae06bf0e64cb6a2d4f436265
Author:     Aaron Tomlin <atom...@redhat.com>
AuthorDate: Fri, 12 Sep 2014 14:16:18 +0100
Committer:  Ingo Molnar <mi...@kernel.org>
CommitDate: Fri, 19 Sep 2014 12:35:23 +0200

sched: Add helper for task stack page overrun checking

This facility is used in a few places so let's introduce
a helper function to improve code readability.

Signed-off-by: Aaron Tomlin <atom...@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
Cc: aneesh.ku...@linux.vnet.ibm.com
Cc: dzic...@redhat.com
Cc: b...@redhat.com
Cc: jcasti...@redhat.com
Cc: o...@redhat.com
Cc: r...@redhat.com
Cc: pra...@redhat.com
Cc: j...@redhat.com
Cc: minc...@kernel.org
Cc: m...@ellerman.id.au
Cc: t...@linutronix.de
Cc: han...@cmpxchg.org
Cc: Andrew Morton <a...@linux-foundation.org>
Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org>
Cc: Jiri Olsa <jo...@redhat.com>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Masami Hiramatsu <masami.hiramatsu...@hitachi.com>
Cc: Michael Ellerman <m...@ellerman.id.au>
Cc: Paul Mackerras <pau...@samba.org>
Cc: Seiji Aguchi <seiji.agu...@hds.com>
Cc: Steven Rostedt <rost...@goodmis.org>
Cc: Yasuaki Ishimatsu <isimatu.yasu...@jp.fujitsu.com>
Cc: linuxppc-...@lists.ozlabs.org
Link: 
http://lkml.kernel.org/r/1410527779-8133-3-git-send-email-atom...@redhat.com
Signed-off-by: Ingo Molnar <mi...@kernel.org>
---
 arch/powerpc/mm/fault.c    | 4 +---
 arch/x86/mm/fault.c        | 4 +---
 include/linux/sched.h      | 2 ++
 kernel/trace/trace_stack.c | 2 +-
 4 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index 35d0760c..99b2f27 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -507,7 +507,6 @@ bail:
 void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
 {
        const struct exception_table_entry *entry;
-       unsigned long *stackend;
 
        /* Are we prepared to handle this fault?  */
        if ((entry = search_exception_tables(regs->nip)) != NULL) {
@@ -536,8 +535,7 @@ void bad_page_fault(struct pt_regs *regs, unsigned long 
address, int sig)
        printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n",
                regs->nip);
 
-       stackend = end_of_stack(current);
-       if (*stackend != STACK_END_MAGIC)
+       if (task_stack_end_corrupted(current))
                printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
 
        die("Kernel access of bad area", regs, sig);
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index bc23a70..6240bc7 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -648,7 +648,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
           unsigned long address, int signal, int si_code)
 {
        struct task_struct *tsk = current;
-       unsigned long *stackend;
        unsigned long flags;
        int sig;
 
@@ -708,8 +707,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
 
        show_fault_oops(regs, error_code, address);
 
-       stackend = end_of_stack(tsk);
-       if (*stackend != STACK_END_MAGIC)
+       if (task_stack_end_corrupted(tsk))
                printk(KERN_EMERG "Thread overran stack, or stack corrupted\n");
 
        tsk->thread.cr2         = address;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 118dca7..18f5262 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2617,6 +2617,8 @@ static inline unsigned long *end_of_stack(struct 
task_struct *p)
 }
 
 #endif
+#define task_stack_end_corrupted(task) \
+               (*(end_of_stack(task)) != STACK_END_MAGIC)
 
 static inline int object_is_on_stack(void *obj)
 {
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index 1636e41..16eddb3 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -170,7 +170,7 @@ check_stack(unsigned long ip, unsigned long *stack)
                        i++;
        }
 
-       if (*end_of_stack(current) != STACK_END_MAGIC) {
+       if (task_stack_end_corrupted(current)) {
                print_max_stack();
                BUG();
        }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to