|
@@ -2130,16 +2130,13 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
|
|
|
}
|
|
|
#endif /* CONFIG_COMPACTION */
|
|
|
|
|
|
-/* The really slow allocator path where we enter direct reclaim */
|
|
|
-static inline struct page *
|
|
|
-__alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
|
|
- struct zonelist *zonelist, enum zone_type high_zoneidx,
|
|
|
- nodemask_t *nodemask, int alloc_flags, struct zone *preferred_zone,
|
|
|
- int migratetype, unsigned long *did_some_progress)
|
|
|
+/* Perform direct synchronous page reclaim */
|
|
|
+static int
|
|
|
+__perform_reclaim(gfp_t gfp_mask, unsigned int order, struct zonelist *zonelist,
|
|
|
+ nodemask_t *nodemask)
|
|
|
{
|
|
|
- struct page *page = NULL;
|
|
|
struct reclaim_state reclaim_state;
|
|
|
- bool drained = false;
|
|
|
+ int progress;
|
|
|
|
|
|
cond_resched();
|
|
|
|
|
@@ -2150,7 +2147,7 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
|
|
reclaim_state.reclaimed_slab = 0;
|
|
|
current->reclaim_state = &reclaim_state;
|
|
|
|
|
|
- *did_some_progress = try_to_free_pages(zonelist, order, gfp_mask, nodemask);
|
|
|
+ progress = try_to_free_pages(zonelist, order, gfp_mask, nodemask);
|
|
|
|
|
|
current->reclaim_state = NULL;
|
|
|
lockdep_clear_current_reclaim_state();
|
|
@@ -2158,6 +2155,21 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
|
|
|
|
|
cond_resched();
|
|
|
|
|
|
+ return progress;
|
|
|
+}
|
|
|
+
|
|
|
+/* The really slow allocator path where we enter direct reclaim */
|
|
|
+static inline struct page *
|
|
|
+__alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
|
|
+ struct zonelist *zonelist, enum zone_type high_zoneidx,
|
|
|
+ nodemask_t *nodemask, int alloc_flags, struct zone *preferred_zone,
|
|
|
+ int migratetype, unsigned long *did_some_progress)
|
|
|
+{
|
|
|
+ struct page *page = NULL;
|
|
|
+ bool drained = false;
|
|
|
+
|
|
|
+ *did_some_progress = __perform_reclaim(gfp_mask, order, zonelist,
|
|
|
+ nodemask);
|
|
|
if (unlikely(!(*did_some_progress)))
|
|
|
return NULL;
|
|
|
|