* [patch] mm: clean up zone flags @ 2014-09-02 14:27 Johannes Weiner 2014-09-02 21:42 ` David Rientjes 0 siblings, 1 reply; 4+ messages in thread From: Johannes Weiner @ 2014-09-02 14:27 UTC (permalink / raw) To: Andrew Morton; +Cc: Mel Gorman, linux-mm, linux-kernel Page reclaim tests zone_is_reclaim_dirty(), but the site that actually sets this state does zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY), sending the reader through layers indirection just to track down a simple bit. Remove all zone flag wrappers and just use bitops against zone->flags directly. It's just as readable and the lines are barely any longer. Also rename ZONE_TAIL_LRU_DIRTY to ZONE_DIRTY to match ZONE_WRITEBACK, and remove the zone_flags_t typedef. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> --- include/linux/mmzone.h | 51 +++----------------------------------------------- mm/backing-dev.c | 2 +- mm/oom_kill.c | 6 +++--- mm/page_alloc.c | 8 ++++---- mm/vmscan.c | 28 +++++++++++++-------------- 5 files changed, 25 insertions(+), 70 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 318df7051850..48bf12ef6620 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -521,13 +521,13 @@ struct zone { atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; } ____cacheline_internodealigned_in_smp; -typedef enum { +enum zone_flags { ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */ ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */ ZONE_CONGESTED, /* zone has many dirty pages backed by * a congested BDI */ - ZONE_TAIL_LRU_DIRTY, /* reclaim scanning has recently found + ZONE_DIRTY, /* reclaim scanning has recently found * many dirty file pages at the tail * of the LRU. */ @@ -535,52 +535,7 @@ typedef enum { * many pages under writeback */ ZONE_FAIR_DEPLETED, /* fair zone policy batch depleted */ -} zone_flags_t; - -static inline void zone_set_flag(struct zone *zone, zone_flags_t flag) -{ - set_bit(flag, &zone->flags); -} - -static inline int zone_test_and_set_flag(struct zone *zone, zone_flags_t flag) -{ - return test_and_set_bit(flag, &zone->flags); -} - -static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag) -{ - clear_bit(flag, &zone->flags); -} - -static inline int zone_is_reclaim_congested(const struct zone *zone) -{ - return test_bit(ZONE_CONGESTED, &zone->flags); -} - -static inline int zone_is_reclaim_dirty(const struct zone *zone) -{ - return test_bit(ZONE_TAIL_LRU_DIRTY, &zone->flags); -} - -static inline int zone_is_reclaim_writeback(const struct zone *zone) -{ - return test_bit(ZONE_WRITEBACK, &zone->flags); -} - -static inline int zone_is_reclaim_locked(const struct zone *zone) -{ - return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); -} - -static inline int zone_is_fair_depleted(const struct zone *zone) -{ - return test_bit(ZONE_FAIR_DEPLETED, &zone->flags); -} - -static inline int zone_is_oom_locked(const struct zone *zone) -{ - return test_bit(ZONE_OOM_LOCKED, &zone->flags); -} +}; static inline unsigned long zone_end_pfn(const struct zone *zone) { diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 1706cbbdf5f0..d7a9051a6db5 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -631,7 +631,7 @@ long wait_iff_congested(struct zone *zone, int sync, long timeout) * of sleeping on the congestion queue */ if (atomic_read(&nr_bdi_congested[sync]) == 0 || - !zone_is_reclaim_congested(zone)) { + test_bit(ZONE_CONGESTED, &zone->flags)) { cond_resched(); /* In case we scheduled, work out time remaining */ diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 1e11df8fa7ec..bbf405a3a18f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -565,7 +565,7 @@ bool oom_zonelist_trylock(struct zonelist *zonelist, gfp_t gfp_mask) spin_lock(&zone_scan_lock); for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) - if (zone_is_oom_locked(zone)) { + if (test_bit(ZONE_OOM_LOCKED, &zone->flags)) { ret = false; goto out; } @@ -575,7 +575,7 @@ bool oom_zonelist_trylock(struct zonelist *zonelist, gfp_t gfp_mask) * call to oom_zonelist_trylock() doesn't succeed when it shouldn't. */ for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) - zone_set_flag(zone, ZONE_OOM_LOCKED); + set_bit(ZONE_OOM_LOCKED, &zone->flags); out: spin_unlock(&zone_scan_lock); @@ -594,7 +594,7 @@ void oom_zonelist_unlock(struct zonelist *zonelist, gfp_t gfp_mask) spin_lock(&zone_scan_lock); for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) - zone_clear_flag(zone, ZONE_OOM_LOCKED); + clear_bit(ZONE_OOM_LOCKED, &zone->flags); spin_unlock(&zone_scan_lock); } diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 18cee0d4c8a2..f0eb97de6cad 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1613,8 +1613,8 @@ again: __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); if (zone_page_state(zone, NR_ALLOC_BATCH) == 0 && - !zone_is_fair_depleted(zone)) - zone_set_flag(zone, ZONE_FAIR_DEPLETED); + !test_bit(ZONE_FAIR_DEPLETED, &zone->flags)) + set_bit(ZONE_FAIR_DEPLETED, &zone->flags); __count_zone_vm_events(PGALLOC, zone, 1 << order); zone_statistics(preferred_zone, zone, gfp_flags); @@ -1934,7 +1934,7 @@ static void reset_alloc_batches(struct zone *preferred_zone) mod_zone_page_state(zone, NR_ALLOC_BATCH, high_wmark_pages(zone) - low_wmark_pages(zone) - atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH])); - zone_clear_flag(zone, ZONE_FAIR_DEPLETED); + clear_bit(ZONE_FAIR_DEPLETED, &zone->flags); } while (zone++ != preferred_zone); } @@ -1985,7 +1985,7 @@ zonelist_scan: if (alloc_flags & ALLOC_FAIR) { if (!zone_local(preferred_zone, zone)) break; - if (zone_is_fair_depleted(zone)) { + if (test_bit(ZONE_FAIR_DEPLETED, &zone->flags)) { nr_fair_skipped++; continue; } diff --git a/mm/vmscan.c b/mm/vmscan.c index 2836b5373b2e..590a92bec6a4 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -920,7 +920,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, /* Case 1 above */ if (current_is_kswapd() && PageReclaim(page) && - zone_is_reclaim_writeback(zone)) { + test_bit(ZONE_WRITEBACK, &zone->flags)) { nr_immediate++; goto keep_locked; @@ -1002,7 +1002,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, */ if (page_is_file_cache(page) && (!current_is_kswapd() || - !zone_is_reclaim_dirty(zone))) { + test_bit(ZONE_DIRTY, &zone->flags))) { /* * Immediately reclaim when written back. * Similar in principal to deactivate_page() @@ -1563,7 +1563,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, * are encountered in the nr_immediate check below. */ if (nr_writeback && nr_writeback == nr_taken) - zone_set_flag(zone, ZONE_WRITEBACK); + set_bit(ZONE_WRITEBACK, &zone->flags); /* * memcg will stall in page writeback so only consider forcibly @@ -1575,16 +1575,16 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, * backed by a congested BDI and wait_iff_congested will stall. */ if (nr_dirty && nr_dirty == nr_congested) - zone_set_flag(zone, ZONE_CONGESTED); + set_bit(ZONE_CONGESTED, &zone->flags); /* * If dirty pages are scanned that are not queued for IO, it * implies that flushers are not keeping up. In this case, flag - * the zone ZONE_TAIL_LRU_DIRTY and kswapd will start writing - * pages from reclaim context. + * the zone ZONE_DIRTY and kswapd will start writing pages from + * reclaim context. */ if (nr_unqueued_dirty == nr_taken) - zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY); + set_bit(ZONE_DIRTY, &zone->flags); /* * If kswapd scans pages marked marked for immediate @@ -2978,7 +2978,7 @@ static bool kswapd_shrink_zone(struct zone *zone, /* Account for the number of pages attempted to reclaim */ *nr_attempted += sc->nr_to_reclaim; - zone_clear_flag(zone, ZONE_WRITEBACK); + clear_bit(ZONE_WRITEBACK, &zone->flags); /* * If a zone reaches its high watermark, consider it to be no longer @@ -2988,8 +2988,8 @@ static bool kswapd_shrink_zone(struct zone *zone, */ if (zone_reclaimable(zone) && zone_balanced(zone, testorder, 0, classzone_idx)) { - zone_clear_flag(zone, ZONE_CONGESTED); - zone_clear_flag(zone, ZONE_TAIL_LRU_DIRTY); + clear_bit(ZONE_CONGESTED, &zone->flags); + clear_bit(ZONE_DIRTY, &zone->flags); } return sc->nr_scanned >= sc->nr_to_reclaim; @@ -3080,8 +3080,8 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order, * If balanced, clear the dirty and congested * flags */ - zone_clear_flag(zone, ZONE_CONGESTED); - zone_clear_flag(zone, ZONE_TAIL_LRU_DIRTY); + clear_bit(ZONE_CONGESTED, &zone->flags); + clear_bit(ZONE_DIRTY, &zone->flags); } } @@ -3708,11 +3708,11 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) if (node_state(node_id, N_CPU) && node_id != numa_node_id()) return ZONE_RECLAIM_NOSCAN; - if (zone_test_and_set_flag(zone, ZONE_RECLAIM_LOCKED)) + if (test_and_set_bit(ZONE_RECLAIM_LOCKED, &zone->flags)) return ZONE_RECLAIM_NOSCAN; ret = __zone_reclaim(zone, gfp_mask, order); - zone_clear_flag(zone, ZONE_RECLAIM_LOCKED); + clear_bit(ZONE_RECLAIM_LOCKED, &zone->flags); if (!ret) count_vm_event(PGSCAN_ZONE_RECLAIM_FAILED); -- 2.0.4 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [patch] mm: clean up zone flags 2014-09-02 14:27 [patch] mm: clean up zone flags Johannes Weiner @ 2014-09-02 21:42 ` David Rientjes 2014-09-02 22:26 ` Johannes Weiner 0 siblings, 1 reply; 4+ messages in thread From: David Rientjes @ 2014-09-02 21:42 UTC (permalink / raw) To: Johannes Weiner; +Cc: Andrew Morton, Mel Gorman, linux-mm, linux-kernel On Tue, 2 Sep 2014, Johannes Weiner wrote: > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index 318df7051850..48bf12ef6620 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -521,13 +521,13 @@ struct zone { > atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; > } ____cacheline_internodealigned_in_smp; > > -typedef enum { > +enum zone_flags { > ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */ > ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */ > ZONE_CONGESTED, /* zone has many dirty pages backed by > * a congested BDI > */ > - ZONE_TAIL_LRU_DIRTY, /* reclaim scanning has recently found > + ZONE_DIRTY, /* reclaim scanning has recently found > * many dirty file pages at the tail > * of the LRU. > */ > @@ -535,52 +535,7 @@ typedef enum { > * many pages under writeback > */ > ZONE_FAIR_DEPLETED, /* fair zone policy batch depleted */ > -} zone_flags_t; > - > -static inline void zone_set_flag(struct zone *zone, zone_flags_t flag) > -{ > - set_bit(flag, &zone->flags); > -} > - > -static inline int zone_test_and_set_flag(struct zone *zone, zone_flags_t flag) > -{ > - return test_and_set_bit(flag, &zone->flags); > -} > - > -static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag) > -{ > - clear_bit(flag, &zone->flags); > -} > - > -static inline int zone_is_reclaim_congested(const struct zone *zone) > -{ > - return test_bit(ZONE_CONGESTED, &zone->flags); > -} > - > -static inline int zone_is_reclaim_dirty(const struct zone *zone) > -{ > - return test_bit(ZONE_TAIL_LRU_DIRTY, &zone->flags); > -} > - > -static inline int zone_is_reclaim_writeback(const struct zone *zone) > -{ > - return test_bit(ZONE_WRITEBACK, &zone->flags); > -} > - > -static inline int zone_is_reclaim_locked(const struct zone *zone) > -{ > - return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); > -} > - > -static inline int zone_is_fair_depleted(const struct zone *zone) > -{ > - return test_bit(ZONE_FAIR_DEPLETED, &zone->flags); > -} > - > -static inline int zone_is_oom_locked(const struct zone *zone) > -{ > - return test_bit(ZONE_OOM_LOCKED, &zone->flags); > -} > +}; > > static inline unsigned long zone_end_pfn(const struct zone *zone) > { > diff --git a/mm/backing-dev.c b/mm/backing-dev.c > index 1706cbbdf5f0..d7a9051a6db5 100644 > --- a/mm/backing-dev.c > +++ b/mm/backing-dev.c > @@ -631,7 +631,7 @@ long wait_iff_congested(struct zone *zone, int sync, long timeout) > * of sleeping on the congestion queue > */ > if (atomic_read(&nr_bdi_congested[sync]) == 0 || > - !zone_is_reclaim_congested(zone)) { > + test_bit(ZONE_CONGESTED, &zone->flags)) { > cond_resched(); > > /* In case we scheduled, work out time remaining */ That's not equivalent. [snip] > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 2836b5373b2e..590a92bec6a4 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -920,7 +920,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > /* Case 1 above */ > if (current_is_kswapd() && > PageReclaim(page) && > - zone_is_reclaim_writeback(zone)) { > + test_bit(ZONE_WRITEBACK, &zone->flags)) { > nr_immediate++; > goto keep_locked; > > @@ -1002,7 +1002,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > */ > if (page_is_file_cache(page) && > (!current_is_kswapd() || > - !zone_is_reclaim_dirty(zone))) { > + test_bit(ZONE_DIRTY, &zone->flags))) { > /* > * Immediately reclaim when written back. > * Similar in principal to deactivate_page() Nor is this. After fixed, for the oom killer bits: Acked-by: David Rientjes <rientjes@google.com> since this un-obscurification is most welcome. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [patch] mm: clean up zone flags 2014-09-02 21:42 ` David Rientjes @ 2014-09-02 22:26 ` Johannes Weiner 2014-09-05 10:20 ` Mel Gorman 0 siblings, 1 reply; 4+ messages in thread From: Johannes Weiner @ 2014-09-02 22:26 UTC (permalink / raw) To: David Rientjes; +Cc: Andrew Morton, Mel Gorman, linux-mm, linux-kernel On Tue, Sep 02, 2014 at 02:42:14PM -0700, David Rientjes wrote: > On Tue, 2 Sep 2014, Johannes Weiner wrote: > > @@ -631,7 +631,7 @@ long wait_iff_congested(struct zone *zone, int sync, long timeout) > > * of sleeping on the congestion queue > > */ > > if (atomic_read(&nr_bdi_congested[sync]) == 0 || > > - !zone_is_reclaim_congested(zone)) { > > + test_bit(ZONE_CONGESTED, &zone->flags)) { > > cond_resched(); > > > > /* In case we scheduled, work out time remaining */ > > That's not equivalent. > > [snip] > > > diff --git a/mm/vmscan.c b/mm/vmscan.c > > index 2836b5373b2e..590a92bec6a4 100644 > > --- a/mm/vmscan.c > > +++ b/mm/vmscan.c > > @@ -920,7 +920,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > /* Case 1 above */ > > if (current_is_kswapd() && > > PageReclaim(page) && > > - zone_is_reclaim_writeback(zone)) { > > + test_bit(ZONE_WRITEBACK, &zone->flags)) { > > nr_immediate++; > > goto keep_locked; > > > > @@ -1002,7 +1002,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > */ > > if (page_is_file_cache(page) && > > (!current_is_kswapd() || > > - !zone_is_reclaim_dirty(zone))) { > > + test_bit(ZONE_DIRTY, &zone->flags))) { > > /* > > * Immediately reclaim when written back. > > * Similar in principal to deactivate_page() > > Nor is this. > > After fixed, for the oom killer bits: > > Acked-by: David Rientjes <rientjes@google.com> > > since this un-obscurification is most welcome. Yikes, thanks for catching those and acking. Updated patch: --- >From 2420ad16df0634e073ad327f0f72472d9b03762b Mon Sep 17 00:00:00 2001 From: Johannes Weiner <hannes@cmpxchg.org> Date: Tue, 2 Sep 2014 10:14:36 -0400 Subject: [patch] mm: clean up zone flags Page reclaim tests zone_is_reclaim_dirty(), but the site that actually sets this state does zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY), sending the reader through layers indirection just to track down a simple bit. Remove all zone flag wrappers and just use bitops against zone->flags directly. It's just as readable and the lines are barely any longer. Also rename ZONE_TAIL_LRU_DIRTY to ZONE_DIRTY to match ZONE_WRITEBACK, and remove the zone_flags_t typedef. Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: David Rientjes <rientjes@google.com> --- include/linux/mmzone.h | 51 +++----------------------------------------------- mm/backing-dev.c | 2 +- mm/oom_kill.c | 6 +++--- mm/page_alloc.c | 8 ++++---- mm/vmscan.c | 28 +++++++++++++-------------- 5 files changed, 25 insertions(+), 70 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 318df7051850..48bf12ef6620 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -521,13 +521,13 @@ struct zone { atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS]; } ____cacheline_internodealigned_in_smp; -typedef enum { +enum zone_flags { ZONE_RECLAIM_LOCKED, /* prevents concurrent reclaim */ ZONE_OOM_LOCKED, /* zone is in OOM killer zonelist */ ZONE_CONGESTED, /* zone has many dirty pages backed by * a congested BDI */ - ZONE_TAIL_LRU_DIRTY, /* reclaim scanning has recently found + ZONE_DIRTY, /* reclaim scanning has recently found * many dirty file pages at the tail * of the LRU. */ @@ -535,52 +535,7 @@ typedef enum { * many pages under writeback */ ZONE_FAIR_DEPLETED, /* fair zone policy batch depleted */ -} zone_flags_t; - -static inline void zone_set_flag(struct zone *zone, zone_flags_t flag) -{ - set_bit(flag, &zone->flags); -} - -static inline int zone_test_and_set_flag(struct zone *zone, zone_flags_t flag) -{ - return test_and_set_bit(flag, &zone->flags); -} - -static inline void zone_clear_flag(struct zone *zone, zone_flags_t flag) -{ - clear_bit(flag, &zone->flags); -} - -static inline int zone_is_reclaim_congested(const struct zone *zone) -{ - return test_bit(ZONE_CONGESTED, &zone->flags); -} - -static inline int zone_is_reclaim_dirty(const struct zone *zone) -{ - return test_bit(ZONE_TAIL_LRU_DIRTY, &zone->flags); -} - -static inline int zone_is_reclaim_writeback(const struct zone *zone) -{ - return test_bit(ZONE_WRITEBACK, &zone->flags); -} - -static inline int zone_is_reclaim_locked(const struct zone *zone) -{ - return test_bit(ZONE_RECLAIM_LOCKED, &zone->flags); -} - -static inline int zone_is_fair_depleted(const struct zone *zone) -{ - return test_bit(ZONE_FAIR_DEPLETED, &zone->flags); -} - -static inline int zone_is_oom_locked(const struct zone *zone) -{ - return test_bit(ZONE_OOM_LOCKED, &zone->flags); -} +}; static inline unsigned long zone_end_pfn(const struct zone *zone) { diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 1706cbbdf5f0..b27714f1b40f 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -631,7 +631,7 @@ long wait_iff_congested(struct zone *zone, int sync, long timeout) * of sleeping on the congestion queue */ if (atomic_read(&nr_bdi_congested[sync]) == 0 || - !zone_is_reclaim_congested(zone)) { + !test_bit(ZONE_CONGESTED, &zone->flags)) { cond_resched(); /* In case we scheduled, work out time remaining */ diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 1e11df8fa7ec..bbf405a3a18f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -565,7 +565,7 @@ bool oom_zonelist_trylock(struct zonelist *zonelist, gfp_t gfp_mask) spin_lock(&zone_scan_lock); for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) - if (zone_is_oom_locked(zone)) { + if (test_bit(ZONE_OOM_LOCKED, &zone->flags)) { ret = false; goto out; } @@ -575,7 +575,7 @@ bool oom_zonelist_trylock(struct zonelist *zonelist, gfp_t gfp_mask) * call to oom_zonelist_trylock() doesn't succeed when it shouldn't. */ for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) - zone_set_flag(zone, ZONE_OOM_LOCKED); + set_bit(ZONE_OOM_LOCKED, &zone->flags); out: spin_unlock(&zone_scan_lock); @@ -594,7 +594,7 @@ void oom_zonelist_unlock(struct zonelist *zonelist, gfp_t gfp_mask) spin_lock(&zone_scan_lock); for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) - zone_clear_flag(zone, ZONE_OOM_LOCKED); + clear_bit(ZONE_OOM_LOCKED, &zone->flags); spin_unlock(&zone_scan_lock); } diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 18cee0d4c8a2..f0eb97de6cad 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1613,8 +1613,8 @@ again: __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); if (zone_page_state(zone, NR_ALLOC_BATCH) == 0 && - !zone_is_fair_depleted(zone)) - zone_set_flag(zone, ZONE_FAIR_DEPLETED); + !test_bit(ZONE_FAIR_DEPLETED, &zone->flags)) + set_bit(ZONE_FAIR_DEPLETED, &zone->flags); __count_zone_vm_events(PGALLOC, zone, 1 << order); zone_statistics(preferred_zone, zone, gfp_flags); @@ -1934,7 +1934,7 @@ static void reset_alloc_batches(struct zone *preferred_zone) mod_zone_page_state(zone, NR_ALLOC_BATCH, high_wmark_pages(zone) - low_wmark_pages(zone) - atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH])); - zone_clear_flag(zone, ZONE_FAIR_DEPLETED); + clear_bit(ZONE_FAIR_DEPLETED, &zone->flags); } while (zone++ != preferred_zone); } @@ -1985,7 +1985,7 @@ zonelist_scan: if (alloc_flags & ALLOC_FAIR) { if (!zone_local(preferred_zone, zone)) break; - if (zone_is_fair_depleted(zone)) { + if (test_bit(ZONE_FAIR_DEPLETED, &zone->flags)) { nr_fair_skipped++; continue; } diff --git a/mm/vmscan.c b/mm/vmscan.c index 2836b5373b2e..a14f1642759c 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -920,7 +920,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, /* Case 1 above */ if (current_is_kswapd() && PageReclaim(page) && - zone_is_reclaim_writeback(zone)) { + test_bit(ZONE_WRITEBACK, &zone->flags)) { nr_immediate++; goto keep_locked; @@ -1002,7 +1002,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, */ if (page_is_file_cache(page) && (!current_is_kswapd() || - !zone_is_reclaim_dirty(zone))) { + !test_bit(ZONE_DIRTY, &zone->flags))) { /* * Immediately reclaim when written back. * Similar in principal to deactivate_page() @@ -1563,7 +1563,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, * are encountered in the nr_immediate check below. */ if (nr_writeback && nr_writeback == nr_taken) - zone_set_flag(zone, ZONE_WRITEBACK); + set_bit(ZONE_WRITEBACK, &zone->flags); /* * memcg will stall in page writeback so only consider forcibly @@ -1575,16 +1575,16 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, * backed by a congested BDI and wait_iff_congested will stall. */ if (nr_dirty && nr_dirty == nr_congested) - zone_set_flag(zone, ZONE_CONGESTED); + set_bit(ZONE_CONGESTED, &zone->flags); /* * If dirty pages are scanned that are not queued for IO, it * implies that flushers are not keeping up. In this case, flag - * the zone ZONE_TAIL_LRU_DIRTY and kswapd will start writing - * pages from reclaim context. + * the zone ZONE_DIRTY and kswapd will start writing pages from + * reclaim context. */ if (nr_unqueued_dirty == nr_taken) - zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY); + set_bit(ZONE_DIRTY, &zone->flags); /* * If kswapd scans pages marked marked for immediate @@ -2978,7 +2978,7 @@ static bool kswapd_shrink_zone(struct zone *zone, /* Account for the number of pages attempted to reclaim */ *nr_attempted += sc->nr_to_reclaim; - zone_clear_flag(zone, ZONE_WRITEBACK); + clear_bit(ZONE_WRITEBACK, &zone->flags); /* * If a zone reaches its high watermark, consider it to be no longer @@ -2988,8 +2988,8 @@ static bool kswapd_shrink_zone(struct zone *zone, */ if (zone_reclaimable(zone) && zone_balanced(zone, testorder, 0, classzone_idx)) { - zone_clear_flag(zone, ZONE_CONGESTED); - zone_clear_flag(zone, ZONE_TAIL_LRU_DIRTY); + clear_bit(ZONE_CONGESTED, &zone->flags); + clear_bit(ZONE_DIRTY, &zone->flags); } return sc->nr_scanned >= sc->nr_to_reclaim; @@ -3080,8 +3080,8 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order, * If balanced, clear the dirty and congested * flags */ - zone_clear_flag(zone, ZONE_CONGESTED); - zone_clear_flag(zone, ZONE_TAIL_LRU_DIRTY); + clear_bit(ZONE_CONGESTED, &zone->flags); + clear_bit(ZONE_DIRTY, &zone->flags); } } @@ -3708,11 +3708,11 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) if (node_state(node_id, N_CPU) && node_id != numa_node_id()) return ZONE_RECLAIM_NOSCAN; - if (zone_test_and_set_flag(zone, ZONE_RECLAIM_LOCKED)) + if (test_and_set_bit(ZONE_RECLAIM_LOCKED, &zone->flags)) return ZONE_RECLAIM_NOSCAN; ret = __zone_reclaim(zone, gfp_mask, order); - zone_clear_flag(zone, ZONE_RECLAIM_LOCKED); + clear_bit(ZONE_RECLAIM_LOCKED, &zone->flags); if (!ret) count_vm_event(PGSCAN_ZONE_RECLAIM_FAILED); -- 2.0.4 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [patch] mm: clean up zone flags 2014-09-02 22:26 ` Johannes Weiner @ 2014-09-05 10:20 ` Mel Gorman 0 siblings, 0 replies; 4+ messages in thread From: Mel Gorman @ 2014-09-05 10:20 UTC (permalink / raw) To: Johannes Weiner; +Cc: David Rientjes, Andrew Morton, linux-mm, linux-kernel On Tue, Sep 02, 2014 at 06:26:53PM -0400, Johannes Weiner wrote: > From 2420ad16df0634e073ad327f0f72472d9b03762b Mon Sep 17 00:00:00 2001 > From: Johannes Weiner <hannes@cmpxchg.org> > Date: Tue, 2 Sep 2014 10:14:36 -0400 > Subject: [patch] mm: clean up zone flags > > Page reclaim tests zone_is_reclaim_dirty(), but the site that actually > sets this state does zone_set_flag(zone, ZONE_TAIL_LRU_DIRTY), sending > the reader through layers indirection just to track down a simple bit. > > Remove all zone flag wrappers and just use bitops against zone->flags > directly. It's just as readable and the lines are barely any longer. > > Also rename ZONE_TAIL_LRU_DIRTY to ZONE_DIRTY to match ZONE_WRITEBACK, > and remove the zone_flags_t typedef. > > Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> > Acked-by: David Rientjes <rientjes@google.com> I would have gone with making them ZONE_TAIL_DIRTY and ZONE_TAIL_WRITEBACK because to me it's clearer what the flag means. ZONE_DIRTY can be interpreted as "the zone has dirty pages" which is not what reclaim cares about, it cares about dirty pages at the tail of the LRU. However, I don't feel strongly enough to make a big deal about it so Acked-by: Mel Gorman <mgorman@suse.de> Thanks. -- Mel Gorman SUSE Labs ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-09-05 10:20 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-09-02 14:27 [patch] mm: clean up zone flags Johannes Weiner 2014-09-02 21:42 ` David Rientjes 2014-09-02 22:26 ` Johannes Weiner 2014-09-05 10:20 ` Mel Gorman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).