mshv: Fix sleeping under spinlock in mshv_portid_alloc
authorStanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Thu, 7 May 2026 15:43:59 +0000 (15:43 +0000)
committerWei Liu <wei.liu@kernel.org>
Wed, 22 Jul 2026 23:51:30 +0000 (23:51 +0000)
commita9708e550d11a53b22d932cdbfaa10c26346a2d0
tree71f67f645f7c95d52368f60bfdca3ab5506f3e66
parent649dd135491945afa544351e3e6d4a727de87020
mshv: Fix sleeping under spinlock in mshv_portid_alloc

idr_alloc() is called with GFP_KERNEL inside idr_lock(), which holds a
spinlock. GFP_KERNEL allows the allocator to sleep, triggering a
sleeping-while-atomic bug.

Fix by using idr_preload(GFP_KERNEL) before taking the lock to
pre-allocate memory in a sleepable context, then idr_alloc() with
GFP_NOWAIT inside the spinlock-protected section.

Fixes: 621191d709b1 ("Drivers: hv: Introduce mshv_root module to expose /dev/mshv to VMMs")
Signed-off-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Reviewed-by: Anirudh Rayabharam (Microsoft) <anirudh@anirudhrb.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
drivers/hv/mshv_portid_table.c