|
@@ -3922,6 +3922,7 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
|
|
|
{
|
|
|
struct zone *zone;
|
|
|
struct zoneref *z;
|
|
|
+ bool ret = false;
|
|
|
|
|
|
/*
|
|
|
* 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,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * Memory allocation/reclaim might be called from a WQ
|
|
|
- * context and the current implementation of the WQ
|
|
|
- * concurrency control doesn't recognize that
|
|
|
- * a particular WQ is congested if the worker thread is
|
|
|
- * looping without ever sleeping. Therefore we have to
|
|
|
- * do a short sleep here rather than calling
|
|
|
- * cond_resched().
|
|
|
- */
|
|
|
- if (current->flags & PF_WQ_WORKER)
|
|
|
- schedule_timeout_uninterruptible(1);
|
|
|
- else
|
|
|
- cond_resched();
|
|
|
-
|
|
|
- return true;
|
|
|
+ ret = true;
|
|
|
+ goto out;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return false;
|
|
|
+out:
|
|
|
+ /*
|
|
|
+ * Memory allocation/reclaim might be called from a WQ context and the
|
|
|
+ * current implementation of the WQ concurrency control doesn't
|
|
|
+ * recognize that a particular WQ is congested if the worker thread is
|
|
|
+ * looping without ever sleeping. Therefore we have to do a short sleep
|
|
|
+ * here rather than calling cond_resched().
|
|
|
+ */
|
|
|
+ if (current->flags & PF_WQ_WORKER)
|
|
|
+ schedule_timeout_uninterruptible(1);
|
|
|
+ else
|
|
|
+ cond_resched();
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static inline bool
|