diff options
-rw-r--r-- | mm/memcontrol.c | 9 | ||||
-rw-r--r-- | mm/vmscan.c | 2 |
2 files changed, 11 insertions, 0 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index ae052b5e3315..0f870ba43942 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1917,6 +1917,15 @@ retry: | |||
1917 | current->flags & PF_EXITING)) | 1917 | current->flags & PF_EXITING)) |
1918 | goto force; | 1918 | goto force; |
1919 | 1919 | ||
1920 | /* | ||
1921 | * Prevent unbounded recursion when reclaim operations need to | ||
1922 | * allocate memory. This might exceed the limits temporarily, | ||
1923 | * but we prefer facilitating memory reclaim and getting back | ||
1924 | * under the limit over triggering OOM kills in these cases. | ||
1925 | */ | ||
1926 | if (unlikely(current->flags & PF_MEMALLOC)) | ||
1927 | goto force; | ||
1928 | |||
1920 | if (unlikely(task_in_memcg_oom(current))) | 1929 | if (unlikely(task_in_memcg_oom(current))) |
1921 | goto nomem; | 1930 | goto nomem; |
1922 | 1931 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index 744f926af442..76fda2268148 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -3043,7 +3043,9 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, | |||
3043 | sc.gfp_mask, | 3043 | sc.gfp_mask, |
3044 | sc.reclaim_idx); | 3044 | sc.reclaim_idx); |
3045 | 3045 | ||
3046 | current->flags |= PF_MEMALLOC; | ||
3046 | nr_reclaimed = do_try_to_free_pages(zonelist, &sc); | 3047 | nr_reclaimed = do_try_to_free_pages(zonelist, &sc); |
3048 | current->flags &= ~PF_MEMALLOC; | ||
3047 | 3049 | ||
3048 | trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed); | 3050 | trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed); |
3049 | 3051 | ||