Message ID | a480ac6f31eece520564afd0230c277c78169aa5.1643791473.git.christophe.leroy@csgroup.eu (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | [1/4] mm/kasan: Add CONFIG_KASAN_SOFTWARE | expand |
Hi Christophe, I love your patch! Yet something to improve: [auto build test ERROR on tip/sched/core] [also build test ERROR on linus/master v5.17-rc2] [cannot apply to hnaz-mm/master next-20220202] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Christophe-Leroy/mm-kasan-Add-CONFIG_KASAN_SOFTWARE/20220202-164612 base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git ec2444530612a886b406e2830d7f314d1a07d4bb config: x86_64-randconfig-a013-20220131 (https://download.01.org/0day-ci/archive/20220202/202202022149.BRH60mXN-lkp@intel.com/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 6b1e844b69f15bb7dffaf9365cd2b355d2eb7579) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/29c1001f88c380ea391fa5520f2ddcce35e35681 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Christophe-Leroy/mm-kasan-Add-CONFIG_KASAN_SOFTWARE/20220202-164612 git checkout 29c1001f88c380ea391fa5520f2ddcce35e35681 # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): In file included from arch/x86/boot/compressed/cmdline.c:2: In file included from arch/x86/boot/compressed/misc.h:32: In file included from include/linux/acpi.h:14: In file included from include/linux/resource_ext.h:11: In file included from include/linux/slab.h:136: >> include/linux/kasan.h:56:41: error: use of undeclared identifier 'KASAN_SHADOW_SCALE_SHIFT' return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) ^ >> include/linux/kasan.h:57:5: error: use of undeclared identifier 'KASAN_SHADOW_OFFSET' + KASAN_SHADOW_OFFSET; ^ 2 errors generated. -- In file included from arch/x86/boot/compressed/pgtable_64.c:2: In file included from arch/x86/boot/compressed/misc.h:32: In file included from include/linux/acpi.h:14: In file included from include/linux/resource_ext.h:11: In file included from include/linux/slab.h:136: >> include/linux/kasan.h:56:41: error: use of undeclared identifier 'KASAN_SHADOW_SCALE_SHIFT' return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) ^ >> include/linux/kasan.h:57:5: error: use of undeclared identifier 'KASAN_SHADOW_OFFSET' + KASAN_SHADOW_OFFSET; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: include/linux/signal.h:97:11: warning: array index 3 is past the end of the array (which contains 1 element) [-Warray-bounds] return (set->sig[3] | set->sig[2] | ^ ~ arch/x86/include/asm/signal.h:24:2: note: array 'sig' declared here unsigned long sig[_NSIG_WORDS]; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: include/linux/signal.h:97:25: warning: array index 2 is past the end of the array (which contains 1 element) [-Warray-bounds] return (set->sig[3] | set->sig[2] | ^ ~ arch/x86/include/asm/signal.h:24:2: note: array 'sig' declared here unsigned long sig[_NSIG_WORDS]; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: include/linux/signal.h:98:4: warning: array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds] set->sig[1] | set->sig[0]) == 0; ^ ~ arch/x86/include/asm/signal.h:24:2: note: array 'sig' declared here unsigned long sig[_NSIG_WORDS]; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: include/linux/signal.h:100:11: warning: array index 1 is past the end of the array (which contains 1 element) [-Warray-bounds] return (set->sig[1] | set->sig[0]) == 0; ^ ~ arch/x86/include/asm/signal.h:24:2: note: array 'sig' declared here unsigned long sig[_NSIG_WORDS]; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: include/linux/signal.h:113:11: warning: array index 3 is past the end of the array (which contains 1 element) [-Warray-bounds] return (set1->sig[3] == set2->sig[3]) && ^ ~ arch/x86/include/asm/signal.h:24:2: note: array 'sig' declared here unsigned long sig[_NSIG_WORDS]; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: include/linux/signal.h:113:27: warning: array index 3 is past the end of the array (which contains 1 element) [-Warray-bounds] return (set1->sig[3] == set2->sig[3]) && ^ ~ arch/x86/include/asm/signal.h:24:2: note: array 'sig' declared here unsigned long sig[_NSIG_WORDS]; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: include/linux/signal.h:114:5: warning: array index 2 is past the end of the array (which contains 1 element) [-Warray-bounds] (set1->sig[2] == set2->sig[2]) && ^ ~ arch/x86/include/asm/signal.h:24:2: note: array 'sig' declared here unsigned long sig[_NSIG_WORDS]; ^ In file included from arch/x86/boot/compressed/pgtable_64.c:3: In file included from include/linux/efi.h:19: In file included from include/linux/proc_fs.h:10: In file included from include/linux/fs.h:33: In file included from include/linux/percpu-rwsem.h:7: In file included from include/linux/rcuwait.h:6: In file included from include/linux/sched/signal.h:6: vim +/KASAN_SHADOW_SCALE_SHIFT +56 include/linux/kasan.h 69786cdb379bbc Andrey Ryabinin 2015-08-13 50 9577dd74864877 Andrey Konovalov 2018-12-28 51 int kasan_populate_early_shadow(const void *shadow_start, 69786cdb379bbc Andrey Ryabinin 2015-08-13 52 const void *shadow_end); 69786cdb379bbc Andrey Ryabinin 2015-08-13 53 0b24becc810dc3 Andrey Ryabinin 2015-02-13 54 static inline void *kasan_mem_to_shadow(const void *addr) 0b24becc810dc3 Andrey Ryabinin 2015-02-13 55 { 0b24becc810dc3 Andrey Ryabinin 2015-02-13 @56 return (void *)((unsigned long)addr >> KASAN_SHADOW_SCALE_SHIFT) 0b24becc810dc3 Andrey Ryabinin 2015-02-13 @57 + KASAN_SHADOW_OFFSET; 0b24becc810dc3 Andrey Ryabinin 2015-02-13 58 } 0b24becc810dc3 Andrey Ryabinin 2015-02-13 59 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/include/linux/fortify-string.h b/include/linux/fortify-string.h index a6cd6815f249..65c06e30fc6b 100644 --- a/include/linux/fortify-string.h +++ b/include/linux/fortify-string.h @@ -24,7 +24,7 @@ void __write_overflow(void) __compiletime_error("detected write beyond size of o __ret; \ }) -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE extern void *__underlying_memchr(const void *p, int c, __kernel_size_t size) __RENAME(memchr); extern int __underlying_memcmp(const void *p, const void *q, __kernel_size_t size) __RENAME(memcmp); extern void *__underlying_memcpy(void *p, const void *q, __kernel_size_t size) __RENAME(memcpy); diff --git a/include/linux/kasan-checks.h b/include/linux/kasan-checks.h index 3d6d22a25bdc..7ad385c4b2fc 100644 --- a/include/linux/kasan-checks.h +++ b/include/linux/kasan-checks.h @@ -15,7 +15,7 @@ * even in compilation units that selectively disable KASAN, but must use KASAN * to validate access to an address. Never use these in header files! */ -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE bool __kasan_check_read(const volatile void *p, unsigned int size); bool __kasan_check_write(const volatile void *p, unsigned int size); #else diff --git a/include/linux/kasan.h b/include/linux/kasan.h index 4a45562d8893..c29778b25d8a 100644 --- a/include/linux/kasan.h +++ b/include/linux/kasan.h @@ -25,7 +25,7 @@ struct kunit_kasan_expectation { #endif -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE #include <linux/pgtable.h> @@ -66,7 +66,7 @@ extern void kasan_enable_current(void); /* Disable reporting bugs for current task */ extern void kasan_disable_current(void); -#else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ +#else /* CONFIG_KASAN_SOFTWARE */ static inline int kasan_add_zero_shadow(void *start, unsigned long size) { @@ -79,7 +79,7 @@ static inline void kasan_remove_zero_shadow(void *start, static inline void kasan_enable_current(void) {} static inline void kasan_disable_current(void) {} -#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ +#endif /* CONFIG_KASAN_SOFTWARE */ #ifdef CONFIG_KASAN_HW_TAGS @@ -467,8 +467,7 @@ static inline void kasan_populate_early_vm_area_shadow(void *start, #endif /* CONFIG_KASAN_VMALLOC */ -#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ - !defined(CONFIG_KASAN_VMALLOC) +#if defined(CONFIG_KASAN_SOFTWARE) && !defined(CONFIG_KASAN_VMALLOC) /* * These functions provide a special case to support backing module @@ -478,12 +477,12 @@ static inline void kasan_populate_early_vm_area_shadow(void *start, int kasan_module_alloc(void *addr, size_t size, gfp_t gfp_mask); void kasan_free_shadow(const struct vm_struct *vm); -#else /* (CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS) && !CONFIG_KASAN_VMALLOC */ +#else /* CONFIG_KASAN_SOFTWARE && !CONFIG_KASAN_VMALLOC */ static inline int kasan_module_alloc(void *addr, size_t size, gfp_t gfp_mask) { return 0; } static inline void kasan_free_shadow(const struct vm_struct *vm) {} -#endif /* (CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS) && !CONFIG_KASAN_VMALLOC */ +#endif /* CONFIG_KASAN_SOFTWARE && !CONFIG_KASAN_VMALLOC */ #ifdef CONFIG_KASAN_INLINE void kasan_non_canonical_hook(unsigned long addr); diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h index 9e09d11ffe5b..232687e315b3 100644 --- a/include/linux/moduleloader.h +++ b/include/linux/moduleloader.h @@ -96,8 +96,7 @@ void module_arch_cleanup(struct module *mod); /* Any cleanup before freeing mod->module_init */ void module_arch_freeing_init(struct module *mod); -#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ - !defined(CONFIG_KASAN_VMALLOC) +#if defined(CONFIG_KASAN_SOFTWARE) && !defined(CONFIG_KASAN_VMALLOC) #include <linux/kasan.h> #define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) #else diff --git a/include/linux/sched.h b/include/linux/sched.h index f5b2be39a78c..8d815aea1009 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1335,7 +1335,7 @@ struct task_struct { u64 timer_slack_ns; u64 default_timer_slack_ns; -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE unsigned int kasan_depth; #endif diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 880227b9f044..83d870b16a31 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -28,8 +28,7 @@ struct notifier_block; /* in notifier.h */ #define VM_MAP_PUT_PAGES 0x00000200 /* put pages and free array in vfree */ #define VM_NO_HUGE_VMAP 0x00000400 /* force PAGE_SIZE pte mapping */ -#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ - !defined(CONFIG_KASAN_VMALLOC) +#if defined(CONFIG_KASAN_SOFTWARE) && !defined(CONFIG_KASAN_VMALLOC) #define VM_DEFER_KMEMLEAK 0x00000800 /* defer kmemleak object creation */ #else #define VM_DEFER_KMEMLEAK 0 diff --git a/init/init_task.c b/init/init_task.c index 73cc8f03511a..fa924e5ae173 100644 --- a/init/init_task.c +++ b/init/init_task.c @@ -177,7 +177,7 @@ struct task_struct init_task .numa_group = NULL, .numa_faults = NULL, #endif -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE .kasan_depth = 1, #endif #ifdef CONFIG_KCSAN diff --git a/lib/Kconfig.kasan b/lib/Kconfig.kasan index 879757b6dd14..4b2de3bd188a 100644 --- a/lib/Kconfig.kasan +++ b/lib/Kconfig.kasan @@ -46,6 +46,9 @@ menuconfig KASAN if KASAN +config KASAN_SOFTWARE + bool + choice prompt "KASAN mode" default KASAN_GENERIC @@ -69,6 +72,7 @@ config KASAN_GENERIC depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS select SLUB_DEBUG if SLUB select CONSTRUCTORS + select KASAN_SOFTWARE help Enables generic KASAN mode. @@ -90,6 +94,7 @@ config KASAN_SW_TAGS depends on CC_HAS_WORKING_NOSANITIZE_ADDRESS select SLUB_DEBUG if SLUB select CONSTRUCTORS + select KASAN_SOFTWARE help Enables software tag-based KASAN mode. @@ -125,7 +130,7 @@ endchoice choice prompt "Instrumentation type" - depends on KASAN_GENERIC || KASAN_SW_TAGS + depends on KASAN_SOFTWARE default KASAN_OUTLINE config KASAN_OUTLINE @@ -150,7 +155,7 @@ endchoice config KASAN_STACK bool "Enable stack instrumentation (unsafe)" if CC_IS_CLANG && !COMPILE_TEST - depends on KASAN_GENERIC || KASAN_SW_TAGS + depends on KASAN_SOFTWARE depends on !ARCH_DISABLE_KASAN_INLINE default y if CC_IS_GCC help diff --git a/mm/kasan/Makefile b/mm/kasan/Makefile index adcd9acaef61..5f22899b3b2b 100644 --- a/mm/kasan/Makefile +++ b/mm/kasan/Makefile @@ -36,6 +36,7 @@ CFLAGS_hw_tags.o := $(CC_FLAGS_KASAN_RUNTIME) CFLAGS_sw_tags.o := $(CC_FLAGS_KASAN_RUNTIME) obj-$(CONFIG_KASAN) := common.o report.o -obj-$(CONFIG_KASAN_GENERIC) += init.o generic.o report_generic.o shadow.o quarantine.o +obj-$(CONFIG_KASAN_SOFTWARE) += init.o shadow.o +obj-$(CONFIG_KASAN_GENERIC) += generic.o report_generic.o quarantine.o obj-$(CONFIG_KASAN_HW_TAGS) += hw_tags.o report_hw_tags.o tags.o report_tags.o -obj-$(CONFIG_KASAN_SW_TAGS) += init.o report_sw_tags.o shadow.o sw_tags.o tags.o report_tags.o +obj-$(CONFIG_KASAN_SW_TAGS) += sw_tags.o report_sw_tags.o tags.o report_tags.o diff --git a/mm/kasan/common.c b/mm/kasan/common.c index 92196562687b..5693fe2c176f 100644 --- a/mm/kasan/common.c +++ b/mm/kasan/common.c @@ -45,7 +45,7 @@ void kasan_set_track(struct kasan_track *track, gfp_t flags) track->stack = kasan_save_stack(flags, true); } -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE void kasan_enable_current(void) { current->kasan_depth++; @@ -58,7 +58,7 @@ void kasan_disable_current(void) } EXPORT_SYMBOL(kasan_disable_current); -#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ +#endif /* CONFIG_KASAN_SOFTWARE */ void __kasan_unpoison_range(const void *address, size_t size) { diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h index c17fa8d26ffe..57d96714bc1b 100644 --- a/mm/kasan/kasan.h +++ b/mm/kasan/kasan.h @@ -55,7 +55,7 @@ static inline bool kasan_sync_fault_possible(void) #endif -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE #define KASAN_GRANULE_SIZE (1UL << KASAN_SHADOW_SCALE_SHIFT) #else #include <asm/mte-kasan.h> @@ -211,7 +211,7 @@ struct kasan_free_meta *kasan_get_free_meta(struct kmem_cache *cache, const void *object); #endif -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE static inline const void *kasan_shadow_to_mem(const void *shadow_addr) { @@ -235,14 +235,14 @@ static inline bool addr_has_metadata(const void *addr) bool kasan_check_range(unsigned long addr, size_t size, bool write, unsigned long ret_ip); -#else /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ +#else /* CONFIG_KASAN_SOFTWARE */ static inline bool addr_has_metadata(const void *addr) { return (is_vmalloc_addr(addr) || virt_addr_valid(addr)); } -#endif /* CONFIG_KASAN_GENERIC || CONFIG_KASAN_SW_TAGS */ +#endif /* CONFIG_KASAN_SOFTWARE */ #if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS) void kasan_print_tags(u8 addr_tag, const void *addr); diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 3ad9624dcc56..bce57bbd1baa 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -334,7 +334,7 @@ static void print_memory_metadata(const void *addr) static bool report_enabled(void) { -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) +#ifdef CONFIG_KASAN_SOFTWARE if (current->kasan_depth) return false; #endif
Many many places check whether there is one of CONFIG_KASAN_GENERIC or CONFIG_KASAN_SW_TAGS In order to avoid adding more places with such a awful check, add CONFIG_KASAN_SOFTWARE which is selected by both CONFIG_KASAN_GENERIC and CONFIG_KASAN_SW_TAGS. This patch only modifies core part. Arch specific parts can be upgraded one by one in a second step. Don't change mm/ptdump.c as those #ifdefs go away in the patch after the next. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> --- include/linux/fortify-string.h | 2 +- include/linux/kasan-checks.h | 2 +- include/linux/kasan.h | 13 ++++++------- include/linux/moduleloader.h | 3 +-- include/linux/sched.h | 2 +- include/linux/vmalloc.h | 3 +-- init/init_task.c | 2 +- lib/Kconfig.kasan | 9 +++++++-- mm/kasan/Makefile | 5 +++-- mm/kasan/common.c | 4 ++-- mm/kasan/kasan.h | 8 ++++---- mm/kasan/report.c | 2 +- 12 files changed, 29 insertions(+), 26 deletions(-)