diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e2ef1c17942f..7e2fb6e38f34 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -3922,6 +3922,7 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order, | |||
3922 | { | 3922 | { |
3923 | struct zone *zone; | 3923 | struct zone *zone; |
3924 | struct zoneref *z; | 3924 | struct zoneref *z; |
3925 | bool ret = false; | ||
3925 | 3926 | ||
3926 | /* | 3927 | /* |
3927 | * Costly allocations might have made a progress but this doesn't mean | 3928 | * Costly allocations might have made a progress but this doesn't mean |
@@ -3985,25 +3986,24 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order, | |||
3985 | } | 3986 | } |
3986 | } | 3987 | } |
3987 | 3988 | ||
3988 | /* | 3989 | ret = true; |
3989 | * Memory allocation/reclaim might be called from a WQ | 3990 | goto out; |
3990 | * context and the current implementation of the WQ | ||
3991 | * concurrency control doesn't recognize that | ||
3992 | * a particular WQ is congested if the worker thread is | ||
3993 | * looping without ever sleeping. Therefore we have to | ||
3994 | * do a short sleep here rather than calling | ||
3995 | * cond_resched(). | ||
3996 | */ | ||
3997 | if (current->flags & PF_WQ_WORKER) | ||
3998 | schedule_timeout_uninterruptible(1); | ||
3999 | else | ||
4000 | cond_resched(); | ||
4001 | |||
4002 | return true; | ||
4003 | } | 3991 | } |
4004 | } | 3992 | } |
4005 | 3993 | ||
4006 | return false; | 3994 | out: |
3995 | /* | ||
3996 | * Memory allocation/reclaim might be called from a WQ context and the | ||
3997 | * current implementation of the WQ concurrency control doesn't | ||
3998 | * recognize that a particular WQ is congested if the worker thread is | ||
3999 | * looping without ever sleeping. Therefore we have to do a short sleep | ||
4000 | * here rather than calling cond_resched(). | ||
4001 | */ | ||
4002 | if (current->flags & PF_WQ_WORKER) | ||
4003 | schedule_timeout_uninterruptible(1); | ||
4004 | else | ||
4005 | cond_resched(); | ||
4006 | return ret; | ||
4007 | } | 4007 | } |
4008 | 4008 | ||
4009 | static inline bool | 4009 | static inline bool |