From: Catalin Marinas <catalin.marinas@arm.com>
To: Vincenzo Frascino <vincenzo.frascino@arm.com>
Cc: Branislav Rankov <Branislav.Rankov@arm.com>,
Marco Elver <elver@google.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Andrey Konovalov <andreyknvl@google.com>,
Evgenii Stepanov <eugenis@google.com>,
linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com,
Alexander Potapenko <glider@google.com>,
linux-arm-kernel@lists.infradead.org,
Andrey Ryabinin <aryabinin@virtuozzo.com>,
Andrew Morton <akpm@linux-foundation.org>,
Will Deacon <will@kernel.org>, Dmitry Vyukov <dvyukov@google.com>
Subject: Re: [PATCH v13 4/7] arm64: mte: Enable TCO in functions that can read beyond buffer limits
Date: Mon, 22 Feb 2021 17:58:26 +0000 [thread overview]
Message-ID: <20210222175825.GE19604@arm.com> (raw)
In-Reply-To: <c3d565da-c446-dea2-266e-ef35edabca9c@arm.com>
On Mon, Feb 22, 2021 at 12:08:07PM +0000, Vincenzo Frascino wrote:
> On 2/12/21 5:21 PM, Catalin Marinas wrote:
> >> +
> >> + /*
> >> + * This function is called on each active smp core at boot
> >> + * time, hence we do not need to take cpu_hotplug_lock again.
> >> + */
> >> + static_branch_enable_cpuslocked(&mte_async_mode);
> >> }
> > Sorry, I missed the cpuslocked aspect before. Is there any reason you
> > need to use this API here? I suggested to add it to the
> > mte_enable_kernel_sync() because kasan may at some point do this
> > dynamically at run-time, so the boot-time argument doesn't hold. But
> > it's also incorrect as this function will be called for hot-plugged
> > CPUs as well after boot.
> >
> > The only reason for static_branch_*_cpuslocked() is if it's called from
> > a region that already invoked cpus_read_lock() which I don't think is
> > the case here.
>
> I agree with your analysis on why static_branch_*_cpuslocked() is needed, in
> fact cpus_read_lock() takes cpu_hotplug_lock as per comment on top of the line
> of code.
>
> If I try to take that lock when enabling the secondary cores I end up in the
> situation below:
>
> [ 0.283402] smp: Bringing up secondary CPUs ...
> ....
> [ 5.890963] Call trace:
> [ 5.891050] dump_backtrace+0x0/0x19c
> [ 5.891212] show_stack+0x18/0x70
> [ 5.891373] dump_stack+0xd0/0x12c
> [ 5.891531] dequeue_task_idle+0x28/0x40
> [ 5.891686] __schedule+0x45c/0x6c0
> [ 5.891851] schedule+0x70/0x104
> [ 5.892010] percpu_rwsem_wait+0xe8/0x104
> [ 5.892174] __percpu_down_read+0x5c/0x90
> [ 5.892332] percpu_down_read.constprop.0+0xbc/0xd4
> [ 5.892497] cpus_read_lock+0x10/0x1c
> [ 5.892660] static_key_enable+0x18/0x3c
> [ 5.892823] mte_enable_kernel_async+0x40/0x70
> [ 5.892988] kasan_init_hw_tags_cpu+0x50/0x60
> [ 5.893144] cpu_enable_mte+0x24/0x70
> [ 5.893304] verify_local_cpu_caps+0x58/0x120
> [ 5.893465] check_local_cpu_capabilities+0x18/0x1f0
> [ 5.893626] secondary_start_kernel+0xe0/0x190
> [ 5.893790] 0x0
> [ 5.893975] bad: scheduling from the idle thread!
> [ 5.894065] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G W
> 5.11.0-rc7-10587-g22cd50bcfcf-dirty #6
>
> and the kernel panics.
That's because cpu_hotplug_lock is not a spinlock but a semaphore which
implies sleeping. I don't think avoiding taking this semaphore
altogether (as in the *_cpuslocked functions) is the correct workaround.
The mte_enable_kernel_async() function is called on each secondary CPU
but we don't really need to attempt to toggle the static key on each of
them as they all have the same configuration. Maybe do something like:
if (!static_branch_unlikely(&mte_async_mode)))
static_branch_enable(&mte_async_mode);
so that it's only set on the boot CPU.
The alternative is to use a per-CPU mask/variable instead of static
branches but it's probably too expensive for those functions that were
meant to improve performance.
We'll still have an issue with dynamically switching the async/sync mode
at run-time. Luckily kasan doesn't do this now. The problem is that
until the last CPU have been switched from async to sync, we can't
toggle the static label. When switching from sync to async, we need
to do it on the first CPU being switched.
So, I think currently we can set the mte_async_mode label to true in
mte_enable_kernel_async(), with the 'if' check above. For
mte_enable_kernel_sync(), don't bother with setting the key to false but
place a WARN_ONCE if the mte_async_mode is true. We can revisit it if
kasan ever gains this run-time switch mode.
--
Catalin
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-02-22 17:59 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-11 15:33 [PATCH v13 0/7] arm64: ARMv8.5-A: MTE: Add async mode support Vincenzo Frascino
2021-02-11 15:33 ` [PATCH v13 1/7] arm64: mte: Add asynchronous " Vincenzo Frascino
2021-02-12 21:21 ` Andrey Konovalov
2021-02-22 11:14 ` Vincenzo Frascino
2021-02-11 15:33 ` [PATCH v13 2/7] kasan: Add KASAN mode kernel parameter Vincenzo Frascino
2021-02-11 17:50 ` Andrey Konovalov
2021-02-12 11:26 ` Vincenzo Frascino
2021-02-11 15:33 ` [PATCH v13 3/7] kasan: Add report for async mode Vincenzo Frascino
2021-02-11 20:03 ` kernel test robot
2021-02-11 20:13 ` Andrey Konovalov
2021-02-12 11:25 ` Vincenzo Frascino
2021-02-12 14:47 ` Andrey Konovalov
2021-02-11 15:33 ` [PATCH v13 4/7] arm64: mte: Enable TCO in functions that can read beyond buffer limits Vincenzo Frascino
2021-02-12 17:21 ` Catalin Marinas
2021-02-22 12:08 ` Vincenzo Frascino
2021-02-22 17:58 ` Catalin Marinas [this message]
2021-02-23 10:56 ` Vincenzo Frascino
2021-02-23 12:05 ` Catalin Marinas
2021-02-23 12:22 ` Vincenzo Frascino
2021-02-23 12:49 ` Will Deacon
2021-02-23 13:14 ` Catalin Marinas
2021-02-23 14:25 ` Vincenzo Frascino
2021-02-11 15:33 ` [PATCH v13 5/7] arm64: mte: Enable async tag check fault Vincenzo Frascino
2021-02-11 15:33 ` [PATCH v13 6/7] arm64: mte: Report async tag faults before suspend Vincenzo Frascino
2021-02-12 12:00 ` Lorenzo Pieralisi
2021-02-12 12:30 ` Lorenzo Pieralisi
2021-02-12 13:05 ` Vincenzo Frascino
2021-02-12 13:19 ` Catalin Marinas
2021-02-12 17:24 ` Catalin Marinas
2021-02-11 15:33 ` [PATCH v13 7/7] kasan: don't run tests in async mode Vincenzo Frascino
2021-02-12 17:22 ` Catalin Marinas
2021-02-12 21:44 ` Andrey Konovalov
2021-02-22 11:17 ` Vincenzo Frascino
2021-02-22 13:35 ` Andrey Konovalov
2021-02-11 15:45 ` [PATCH v13 0/7] arm64: ARMv8.5-A: MTE: Add async mode support Vincenzo Frascino
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=20210222175825.GE19604@arm.com \
--to=catalin.marinas@arm.com \
--cc=Branislav.Rankov@arm.com \
--cc=akpm@linux-foundation.org \
--cc=andreyknvl@google.com \
--cc=aryabinin@virtuozzo.com \
--cc=dvyukov@google.com \
--cc=elver@google.com \
--cc=eugenis@google.com \
--cc=glider@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=vincenzo.frascino@arm.com \
--cc=will@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).