Lockdep checks that dynamic key registration is only performed on keys
that are not static objects. With KFENCE, it is possible that such a
dynamically allocated key is a KFENCE object which may, however, be
allocated from a static memory pool (if HAVE_ARCH_KFENCE_STATIC_POOL).

Therefore, ignore KFENCE-allocated objects in static_obj().

Reviewed-by: Dmitry Vyukov <dvyu...@google.com>
Co-developed-by: Alexander Potapenko <gli...@google.com>
Signed-off-by: Alexander Potapenko <gli...@google.com>
Signed-off-by: Marco Elver <el...@google.com>
---
 kernel/locking/lockdep.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 54b74fabf40c..0cf5d5ecbd31 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -38,6 +38,7 @@
 #include <linux/seq_file.h>
 #include <linux/spinlock.h>
 #include <linux/kallsyms.h>
+#include <linux/kfence.h>
 #include <linux/interrupt.h>
 #include <linux/stacktrace.h>
 #include <linux/debug_locks.h>
@@ -755,6 +756,13 @@ static int static_obj(const void *obj)
        if (arch_is_kernel_initmem_freed(addr))
                return 0;
 
+       /*
+        * KFENCE objects may be allocated from a static memory pool, but are
+        * not actually static objects.
+        */
+       if (is_kfence_address(obj))
+               return 0;
+
        /*
         * static variable?
         */
-- 
2.28.0.709.gb0816b6eb0-goog

Reply via email to