All of lore.kernel.org
 help / color / mirror / Atom feed
From: Suren Baghdasaryan <surenb@google.com>
To: akpm@linux-foundation.org
Cc: kent.overstreet@linux.dev, mhocko@suse.com, vbabka@suse.cz,
	 hannes@cmpxchg.org, roman.gushchin@linux.dev, mgorman@suse.de,
	 dave@stgolabs.net, willy@infradead.org, liam.howlett@oracle.com,
	 penguin-kernel@i-love.sakura.ne.jp, corbet@lwn.net,
	void@manifault.com,  peterz@infradead.org, juri.lelli@redhat.com,
	catalin.marinas@arm.com,  will@kernel.org, arnd@arndb.de,
	tglx@linutronix.de, mingo@redhat.com,
	 dave.hansen@linux.intel.com, x86@kernel.org, peterx@redhat.com,
	 david@redhat.com, axboe@kernel.dk, mcgrof@kernel.org,
	masahiroy@kernel.org,  nathan@kernel.org, dennis@kernel.org,
	jhubbard@nvidia.com, tj@kernel.org,  muchun.song@linux.dev,
	rppt@kernel.org, paulmck@kernel.org,  pasha.tatashin@soleen.com,
	yosryahmed@google.com, yuzhao@google.com,  dhowells@redhat.com,
	hughd@google.com, andreyknvl@gmail.com,  keescook@chromium.org,
	ndesaulniers@google.com, vvvvvv@google.com,
	 gregkh@linuxfoundation.org, ebiggers@google.com,
	ytcoode@gmail.com,  vincent.guittot@linaro.org,
	dietmar.eggemann@arm.com, rostedt@goodmis.org,
	 bsegall@google.com, bristot@redhat.com, vschneid@redhat.com,
	cl@linux.com,  penberg@kernel.org, iamjoonsoo.kim@lge.com,
	42.hyeyoo@gmail.com,  glider@google.com, elver@google.com,
	dvyukov@google.com,  songmuchun@bytedance.com, jbaron@akamai.com,
	aliceryhl@google.com,  rientjes@google.com, minchan@google.com,
	kaleshsingh@google.com,  surenb@google.com,
	kernel-team@android.com, linux-doc@vger.kernel.org,
	 linux-kernel@vger.kernel.org, iommu@lists.linux.dev,
	 linux-arch@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-mm@kvack.org,  linux-modules@vger.kernel.org,
	kasan-dev@googlegroups.com,  cgroups@vger.kernel.org
Subject: [PATCH v6 11/37] lib: code tagging module support
Date: Thu, 21 Mar 2024 09:36:33 -0700	[thread overview]
Message-ID: <20240321163705.3067592-12-surenb@google.com> (raw)
In-Reply-To: <20240321163705.3067592-1-surenb@google.com>

Add support for code tagging from dynamically loaded modules.

Signed-off-by: Suren Baghdasaryan <surenb@google.com>
Co-developed-by: Kent Overstreet <kent.overstreet@linux.dev>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
---
 include/linux/codetag.h | 12 +++++++++
 kernel/module/main.c    |  4 +++
 lib/codetag.c           | 58 +++++++++++++++++++++++++++++++++++++++--
 3 files changed, 72 insertions(+), 2 deletions(-)

