diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_alloc.c | 9 | ||||
-rw-r--r-- | mm/vmscan.c | 4 |
2 files changed, 10 insertions, 3 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 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index b93968b71dc6..a68fa20269d9 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -2352,7 +2352,7 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, | |||
2352 | { | 2352 | { |
2353 | unsigned long nr_reclaimed; | 2353 | unsigned long nr_reclaimed; |
2354 | struct scan_control sc = { | 2354 | struct scan_control sc = { |
2355 | .gfp_mask = gfp_mask, | 2355 | .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), |
2356 | .may_writepage = !laptop_mode, | 2356 | .may_writepage = !laptop_mode, |
2357 | .nr_to_reclaim = SWAP_CLUSTER_MAX, | 2357 | .nr_to_reclaim = SWAP_CLUSTER_MAX, |
2358 | .may_unmap = 1, | 2358 | .may_unmap = 1, |
@@ -3313,7 +3313,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | |||
3313 | .may_unmap = !!(zone_reclaim_mode & RECLAIM_SWAP), | 3313 | .may_unmap = !!(zone_reclaim_mode & RECLAIM_SWAP), |
3314 | .may_swap = 1, | 3314 | .may_swap = 1, |
3315 | .nr_to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX), | 3315 | .nr_to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX), |
3316 | .gfp_mask = gfp_mask, | 3316 | .gfp_mask = (gfp_mask = memalloc_noio_flags(gfp_mask)), |
3317 | .order = order, | 3317 | .order = order, |
3318 | .priority = ZONE_RECLAIM_PRIORITY, | 3318 | .priority = ZONE_RECLAIM_PRIORITY, |
3319 | }; | 3319 | }; |