|
@@ -3036,6 +3036,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
|
|
|
struct zonelist *zonelist;
|
|
|
unsigned long nr_reclaimed;
|
|
|
int nid;
|
|
|
+ unsigned int noreclaim_flag;
|
|
|
struct scan_control sc = {
|
|
|
.nr_to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX),
|
|
|
.gfp_mask = (current_gfp_context(gfp_mask) & GFP_RECLAIM_MASK) |
|
|
@@ -3062,9 +3063,9 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
|
|
|
sc.gfp_mask,
|
|
|
sc.reclaim_idx);
|
|
|
|
|
|
- current->flags |= PF_MEMALLOC;
|
|
|
+ noreclaim_flag = memalloc_noreclaim_save();
|
|
|
nr_reclaimed = do_try_to_free_pages(zonelist, &sc);
|
|
|
- current->flags &= ~PF_MEMALLOC;
|
|
|
+ memalloc_noreclaim_restore(noreclaim_flag);
|
|
|
|
|
|
trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed);
|
|
|
|
|
@@ -3589,8 +3590,9 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim)
|
|
|
struct zonelist *zonelist = node_zonelist(numa_node_id(), sc.gfp_mask);
|
|
|
struct task_struct *p = current;
|
|
|
unsigned long nr_reclaimed;
|
|
|
+ unsigned int noreclaim_flag;
|
|
|
|
|
|
- p->flags |= PF_MEMALLOC;
|
|
|
+ noreclaim_flag = memalloc_noreclaim_save();
|
|
|
lockdep_set_current_reclaim_state(sc.gfp_mask);
|
|
|
reclaim_state.reclaimed_slab = 0;
|
|
|
p->reclaim_state = &reclaim_state;
|
|
@@ -3599,7 +3601,7 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim)
|
|
|
|
|
|
p->reclaim_state = NULL;
|
|
|
lockdep_clear_current_reclaim_state();
|
|
|
- p->flags &= ~PF_MEMALLOC;
|
|
|
+ memalloc_noreclaim_restore(noreclaim_flag);
|
|
|
|
|
|
return nr_reclaimed;
|
|
|
}
|
|
@@ -3764,6 +3766,7 @@ static int __node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned in
|
|
|
struct task_struct *p = current;
|
|
|
struct reclaim_state reclaim_state;
|
|
|
int classzone_idx = gfp_zone(gfp_mask);
|
|
|
+ unsigned int noreclaim_flag;
|
|
|
struct scan_control sc = {
|
|
|
.nr_to_reclaim = max(nr_pages, SWAP_CLUSTER_MAX),
|
|
|
.gfp_mask = (gfp_mask = current_gfp_context(gfp_mask)),
|
|
@@ -3781,7 +3784,8 @@ static int __node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned in
|
|
|
* and we also need to be able to write out pages for RECLAIM_WRITE
|
|
|
* and RECLAIM_UNMAP.
|
|
|
*/
|
|
|
- p->flags |= PF_MEMALLOC | PF_SWAPWRITE;
|
|
|
+ noreclaim_flag = memalloc_noreclaim_save();
|
|
|
+ p->flags |= PF_SWAPWRITE;
|
|
|
lockdep_set_current_reclaim_state(gfp_mask);
|
|
|
reclaim_state.reclaimed_slab = 0;
|
|
|
p->reclaim_state = &reclaim_state;
|
|
@@ -3797,7 +3801,8 @@ static int __node_reclaim(struct pglist_data *pgdat, gfp_t gfp_mask, unsigned in
|
|
|
}
|
|
|
|
|
|
p->reclaim_state = NULL;
|
|
|
- current->flags &= ~(PF_MEMALLOC | PF_SWAPWRITE);
|
|
|
+ current->flags &= ~PF_SWAPWRITE;
|
|
|
+ memalloc_noreclaim_restore(noreclaim_flag);
|
|
|
lockdep_clear_current_reclaim_state();
|
|
|
return sc.nr_reclaimed >= nr_pages;
|
|
|
}
|