mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
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: 621191d709 ("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>
This commit is contained in:
parent
649dd13549
commit
a9708e550d
|
|
@ -40,12 +40,14 @@ mshv_port_table_fini(void)
|
|||
int
|
||||
mshv_portid_alloc(struct port_table_info *info)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
idr_preload(GFP_KERNEL);
|
||||
idr_lock(&port_table_idr);
|
||||
ret = idr_alloc(&port_table_idr, info, PORTID_MIN,
|
||||
PORTID_MAX, GFP_KERNEL);
|
||||
PORTID_MAX, GFP_NOWAIT);
|
||||
idr_unlock(&port_table_idr);
|
||||
idr_preload_end();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user