diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e3fb290194c0..3ede25e6686e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2624,10 +2624,17 @@ retry_cpuset: | |||
2624 | page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, nodemask, order, | 2624 | page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, nodemask, order, |
2625 | zonelist, high_zoneidx, alloc_flags, | 2625 | zonelist, high_zoneidx, alloc_flags, |
2626 | preferred_zone, migratetype); | 2626 | preferred_zone, migratetype); |
2627 | if (unlikely(!page)) | 2627 | if (unlikely(!page)) { |
2628 | /* | ||
2629 | * Runtime PM, block IO and its error handling path | ||
2630 | * can deadlock because I/O on the device might not | ||
2631 | * complete. | ||
2632 | */ | ||
2633 | gfp_mask = memalloc_noio_flags(gfp_mask); | ||
2628 | page = __alloc_pages_slowpath(gfp_mask, order, | 2634 | page = __alloc_pages_slowpath(gfp_mask, order, |
2629 | zonelist, high_zoneidx, nodemask, | 2635 | zonelist, high_zoneidx, nodemask, |
2630 | preferred_zone, migratetype); | 2636 | preferred_zone, migratetype); |
2637 | } | ||
2631 | 2638 | ||
2632 | trace_mm_page_alloc(page, order, gfp_mask, migratetype); | 2639 | trace_mm_page_alloc(page, order, gfp_mask, migratetype); |
2633 | 2640 | ||