On Tue, Jan 9, 2024 at 4:51 PM Liam R. Howlett <Liam.Howlett@xxxxxxxxxx> wrote: > > * Paul E. McKenney <paulmck@xxxxxxxxxx> [240109 09:04]: > > Hello! > > > > I get the splat shown below when running rcutorture on next-20240108 > > (and some less-recent -next versions) on scenarios that run KASAN and > > that also enable CONFIG_DEBUG_LOCK_ALLOC=y. I am running gcc 8.5.0. > > > > Bisection fingers this commit: > > > > a414d4286f34 ("kasan: handle concurrent kasan_record_aux_stack calls") > > > > This commit does not appear to be trying to change the annotation > > required of KASAN users, so I suspect that the commit is at fault. I am > > including Liam in case Maple Tree is the bad guy, and should call_rcu() > > need adjustment, here I am. ;-) > > > > Thoughts? > > > I think this is ma_free_rcu() registering mt_free_rcu() in > lib/maple_tree.c. > > The commit you point to saves and restores the irq state in > __kasan_record_aux_stack(), but the trace below shows it is called prior > to irqs being initialized. This isn't what lockdep is yelling about, so > what am I missing? Maybe it will be caught after this issue is > resolved? Hm, I see a discrepancy in the KASAN code related to the guilty commit. I believed it to be harmless, but perhaps it is not. Paul, could you check if the attached patch fixes the issue for you? This is rather a quick fix than a proper one, but let's see if this one works. Thanks!
diff --git a/mm/kasan/common.c b/mm/kasan/common.c index 223af53d4338..0143c1b82004 100644 --- a/mm/kasan/common.c +++ b/mm/kasan/common.c @@ -208,10 +208,6 @@ static inline u8 assign_tag(struct kmem_cache *cache, void * __must_check __kasan_init_slab_obj(struct kmem_cache *cache, const void *object) { - /* Initialize per-object metadata if it is present. */ - if (kasan_requires_meta()) - kasan_init_object_meta(cache, object); - /* Tag is ignored in set_tag() without CONFIG_KASAN_SW/HW_TAGS */ object = set_tag(object, assign_tag(cache, object, true)); @@ -338,6 +334,10 @@ void * __must_check __kasan_slab_alloc(struct kmem_cache *cache, if (is_kfence_address(object)) return (void *)object; + /* Initialize per-object metadata if it is present. */ + if (kasan_requires_meta()) + kasan_init_object_meta(cache, object); + /* * Generate and assign random tag for tag-based modes. * Tag is ignored in set_tag() for the generic mode.