module: Move kmemleak support to a separate file
authorAaron Tomlin <atomlin@redhat.com>
Tue, 22 Mar 2022 14:03:38 +0000 (14:03 +0000)
committerLuis Chamberlain <mcgrof@kernel.org>
Tue, 5 Apr 2022 15:43:04 +0000 (08:43 -0700)
No functional change.

This patch migrates kmemleak code out of core module
code into kernel/module/debug_kmemleak.c

Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
kernel/module/Makefile
kernel/module/debug_kmemleak.c [new file with mode: 0644]
kernel/module/internal.h
kernel/module/main.c

index d313c84..1238862 100644 (file)
@@ -13,3 +13,4 @@ obj-$(CONFIG_MODULE_SIG) += signing.o
 obj-$(CONFIG_LIVEPATCH) += livepatch.o
 obj-$(CONFIG_MODULES_TREE_LOOKUP) += tree_lookup.o
 obj-$(CONFIG_STRICT_MODULE_RWX) += strict_rwx.o
+obj-$(CONFIG_DEBUG_KMEMLEAK) += debug_kmemleak.o
diff --git a/kernel/module/debug_kmemleak.c b/kernel/module/debug_kmemleak.c
new file mode 100644 (file)
index 0000000..12a569d
--- /dev/null
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Module kmemleak support
+ *
+ * Copyright (C) 2009 Catalin Marinas
+ */
+
+#include <linux/module.h>
+#include <linux/kmemleak.h>
+#include "internal.h"
+
+void kmemleak_load_module(const struct module *mod,
+                         const struct load_info *info)
+{
+       unsigned int i;
+
+       /* only scan the sections containing data */
+       kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
+
+       for (i = 1; i < info->hdr->e_shnum; i++) {
+               /* Scan all writable sections that's not executable */
+               if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) ||
+                   !(info->sechdrs[i].sh_flags & SHF_WRITE) ||
+                   (info->sechdrs[i].sh_flags & SHF_EXECINSTR))
+                       continue;
+
+               kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
+                                  info->sechdrs[i].sh_size, GFP_KERNEL);
+       }
+}
index d6f646a..b0c3608 100644 (file)
@@ -167,3 +167,10 @@ static inline int module_sig_check(struct load_info *info, int flags)
        return 0;
 }
 #endif /* !CONFIG_MODULE_SIG */
+
+#ifdef CONFIG_DEBUG_KMEMLEAK
+void kmemleak_load_module(const struct module *mod, const struct load_info *info);
+#else /* !CONFIG_DEBUG_KMEMLEAK */
+static inline void kmemleak_load_module(const struct module *mod,
+                                       const struct load_info *info) { }
+#endif /* CONFIG_DEBUG_KMEMLEAK */
index c349c91..d400c47 100644 (file)
@@ -2519,33 +2519,6 @@ bool __weak module_exit_section(const char *name)
        return strstarts(name, ".exit");
 }
 
-#ifdef CONFIG_DEBUG_KMEMLEAK
-static void kmemleak_load_module(const struct module *mod,
-                                const struct load_info *info)
-{
-       unsigned int i;
-
-       /* only scan the sections containing data */
-       kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
-
-       for (i = 1; i < info->hdr->e_shnum; i++) {
-               /* Scan all writable sections that's not executable */
-               if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) ||
-                   !(info->sechdrs[i].sh_flags & SHF_WRITE) ||
-                   (info->sechdrs[i].sh_flags & SHF_EXECINSTR))
-                       continue;
-
-               kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
-                                  info->sechdrs[i].sh_size, GFP_KERNEL);
-       }
-}
-#else
-static inline void kmemleak_load_module(const struct module *mod,
-                                       const struct load_info *info)
-{
-}
-#endif
-
 static int validate_section_offset(struct load_info *info, Elf_Shdr *shdr)
 {
 #if defined(CONFIG_64BIT)