From: Greg Kroah-Hartman Date: Wed, 10 Mar 2021 12:16:26 +0000 (+0100) Subject: 5.4-stable patches X-Git-Tag: v4.4.261~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ac2540ac1a7c42aae47a5272a421d85f8369ce70;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: iommu-amd-fix-sleeping-in-atomic-in-increase_address_space.patch --- diff --git a/queue-5.4/iommu-amd-fix-sleeping-in-atomic-in-increase_address_space.patch b/queue-5.4/iommu-amd-fix-sleeping-in-atomic-in-increase_address_space.patch new file mode 100644 index 00000000000..05eaf60b50c --- /dev/null +++ b/queue-5.4/iommu-amd-fix-sleeping-in-atomic-in-increase_address_space.patch @@ -0,0 +1,80 @@ +From 140456f994195b568ecd7fc2287a34eadffef3ca Mon Sep 17 00:00:00 2001 +From: Andrey Ryabinin +Date: Wed, 17 Feb 2021 17:30:04 +0300 +Subject: iommu/amd: Fix sleeping in atomic in increase_address_space() + +From: Andrey Ryabinin + +commit 140456f994195b568ecd7fc2287a34eadffef3ca upstream. + +increase_address_space() calls get_zeroed_page(gfp) under spin_lock with +disabled interrupts. gfp flags passed to increase_address_space() may allow +sleeping, so it comes to this: + + BUG: sleeping function called from invalid context at mm/page_alloc.c:4342 + in_atomic(): 1, irqs_disabled(): 1, pid: 21555, name: epdcbbf1qnhbsd8 + + Call Trace: + dump_stack+0x66/0x8b + ___might_sleep+0xec/0x110 + __alloc_pages_nodemask+0x104/0x300 + get_zeroed_page+0x15/0x40 + iommu_map_page+0xdd/0x3e0 + amd_iommu_map+0x50/0x70 + iommu_map+0x106/0x220 + vfio_iommu_type1_ioctl+0x76e/0x950 [vfio_iommu_type1] + do_vfs_ioctl+0xa3/0x6f0 + ksys_ioctl+0x66/0x70 + __x64_sys_ioctl+0x16/0x20 + do_syscall_64+0x4e/0x100 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + +Fix this by moving get_zeroed_page() out of spin_lock/unlock section. + +Fixes: 754265bcab ("iommu/amd: Fix race in increase_address_space()") +Signed-off-by: Andrey Ryabinin +Acked-by: Will Deacon +Cc: +Link: https://lore.kernel.org/r/20210217143004.19165-1-arbn@yandex-team.com +Signed-off-by: Joerg Roedel +Signed-off-by: Andrey Ryabinin +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/iommu/amd_iommu.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -1469,25 +1469,27 @@ static bool increase_address_space(struc + bool ret = false; + u64 *pte; + ++ pte = (void *)get_zeroed_page(gfp); ++ if (!pte) ++ return false; ++ + spin_lock_irqsave(&domain->lock, flags); + + if (address <= PM_LEVEL_SIZE(domain->mode) || + WARN_ON_ONCE(domain->mode == PAGE_MODE_6_LEVEL)) + goto out; + +- pte = (void *)get_zeroed_page(gfp); +- if (!pte) +- goto out; +- + *pte = PM_LEVEL_PDE(domain->mode, + iommu_virt_to_phys(domain->pt_root)); + domain->pt_root = pte; + domain->mode += 1; + ++ pte = NULL; + ret = true; + + out: + spin_unlock_irqrestore(&domain->lock, flags); ++ free_page((unsigned long)pte); + + return ret; + } diff --git a/queue-5.4/series b/queue-5.4/series index 19a6461b3ac..308c81dfaa8 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -3,3 +3,4 @@ dm-table-fix-iterate_devices-based-device-capability-checks.patch dm-table-fix-dax-iterate_devices-based-device-capability-checks.patch dm-table-fix-zoned-iterate_devices-based-device-capability-checks.patch acpica-fix-race-in-generic_serial_bus-i2c-and-gpio-op_region-parameter-handling.patch +iommu-amd-fix-sleeping-in-atomic-in-increase_address_space.patch