[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <b9fdff48-da6a-4190-addb-acb948ea9ad7@redhat.com>
Date: Wed, 12 Feb 2025 22:00:29 -0500
From: Waiman Long <llong@...hat.com>
To: Andrey Konovalov <andreyknvl@...il.com>,
Peter Zijlstra <peterz@...radead.org>
Cc: Andrey Ryabinin <ryabinin.a.a@...il.com>,
Alexander Potapenko <glider@...gle.com>, Dmitry Vyukov <dvyukov@...gle.com>,
Vincenzo Frascino <vincenzo.frascino@....com>,
Andrew Morton <akpm@...ux-foundation.org>,
Sebastian Andrzej Siewior <bigeasy@...utronix.de>,
Clark Williams <clrkwllms@...nel.org>, Steven Rostedt <rostedt@...dmis.org>,
kasan-dev@...glegroups.com, linux-mm@...ck.org,
linux-kernel@...r.kernel.org, linux-rt-devel@...ts.linux.dev,
Nico Pache <npache@...hat.com>
Subject: Re: [PATCH v2] kasan: Don't call find_vm_area() in RT kernel
On 2/12/25 8:48 PM, Andrey Konovalov wrote:
> On Wed, Feb 12, 2025 at 5:22 PM Waiman Long <longman@...hat.com> wrote:
>> The following bug report appeared with a test run in a RT debug kernel.
>>
>> [ 3359.353842] BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
>> [ 3359.353848] in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 140605, name: kunit_try_catch
>> [ 3359.353853] preempt_count: 1, expected: 0
>> :
>> [ 3359.353933] Call trace:
>> :
>> [ 3359.353955] rt_spin_lock+0x70/0x140
>> [ 3359.353959] find_vmap_area+0x84/0x168
>> [ 3359.353963] find_vm_area+0x1c/0x50
>> [ 3359.353966] print_address_description.constprop.0+0x2a0/0x320
>> [ 3359.353972] print_report+0x108/0x1f8
>> [ 3359.353976] kasan_report+0x90/0xc8
>> [ 3359.353980] __asan_load1+0x60/0x70
>>
>> Commit e30a0361b851 ("kasan: make report_lock a raw spinlock")
>> changes report_lock to a raw_spinlock_t to avoid a similar RT problem.
>> The print_address_description() function is called with report_lock
>> acquired and interrupt disabled. However, the find_vm_area() function
>> still needs to acquire a spinlock_t which becomes a sleeping lock in
>> the RT kernel. IOW, we can't call find_vm_area() in a RT kernel and
>> changing report_lock to a raw_spinlock_t is not enough to completely
>> solve this RT kernel problem.
>>
>> Fix this bug report by skipping the find_vm_area() call in this case
>> and just print out the address as is.
>>
>> For !RT kernel, follow the example set in commit 0cce06ba859a
>> ("debugobjects,locking: Annotate debug_object_fill_pool() wait type
>> violation") and use DEFINE_WAIT_OVERRIDE_MAP() to avoid a spinlock_t
>> inside raw_spinlock_t warning.
> Would it be possible to get lockdep to allow taking spinlock_t inside
> raw_spinlock_t instead of annotating the callers for the !RT case? Or
> is this a rare thing for this to be allowed on !RT?
Lockdep currently issues warnings for taking spinlock_t inside
raw_spinlock_t because it is not allowed in RT. Test coverage of RT
kernels is likely less than !RT kernel and so less bug of this kind will
be caught. By making !RT doing the same check, we increase coverage.
However, we do allow override in the !RT case, but it has to be done on
a case-by-case basis.
Currently we only do that for debugging code, not the code that will be
used in production kernel yet.
Cheers,
Longman
Powered by blists - more mailing lists