[Devel] [PATCH rh7] mm/page_alloc: fix allocation failure of zone-restricted allocation
Andrey Ryabinin
aryabinin at virtuozzo.com
Wed Mar 27 18:17:50 MSK 2019
The following command sequence fails:
mkdir -p /sys/fs/cgroup/cpuset/test
echo 1 > /sys/fs/cgroup/cpuset/test/cpuset.mems
echo 1 > /sys/fs/cgroup/cpuset/test/cpuset.cpus
echo $$ > /sys/fs/cgroup/cpuset/test/tasks
/usr/libexec/qemu-kvm -enable-kvm
kvm_init_vcpu failed: Cannot allocate memory
kvm_init_vcpu() calls KVM_CREATE_VCPU ioctl() which fails with
ENOMEM because it calls __alloc_page(GFP_KERNEL|__GFP_DMA32)
and DMA32 zone present only on NUMA node 0 while process is bound
to the 1 NUMA node. However such allocation should fail, because
there is no __GFP_HARDWALL flag, thus it allowed to fallback
to the 0 NUMA node.
Allocation fails because on the fast-path we try to find zone
withing cpuset_current_mems_allowed nodemask and don't fallback
to default nodemask if zone not found.
https://jira.sw.ru/browse/PSBM-92274
Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
mm/page_alloc.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 5dc48331242a..45da030d8da2 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3576,6 +3576,14 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order,
first_zones_zonelist(zonelist, high_zoneidx,
nodemask ? : &cpuset_current_mems_allowed,
&preferred_zone);
+
+ /*
+ * No zone within cpuset_current_mems_allowed nodemask?
+ * Fallback to default nodemask.
+ */
+ if (!preferred_zone && !nodemask)
+ first_zones_zonelist(zonelist, high_zoneidx,
+ nodemask, &preferred_zone);
if (!preferred_zone)
goto out;
--
2.19.2
More information about the Devel
mailing list