Re: [PATCH v2] arm64/mm: avoid fixmap race condition when create pud mapping
From: Catalin Marinas <catalin.marinas@arm.com>
Date: 2021-12-10 11:22:19
Also in:
lkml
On Fri, Dec 10, 2021 at 05:54:32PM +0800, Jianyong Wu wrote:
fixmap is a global resource and is used recursively in create pud mapping.
It may lead to race condition when alloc_init_pud is called concurrently.
Fox example:
alloc_init_pud is called when kernel_init. If memory hotplug
thread, which will also call alloc_init_pud, happens during
kernel_init, the race for fixmap occurs.
The race condition flow can be:
*************** begin **************
kerenl_init thread virtio-mem workqueue thread
================== ======== ==================
alloc_init_pud(...)
pudp = pud_set_fixmap_offset(..) alloc_init_pud(...)
... ...
READ_ONCE(*pudp) //OK! pudp = pud_set_fixmap_offset(
... ...
pud_clear_fixmap() //fixmap break
READ_ONCE(*pudp) //CRASH!
**************** end ***************
Hence, a spin lock is introduced to protect the fixmap during create pdg
mapping.
Signed-off-by: Jianyong Wu <redacted>
It looks fine to me:
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Do we need a cc stable? Fixmap was introduced in 4.6, so usually:
Fixes: f4710445458c ("arm64: mm: use fixmap when creating page tables")
Cc: <redacted> # 4.6.x
but I haven't checked when memory hotplug was added to be able to
trigger the race. It may not need to go back that far.
--
Catalin
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel