mm: extract reclaim code from __alloc_pages_direct_reclaim()
This patch extracts common reclaim code from __alloc_pages_direct_reclaim() function to separate function: __perform_reclaim() which can be later used by alloc_contig_range(). Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Cc: Michal Nazarewicz <mina86@mina86.com> Acked-by: Mel Gorman <mel@csn.ul.ie> Tested-by: Rob Clark <rob.clark@linaro.org> Tested-by: Ohad Ben-Cohen <ohad@wizery.com> Tested-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> Tested-by: Robert Nelson <robertcnelson@gmail.com> Tested-by: Barry Song <Baohua.Song@csr.com>
This commit is contained in:
parent
cfd3da1e49
commit
bba9071087
@ -2130,16 +2130,13 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_COMPACTION */
|
#endif /* CONFIG_COMPACTION */
|
||||||
|
|
||||||
/* The really slow allocator path where we enter direct reclaim */
|
/* Perform direct synchronous page reclaim */
|
||||||
static inline struct page *
|
static int
|
||||||
__alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
__perform_reclaim(gfp_t gfp_mask, unsigned int order, struct zonelist *zonelist,
|
||||||
struct zonelist *zonelist, enum zone_type high_zoneidx,
|
nodemask_t *nodemask)
|
||||||
nodemask_t *nodemask, int alloc_flags, struct zone *preferred_zone,
|
|
||||||
int migratetype, unsigned long *did_some_progress)
|
|
||||||
{
|
{
|
||||||
struct page *page = NULL;
|
|
||||||
struct reclaim_state reclaim_state;
|
struct reclaim_state reclaim_state;
|
||||||
bool drained = false;
|
int progress;
|
||||||
|
|
||||||
cond_resched();
|
cond_resched();
|
||||||
|
|
||||||
@ -2150,7 +2147,7 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
|||||||
reclaim_state.reclaimed_slab = 0;
|
reclaim_state.reclaimed_slab = 0;
|
||||||
current->reclaim_state = &reclaim_state;
|
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;
|
current->reclaim_state = NULL;
|
||||||
lockdep_clear_current_reclaim_state();
|
lockdep_clear_current_reclaim_state();
|
||||||
@ -2158,6 +2155,21 @@ __alloc_pages_direct_reclaim(gfp_t gfp_mask, unsigned int order,
|
|||||||
|
|
||||||
cond_resched();
|
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)))
|
if (unlikely(!(*did_some_progress)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user