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.com Signed-off-by: Alexander Potapenko <glider@google.com> Signed-off-by: Andrew 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.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7b65942fb2
commit
505a0ef15f
|
@ -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
|
||||||
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,
|
||||||
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 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#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,
|
||||||
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 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#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 @@
|
||||||
#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];
|
||||||
|
|
Loading…
Reference in New Issue