diff --git a/include/linux/codetag.h b/include/linux/codetag.h
index 7734269cdb63..c44f5b83f24d 100644
--- a/include/linux/codetag.h
+++ b/include/linux/codetag.h
@@ -33,6 +33,10 @@ union codetag_ref {
 struct codetag_type_desc {
 	const char *section;
 	size_t tag_size;
+	void (*module_load)(struct codetag_type *cttype,
+			    struct codetag_module *cmod);
+	void (*module_unload)(struct codetag_type *cttype,
+			      struct codetag_module *cmod);
 };
 
 struct codetag_iterator {
@@ -65,4 +69,12 @@ void codetag_to_text(struct seq_buf *out, struct codetag *ct);
 struct codetag_type *
 codetag_register_type(const struct codetag_type_desc *desc);
 
+#if defined(CONFIG_CODE_TAGGING) && defined(CONFIG_MODULES)
+void codetag_load_module(struct module *mod);
+void codetag_unload_module(struct module *mod);
+#else
+static inline void codetag_load_module(struct module *mod) {}
+static inline void codetag_unload_module(struct module *mod) {}
+#endif
+
 #endif /* _LINUX_CODETAG_H */
diff --git a/kernel/module/main.c b/kernel/module/main.c
index e1e8a7a9d6c1..ffa6b3e9cb43 100644
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -56,6 +56,7 @@
 #include <linux/dynamic_debug.h>
 #include <linux/audit.h>
 #include <linux/cfi.h>
+#include <linux/codetag.h>
 #include <linux/debugfs.h>
 #include <uapi/linux/module.h>
 #include "internal.h"
@@ -1242,6 +1243,7 @@ static void free_module(struct module *mod)
 {
 	trace_module_free(mod);
 
+	codetag_unload_module(mod);
 	mod_sysfs_teardown(mod);
 
 	/*
@@ -2995,6 +2997,8 @@ static int load_module(struct load_info *info, const char __user *uargs,
 	/* Get rid of temporary copy. */
 	free_copy(info, flags);
 
+	codetag_load_module(mod);
+
 	/* Done! */
 	trace_module_load(mod);
 
diff --git a/lib/codetag.c b/lib/codetag.c
index 8b5b89ad508d..54d2828eba25 100644
--- a/lib/codetag.c
+++ b/lib/codetag.c
@@ -124,15 +124,20 @@ static void *get_symbol(struct module *mod, const char *prefix, const char *name
 {
 	DECLARE_SEQ_BUF(sb, KSYM_NAME_LEN);
 	const char *buf;
+	void *ret;
 
 	seq_buf_printf(&sb, "%s%s", prefix, name);
 	if (seq_buf_has_overflowed(&sb))
 		return NULL;
 
 	buf = seq_buf_str(&sb);
-	return mod ?
+	preempt_disable();
+	ret = mod ?
 		(void *)find_kallsyms_symbol_value(mod, buf) :
 		(void *)kallsyms_lookup_name(buf);
+	preempt_enable();
+
+	return ret;
 }
 
 static struct codetag_range get_section_range(struct module *mod,
@@ -173,8 +178,11 @@ static int codetag_module_init(struct codetag_type *cttype, struct module *mod)
 
 	down_write(&cttype->mod_lock);
 	err = idr_alloc(&cttype->mod_idr, cmod, 0, 0, GFP_KERNEL);
-	if (err >= 0)
+	if (err >= 0) {
 		cttype->count += range_size(cttype, &range);
+		if (cttype->desc.module_load)
+			cttype->desc.module_load(cttype, cmod);
+	}
 	up_write(&cttype->mod_lock);
 
 	if (err < 0) {
@@ -185,6 +193,52 @@ static int codetag_module_init(struct codetag_type *cttype, struct module *mod)
 	return 0;
 }
 
+void codetag_load_module(struct module *mod)
+{
+	struct codetag_type *cttype;
+
+	if (!mod)
+		return;
+
+	mutex_lock(&codetag_lock);
+	list_for_each_entry(cttype, &codetag_types, link)
+		codetag_module_init(cttype, mod);
+	mutex_unlock(&codetag_lock);
+}
+
+void codetag_unload_module(struct module *mod)
+{
+	struct codetag_type *cttype;
+
+	if (!mod)
+		return;
+
+	mutex_lock(&codetag_lock);
+	list_for_each_entry(cttype, &codetag_types, link) {
+		struct codetag_module *found = NULL;
+		struct codetag_module *cmod;
+		unsigned long mod_id, tmp;
+
+		down_write(&cttype->mod_lock);
+		idr_for_each_entry_ul(&cttype->mod_idr, cmod, tmp, mod_id) {
+			if (cmod->mod && cmod->mod == mod) {
+				found = cmod;
+				break;
+			}
+		}
+		if (found) {
+			if (cttype->desc.module_unload)
+				cttype->desc.module_unload(cttype, cmod);
+
+			cttype->count -= range_size(cttype, &cmod->range);
+			idr_remove(&cttype->mod_idr, mod_id);
+			kfree(cmod);
+		}
+		up_write(&cttype->mod_lock);
+	}
+	mutex_unlock(&codetag_lock);
+}
+
 #else /* CONFIG_MODULES */
 static int codetag_module_init(struct codetag_type *cttype, struct module *mod) { return 0; }
 #endif /* CONFIG_MODULES */
-- 
2.44.0.291.gc1ea87d7ee-goog


  parent reply	other threads:[~2024-03-21 16:37 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-21 16:36 [PATCH v6 00/37] Memory allocation profiling Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 01/37] fix missing vmalloc.h includes Suren Baghdasaryan
2024-04-03 21:12   ` Nathan Chancellor
2024-04-03 21:41     ` Kent Overstreet
2024-04-03 21:48       ` David Hildenbrand
2024-04-03 22:57         ` Kent Overstreet
2024-04-04  2:55           ` Randy Dunlap
2024-03-21 16:36 ` [PATCH v6 02/37] asm-generic/io.h: Kill vmalloc.h dependency Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 03/37] mm/slub: Mark slab_free_freelist_hook() __always_inline Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 04/37] scripts/kallysms: Always include __start and __stop symbols Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 05/37] fs: Convert alloc_inode_sb() to a macro Suren Baghdasaryan
2024-03-21 20:31   ` Andrew Morton
2024-03-21 21:13     ` Suren Baghdasaryan
2024-03-21 21:15     ` Kent Overstreet
2024-03-21 22:09       ` Andrew Morton
2024-03-21 22:17         ` Kent Overstreet
2024-03-21 22:47           ` Suren Baghdasaryan
2024-04-04 16:57             ` Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 06/37] mm: introduce slabobj_ext to support slab object extensions Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 07/37] mm: introduce __GFP_NO_OBJ_EXT flag to selectively prevent slabobj_ext creation Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 08/37] mm/slab: introduce SLAB_NO_OBJ_EXT to avoid obj_ext creation Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 09/37] slab: objext: introduce objext_flags as extension to page_memcg_data_flags Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 10/37] lib: code tagging framework Suren Baghdasaryan
2024-03-21 16:36 ` Suren Baghdasaryan [this message]
2024-03-21 16:36 ` [PATCH v6 12/37] lib: prevent module unloading if memory is not freed Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 13/37] lib: add allocation tagging support for memory allocation profiling Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 14/37] lib: introduce support for page allocation tagging Suren Baghdasaryan
2024-03-26  3:12   ` Matthew Wilcox
2024-03-26  6:23     ` Suren Baghdasaryan
2024-03-27  3:24       ` Matthew Wilcox
2024-03-27  5:30         ` Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 15/37] lib: introduce early boot parameter to avoid page_ext memory overhead Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 16/37] mm: percpu: increase PERCPU_MODULE_RESERVE to accommodate allocation tags Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 17/37] change alloc_pages name in dma_map_ops to avoid name conflicts Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 18/37] mm: enable page allocation tagging Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 19/37] mm: create new codetag references during page splitting Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 20/37] mm: fix non-compound multi-order memory accounting in __free_pages Suren Baghdasaryan
2024-03-21 16:48   ` Matthew Wilcox
2024-03-21 17:04     ` Matthew Wilcox
2024-03-21 17:19       ` Suren Baghdasaryan
2024-03-21 17:22         ` Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 21/37] mm/page_ext: enable early_page_ext when CONFIG_MEM_ALLOC_PROFILING_DEBUG=y Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 22/37] lib: add codetag reference into slabobj_ext Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 23/37] mm/slab: add allocation accounting into slab allocation and free paths Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 24/37] rust: Add a rust helper for krealloc() Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 25/37] mm/slab: enable slab allocation tagging for kmalloc and friends Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 26/37] mempool: Hook up to memory allocation profiling Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 27/37] mm: percpu: Introduce pcpuobj_ext Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 28/37] mm: percpu: Add codetag reference into pcpuobj_ext Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 29/37] mm: percpu: enable per-cpu allocation tagging Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 30/37] mm: vmalloc: Enable memory allocation profiling Suren Baghdasaryan
2024-03-23 18:05   ` SeongJae Park
2024-03-25 14:56     ` Suren Baghdasaryan
2024-03-25 17:49       ` SeongJae Park
2024-03-25 17:59         ` Suren Baghdasaryan
2024-03-25 18:20           ` SeongJae Park
2024-03-26  7:51             ` Suren Baghdasaryan
2024-03-26 15:39               ` SeongJae Park
2024-04-16 19:27   ` Sourav Panda
2024-03-21 16:36 ` [PATCH v6 31/37] rhashtable: Plumb through alloc tag Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 32/37] lib: add memory allocations report in show_mem() Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 33/37] codetag: debug: skip objext checking when it's for objext itself Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 34/37] codetag: debug: mark codetags for reserved pages as empty Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 35/37] codetag: debug: introduce OBJEXTS_ALLOC_FAIL to mark failed slab_ext allocations Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 36/37] MAINTAINERS: Add entries for code tagging and memory allocation profiling Suren Baghdasaryan
2024-03-21 16:36 ` [PATCH v6 37/37] memprofiling: Documentation Suren Baghdasaryan
2024-03-21 20:41 ` [PATCH v6 00/37] Memory allocation profiling Andrew Morton
2024-03-21 21:08   ` Suren Baghdasaryan
2024-04-05 13:37 ` Klara Modin
2024-04-05 14:14   ` Suren Baghdasaryan
2024-04-05 14:30     ` Klara Modin
2024-04-05 15:20       ` Suren Baghdasaryan
2024-04-05 15:37         ` Klara Modin
2024-04-06 21:42           ` Suren Baghdasaryan
2024-04-25  1:59 ` Kees Cook
2024-04-25  3:25   ` Kent Overstreet
2024-04-25 15:39     ` Suren Baghdasaryan
2024-04-25 20:00       ` Kees Cook
2024-04-25 21:35         ` Suren Baghdasaryan
2024-04-25 20:08 ` Kees Cook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240321163705.3067592-12-surenb@google.com \
    --to=surenb@google.com \
    --cc=42.hyeyoo@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=aliceryhl@google.com \
    --cc=andreyknvl@gmail.com \
    --cc=arnd@arndb.de \
    --cc=axboe@kernel.dk \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=catalin.marinas@arm.com \
    --cc=cgroups@vger.kernel.org \
    --cc=cl@linux.com \
    --cc=corbet@lwn.net \
    --cc=dave.hansen@linux.intel.com \
    --cc=dave@stgolabs.net \
    --cc=david@redhat.com \
    --cc=dennis@kernel.org \
    --cc=dhowells@redhat.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=dvyukov@google.com \
    --cc=ebiggers@google.com \
    --cc=elver@google.com \
    --cc=glider@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hannes@cmpxchg.org \
    --cc=hughd@google.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=iommu@lists.linux.dev \
    --cc=jbaron@akamai.com \
    --cc=jhubbard@nvidia.com \
    --cc=juri.lelli@redhat.com \
    --cc=kaleshsingh@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=keescook@chromium.org \
    --cc=kent.overstreet@linux.dev \
    --cc=kernel-team@android.com \
    --cc=liam.howlett@oracle.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-modules@vger.kernel.org \
    --cc=masahiroy@kernel.org \
    --cc=mcgrof@kernel.org \
    --cc=mgorman@suse.de \
    --cc=mhocko@suse.com \
    --cc=minchan@google.com \
    --cc=mingo@redhat.com \
    --cc=muchun.song@linux.dev \
    --cc=nathan@kernel.org \
    --cc=ndesaulniers@google.com \
    --cc=pasha.tatashin@soleen.com \
    --cc=paulmck@kernel.org \
    --cc=penberg@kernel.org \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=peterx@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=rostedt@goodmis.org \
    --cc=rppt@kernel.org \
    --cc=songmuchun@bytedance.com \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=vbabka@suse.cz \
    --cc=vincent.guittot@linaro.org \
    --cc=void@manifault.com \
    --cc=vschneid@redhat.com \
    --cc=vvvvvv@google.com \
    --cc=will@kernel.org \
    --cc=willy@infradead.org \
    --cc=x86@kernel.org \
    --cc=yosryahmed@google.com \
    --cc=ytcoode@gmail.com \
    --cc=yuzhao@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.