Commit 505a0ef1 authored by Alexander Potapenko's avatar Alexander Potapenko Committed by Linus Torvalds

kasan: stackdepot: move filter_irq_stacks() to stackdepot.c

filter_irq_stacks() can be used by other tools (e.g.  KMSAN), so it needs
to be moved to a common location.  lib/stackdepot.c seems a good place, as
filter_irq_stacks() is usually applied to the output of
stack_trace_save().

This patch has been previously mailed as part of KMSAN RFC patch series.

[glider@google.co: nds32: linker script: add SOFTIRQENTRY_TEXT\
  Link: http://lkml.kernel.org/r/20200311121002.241430-1-glider@google.com
[glider@google.com: add IRQENTRY_TEXT and SOFTIRQENTRY_TEXT to linker script]
  Link: http://lkml.kernel.org/r/20200311121124.243352-1-glider@google.comSigned-off-by: default avatarAlexander Potapenko <glider@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Cc: Vegard Nossum <vegard.nossum@oracle.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Marco Elver <elver@google.com>
Cc: Andrey Konovalov <andreyknvl@google.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Link: http://lkml.kernel.org/r/20200220141916.55455-3-glider@google.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7b65942f
...@@ -54,6 +54,8 @@ SECTIONS { ...@@ -54,6 +54,8 @@ SECTIONS {
CPUIDLE_TEXT CPUIDLE_TEXT
LOCK_TEXT LOCK_TEXT
KPROBES_TEXT KPROBES_TEXT
IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.gnu.linkonce.t*) *(.gnu.linkonce.t*)
} }
......
...@@ -47,6 +47,7 @@ SECTIONS ...@@ -47,6 +47,7 @@ SECTIONS
LOCK_TEXT LOCK_TEXT
KPROBES_TEXT KPROBES_TEXT
IRQENTRY_TEXT IRQENTRY_TEXT
SOFTIRQENTRY_TEXT
*(.fixup) *(.fixup)
} }
......
...@@ -19,4 +19,6 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries, ...@@ -19,4 +19,6 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries,
unsigned int stack_depot_fetch(depot_stack_handle_t handle, unsigned int stack_depot_fetch(depot_stack_handle_t handle,
unsigned long **entries); unsigned long **entries);
unsigned int filter_irq_stacks(unsigned long *entries, unsigned int nr_entries);
#endif #endif
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
*/ */
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/interrupt.h>
#include <linux/jhash.h> #include <linux/jhash.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
...@@ -316,3 +317,26 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries, ...@@ -316,3 +317,26 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries,
return retval; return retval;
} }
EXPORT_SYMBOL_GPL(stack_depot_save); EXPORT_SYMBOL_GPL(stack_depot_save);
static inline int in_irqentry_text(unsigned long ptr)
{
return (ptr >= (unsigned long)&__irqentry_text_start &&
ptr < (unsigned long)&__irqentry_text_end) ||
(ptr >= (unsigned long)&__softirqentry_text_start &&
ptr < (unsigned long)&__softirqentry_text_end);
}
unsigned int filter_irq_stacks(unsigned long *entries,
unsigned int nr_entries)
{
unsigned int i;
for (i = 0; i < nr_entries; i++) {
if (in_irqentry_text(entries[i])) {
/* Include the irqentry function into the stack. */
return i + 1;
}
}
return nr_entries;
}
EXPORT_SYMBOL_GPL(filter_irq_stacks);
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
*/ */
#include <linux/export.h> #include <linux/export.h>
#include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kasan.h> #include <linux/kasan.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -42,28 +41,6 @@ ...@@ -42,28 +41,6 @@
#include "kasan.h" #include "kasan.h"
#include "../slab.h" #include "../slab.h"
static inline int in_irqentry_text(unsigned long ptr)
{
return (ptr >= (unsigned long)&__irqentry_text_start &&
ptr < (unsigned long)&__irqentry_text_end) ||
(ptr >= (unsigned long)&__softirqentry_text_start &&
ptr < (unsigned long)&__softirqentry_text_end);
}
static inline unsigned int filter_irq_stacks(unsigned long *entries,
unsigned int nr_entries)
{
unsigned int i;
for (i = 0; i < nr_entries; i++) {
if (in_irqentry_text(entries[i])) {
/* Include the irqentry function into the stack. */
return i + 1;
}
}
return nr_entries;
}
static inline depot_stack_handle_t save_stack(gfp_t flags) static inline depot_stack_handle_t save_stack(gfp_t flags)
{ {
unsigned long entries[KASAN_STACK_DEPTH]; unsigned long entries[KASAN_STACK_DEPTH];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment