Messages in this thread | | | Date | Fri, 10 Dec 2021 11:22:09 +0000 | From | Catalin Marinas <> | Subject | Re: [PATCH v2] arm64/mm: avoid fixmap race condition when create pud mapping |
| |
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 <jianyong.wu@arm.com>
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: <stable@vger.kernel.org> # 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
| |