Re: [v2 PATCH 7/9] mm: vmscan: check if the demote target node is contended or not

2019-04-15 Thread Yang Shi




On 4/15/19 3:13 PM, Dave Hansen wrote:

On 4/15/19 3:06 PM, Yang Shi wrote:

This seems like an actively bad idea to me.

Why do we need an *active* note to say the node is contended?  Why isn't
just getting a failure back from migrate_pages() enough?  Have you
observed this in practice?

The flag will be used to check if the target node is contended or not
before moving the page into the demotion list. If the target node is
contended (i.e. GFP_NOWAIT would likely fail), the page reclaim code
even won't scan anonymous page list on swapless system.

That seems like the actual problem that needs to get fixed.

On systems where we have demotions available, perhaps we need to start
scanning anonymous pages again, at least for zones where we *can* demote
from them.


But the problem is if we know the demotion would likely fail, why bother 
scanning anonymous pages again? The flag will be cleared by the target 
node's kswapd once it gets balanced again. Then the anonymous pages 
would get scanned next time.





Re: [v2 PATCH 7/9] mm: vmscan: check if the demote target node is contended or not

2019-04-15 Thread Dave Hansen
On 4/15/19 3:06 PM, Yang Shi wrote:
>>>
>> This seems like an actively bad idea to me.
>>
>> Why do we need an *active* note to say the node is contended?  Why isn't
>> just getting a failure back from migrate_pages() enough?  Have you
>> observed this in practice?
> 
> The flag will be used to check if the target node is contended or not
> before moving the page into the demotion list. If the target node is
> contended (i.e. GFP_NOWAIT would likely fail), the page reclaim code
> even won't scan anonymous page list on swapless system.

That seems like the actual problem that needs to get fixed.

On systems where we have demotions available, perhaps we need to start
scanning anonymous pages again, at least for zones where we *can* demote
from them.


Re: [v2 PATCH 7/9] mm: vmscan: check if the demote target node is contended or not

2019-04-15 Thread Yang Shi




On 4/11/19 9:06 AM, Dave Hansen wrote:

On 4/10/19 8:56 PM, Yang Shi wrote:

When demoting to PMEM node, the target node may have memory pressure,
then the memory pressure may cause migrate_pages() fail.

If the failure is caused by memory pressure (i.e. returning -ENOMEM),
tag the node with PGDAT_CONTENDED.  The tag would be cleared once the
target node is balanced again.

Check if the target node is PGDAT_CONTENDED or not, if it is just skip
demotion.

This seems like an actively bad idea to me.

Why do we need an *active* note to say the node is contended?  Why isn't
just getting a failure back from migrate_pages() enough?  Have you
observed this in practice?


The flag will be used to check if the target node is contended or not 
before moving the page into the demotion list. If the target node is 
contended (i.e. GFP_NOWAIT would likely fail), the page reclaim code 
even won't scan anonymous page list on swapless system. It will just try 
to reclaim page cache. This would save some scanning time.


Thanks,
Yang




Re: [v2 PATCH 7/9] mm: vmscan: check if the demote target node is contended or not

2019-04-11 Thread Dave Hansen
On 4/10/19 8:56 PM, Yang Shi wrote:
> When demoting to PMEM node, the target node may have memory pressure,
> then the memory pressure may cause migrate_pages() fail.
> 
> If the failure is caused by memory pressure (i.e. returning -ENOMEM),
> tag the node with PGDAT_CONTENDED.  The tag would be cleared once the
> target node is balanced again.
> 
> Check if the target node is PGDAT_CONTENDED or not, if it is just skip
> demotion.

This seems like an actively bad idea to me.

Why do we need an *active* note to say the node is contended?  Why isn't
just getting a failure back from migrate_pages() enough?  Have you
observed this in practice?


[v2 PATCH 7/9] mm: vmscan: check if the demote target node is contended or not

2019-04-10 Thread Yang Shi
When demoting to PMEM node, the target node may have memory pressure,
then the memory pressure may cause migrate_pages() fail.

If the failure is caused by memory pressure (i.e. returning -ENOMEM),
tag the node with PGDAT_CONTENDED.  The tag would be cleared once the
target node is balanced again.

Check if the target node is PGDAT_CONTENDED or not, if it is just skip
demotion.

Signed-off-by: Yang Shi 
---
 include/linux/mmzone.h |  3 +++
 mm/vmscan.c| 28 
 2 files changed, 31 insertions(+)

diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index fba7741..de534db 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -520,6 +520,9 @@ enum pgdat_flags {
 * many pages under writeback
 */
PGDAT_RECLAIM_LOCKED,   /* prevents concurrent reclaim */
+   PGDAT_CONTENDED,/* the node has not enough free memory
+* available
+*/
 };
 
 enum zone_flags {
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 80cd624..50cde53 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1048,6 +1048,9 @@ static void page_check_dirty_writeback(struct page *page,
 
 static inline bool is_demote_ok(int nid, struct scan_control *sc)
 {
+   int node;
+   nodemask_t used_mask;
+
/* It is pointless to do demotion in memcg reclaim */
if (!global_reclaim(sc))
return false;
@@ -1060,6 +1063,13 @@ static inline bool is_demote_ok(int nid, struct 
scan_control *sc)
if (!has_cpuless_node_online())
return false;
 
+   /* Check if the demote target node is contended or not */
+   nodes_clear(used_mask);
+   node = find_next_best_node(nid, _mask, true);
+
+   if (test_bit(PGDAT_CONTENDED, _DATA(node)->flags))
+   return false;
+
return true;
 }
 
@@ -1502,6 +1512,10 @@ static unsigned long shrink_page_list(struct list_head 
*page_list,
nr_reclaimed += nr_succeeded;
 
if (err) {
+   if (err == -ENOMEM)
+   set_bit(PGDAT_CONTENDED,
+   _DATA(target_nid)->flags);
+
putback_movable_pages(_pages);
 
list_splice(_pages, _pages);
@@ -2596,6 +2610,19 @@ static void shrink_node_memcg(struct pglist_data *pgdat, 
struct mem_cgroup *memc
 * scan target and the percentage scanning already complete
 */
lru = (lru == LRU_FILE) ? LRU_BASE : LRU_FILE;
+
+   /*
+* The shrink_page_list() may find the demote target node is
+* contended, if so it doesn't make sense to scan anonymous
+* LRU again.
+*
+* Need check if swap is available or not too since demotion
+* may happen on swapless system.
+*/
+   if (!is_demote_ok(pgdat->node_id, sc) &&
+   (!sc->may_swap || mem_cgroup_get_nr_swap_pages(memcg) <= 0))
+   lru = LRU_FILE;
+
nr_scanned = targets[lru] - nr[lru];
nr[lru] = targets[lru] * (100 - percentage) / 100;
nr[lru] -= min(nr[lru], nr_scanned);
@@ -3458,6 +3485,7 @@ static void clear_pgdat_congested(pg_data_t *pgdat)
clear_bit(PGDAT_CONGESTED, >flags);
clear_bit(PGDAT_DIRTY, >flags);
clear_bit(PGDAT_WRITEBACK, >flags);
+   clear_bit(PGDAT_CONTENDED, >flags);
 }
 
 /*
-- 
1.8.3.1