]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
kmsan: rework kmsan_in_runtime() handling in kmsan_report()
authorAlexander Potapenko <glider@google.com>
Wed, 7 May 2025 16:00:12 +0000 (18:00 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 21 May 2025 16:55:16 +0000 (09:55 -0700)
kmsan_report() calls used to require entering/leaving the runtime around
them.  To simplify the things, drop this requirement and move calls to
kmsan_enter_runtime()/kmsan_leave_runtime() into kmsan_report().

Link: https://lkml.kernel.org/r/20250507160012.3311104-5-glider@google.com
Signed-off-by: Alexander Potapenko <glider@google.com>
Cc: Marco Elver <elver@google.com>
Cc: Bart Van Assche <bvanassche@acm.org>
Cc: Kent Overstreet <kent.overstreet@linux.dev>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/kmsan/core.c
mm/kmsan/instrumentation.c
mm/kmsan/report.c

index a97dc90fa6a93d3da55b7f7412554ac8de45db20..1ea711786c522d9edac0a352bd929bdd18a35d7b 100644 (file)
@@ -274,11 +274,9 @@ void kmsan_internal_check_memory(void *addr, size_t size,
                         * bytes before, report them.
                         */
                        if (cur_origin) {
-                               kmsan_enter_runtime();
                                kmsan_report(cur_origin, addr, size,
                                             cur_off_start, pos - 1, user_addr,
                                             reason);
-                               kmsan_leave_runtime();
                        }
                        cur_origin = 0;
                        cur_off_start = -1;
@@ -292,11 +290,9 @@ void kmsan_internal_check_memory(void *addr, size_t size,
                                 * poisoned bytes before, report them.
                                 */
                                if (cur_origin) {
-                                       kmsan_enter_runtime();
                                        kmsan_report(cur_origin, addr, size,
                                                     cur_off_start, pos + i - 1,
                                                     user_addr, reason);
-                                       kmsan_leave_runtime();
                                }
                                cur_origin = 0;
                                cur_off_start = -1;
@@ -312,11 +308,9 @@ void kmsan_internal_check_memory(void *addr, size_t size,
                         */
                        if (cur_origin != new_origin) {
                                if (cur_origin) {
-                                       kmsan_enter_runtime();
                                        kmsan_report(cur_origin, addr, size,
                                                     cur_off_start, pos + i - 1,
                                                     user_addr, reason);
-                                       kmsan_leave_runtime();
                                }
                                cur_origin = new_origin;
                                cur_off_start = pos + i;
@@ -326,10 +320,8 @@ void kmsan_internal_check_memory(void *addr, size_t size,
        }
        KMSAN_WARN_ON(pos != size);
        if (cur_origin) {
-               kmsan_enter_runtime();
                kmsan_report(cur_origin, addr, size, cur_off_start, pos - 1,
                             user_addr, reason);
-               kmsan_leave_runtime();
        }
 }
 
index 02a405e55d6ca26803b6cc4d829d2cd75768d683..69f0a57a401c414c1c491f178d87a79a21f088cf 100644 (file)
@@ -312,13 +312,9 @@ EXPORT_SYMBOL(__msan_unpoison_alloca);
 void __msan_warning(u32 origin);
 void __msan_warning(u32 origin)
 {
-       if (!kmsan_enabled || kmsan_in_runtime())
-               return;
-       kmsan_enter_runtime();
        kmsan_report(origin, /*address*/ NULL, /*size*/ 0,
                     /*off_first*/ 0, /*off_last*/ 0, /*user_addr*/ NULL,
                     REASON_ANY);
-       kmsan_leave_runtime();
 }
 EXPORT_SYMBOL(__msan_warning);
 
index 94a3303fb65e0d48ed121abdd5e298d5cf015f8e..d6853ce089541d06d13036e4a9f39ca45155e342 100644 (file)
@@ -157,14 +157,14 @@ void kmsan_report(depot_stack_handle_t origin, void *address, int size,
        unsigned long ua_flags;
        bool is_uaf;
 
-       if (!kmsan_enabled)
+       if (!kmsan_enabled || kmsan_in_runtime())
                return;
        if (current->kmsan_ctx.depth)
                return;
        if (!origin)
                return;
 
-       kmsan_disable_current();
+       kmsan_enter_runtime();
        ua_flags = user_access_save();
        raw_spin_lock(&kmsan_report_lock);
        pr_err("=====================================================\n");
@@ -217,5 +217,5 @@ void kmsan_report(depot_stack_handle_t origin, void *address, int size,
        if (panic_on_kmsan)
                panic("kmsan.panic set ...\n");
        user_access_restore(ua_flags);
-       kmsan_enable_current();
+       kmsan_leave_runtime();
 }