mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	mm: move recent_rotated pages calculation to shrink_inactive_list()
Patch series "mm: Generalize putback functions"] putback_inactive_pages() and move_active_pages_to_lru() are almost similar, so this patchset merges them ina single function. This patch (of 4): The patch moves the calculation from putback_inactive_pages() to shrink_inactive_list(). This makes putback_inactive_pages() looking more similar to move_active_pages_to_lru(). To do that, we account activated pages in reclaim_stat::nr_activate. Since a page may change its LRU type from anon to file cache inside shrink_page_list() (see ClearPageSwapBacked()), we have to account pages for the both types. So, nr_activate becomes an array. Previously we used nr_activate to account PGACTIVATE events, but now we account them into pgactivate variable (since they are about number of pages in general, not about sum of hpage_nr_pages). Link: http://lkml.kernel.org/r/155290127956.31489.3393586616054413298.stgit@localhost.localdomain Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Reviewed-by: Daniel Jordan <daniel.m.jordan@oracle.com> Cc: Michal Hocko <mhocko@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									63931eb975
								
							
						
					
					
						commit
						886cf1901d
					
				
					 4 changed files with 20 additions and 17 deletions
				
			
		| 
						 | 
					@ -113,7 +113,7 @@ my $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)';
 | 
				
			||||||
my $regex_kswapd_sleep_default = 'nid=([0-9]*)';
 | 
					my $regex_kswapd_sleep_default = 'nid=([0-9]*)';
 | 
				
			||||||
my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)';
 | 
					my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*) gfp_flags=([A-Z_|]*)';
 | 
				
			||||||
my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) classzone_idx=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_skipped=([0-9]*) nr_taken=([0-9]*) lru=([a-z_]*)';
 | 
					my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) classzone_idx=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_skipped=([0-9]*) nr_taken=([0-9]*) lru=([a-z_]*)';
 | 
				
			||||||
my $regex_lru_shrink_inactive_default = 'nid=([0-9]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) nr_dirty=([0-9]*) nr_writeback=([0-9]*) nr_congested=([0-9]*) nr_immediate=([0-9]*) nr_activate=([0-9]*) nr_ref_keep=([0-9]*) nr_unmap_fail=([0-9]*) priority=([0-9]*) flags=([A-Z_|]*)';
 | 
					my $regex_lru_shrink_inactive_default = 'nid=([0-9]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) nr_dirty=([0-9]*) nr_writeback=([0-9]*) nr_congested=([0-9]*) nr_immediate=([0-9]*) nr_activate_anon=([0-9]*) nr_activate_file=([0-9]*) nr_ref_keep=([0-9]*) nr_unmap_fail=([0-9]*) priority=([0-9]*) flags=([A-Z_|]*)';
 | 
				
			||||||
my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)';
 | 
					my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)';
 | 
				
			||||||
my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)';
 | 
					my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -212,7 +212,8 @@ $regex_lru_shrink_inactive = generate_traceevent_regex(
 | 
				
			||||||
			"vmscan/mm_vmscan_lru_shrink_inactive",
 | 
								"vmscan/mm_vmscan_lru_shrink_inactive",
 | 
				
			||||||
			$regex_lru_shrink_inactive_default,
 | 
								$regex_lru_shrink_inactive_default,
 | 
				
			||||||
			"nid", "nr_scanned", "nr_reclaimed", "nr_dirty", "nr_writeback",
 | 
								"nid", "nr_scanned", "nr_reclaimed", "nr_dirty", "nr_writeback",
 | 
				
			||||||
			"nr_congested", "nr_immediate", "nr_activate", "nr_ref_keep",
 | 
								"nr_congested", "nr_immediate", "nr_activate_anon",
 | 
				
			||||||
 | 
								"nr_activate_file", "nr_ref_keep",
 | 
				
			||||||
			"nr_unmap_fail", "priority", "flags");
 | 
								"nr_unmap_fail", "priority", "flags");
 | 
				
			||||||
$regex_lru_shrink_active = generate_traceevent_regex(
 | 
					$regex_lru_shrink_active = generate_traceevent_regex(
 | 
				
			||||||
			"vmscan/mm_vmscan_lru_shrink_active",
 | 
								"vmscan/mm_vmscan_lru_shrink_active",
 | 
				
			||||||
| 
						 | 
					@ -407,7 +408,7 @@ EVENT_PROCESS:
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			my $nr_reclaimed = $3;
 | 
								my $nr_reclaimed = $3;
 | 
				
			||||||
			my $flags = $12;
 | 
								my $flags = $13;
 | 
				
			||||||
			my $file = 0;
 | 
								my $file = 0;
 | 
				
			||||||
			if ($flags =~ /RECLAIM_WB_FILE/) {
 | 
								if ($flags =~ /RECLAIM_WB_FILE/) {
 | 
				
			||||||
				$file = 1;
 | 
									$file = 1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ struct reclaim_stat {
 | 
				
			||||||
	unsigned nr_congested;
 | 
						unsigned nr_congested;
 | 
				
			||||||
	unsigned nr_writeback;
 | 
						unsigned nr_writeback;
 | 
				
			||||||
	unsigned nr_immediate;
 | 
						unsigned nr_immediate;
 | 
				
			||||||
	unsigned nr_activate;
 | 
						unsigned nr_activate[2];
 | 
				
			||||||
	unsigned nr_ref_keep;
 | 
						unsigned nr_ref_keep;
 | 
				
			||||||
	unsigned nr_unmap_fail;
 | 
						unsigned nr_unmap_fail;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -359,7 +359,8 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
 | 
				
			||||||
		__field(unsigned long, nr_writeback)
 | 
							__field(unsigned long, nr_writeback)
 | 
				
			||||||
		__field(unsigned long, nr_congested)
 | 
							__field(unsigned long, nr_congested)
 | 
				
			||||||
		__field(unsigned long, nr_immediate)
 | 
							__field(unsigned long, nr_immediate)
 | 
				
			||||||
		__field(unsigned long, nr_activate)
 | 
							__field(unsigned int, nr_activate0)
 | 
				
			||||||
 | 
							__field(unsigned int, nr_activate1)
 | 
				
			||||||
		__field(unsigned long, nr_ref_keep)
 | 
							__field(unsigned long, nr_ref_keep)
 | 
				
			||||||
		__field(unsigned long, nr_unmap_fail)
 | 
							__field(unsigned long, nr_unmap_fail)
 | 
				
			||||||
		__field(int, priority)
 | 
							__field(int, priority)
 | 
				
			||||||
| 
						 | 
					@ -374,20 +375,22 @@ TRACE_EVENT(mm_vmscan_lru_shrink_inactive,
 | 
				
			||||||
		__entry->nr_writeback = stat->nr_writeback;
 | 
							__entry->nr_writeback = stat->nr_writeback;
 | 
				
			||||||
		__entry->nr_congested = stat->nr_congested;
 | 
							__entry->nr_congested = stat->nr_congested;
 | 
				
			||||||
		__entry->nr_immediate = stat->nr_immediate;
 | 
							__entry->nr_immediate = stat->nr_immediate;
 | 
				
			||||||
		__entry->nr_activate = stat->nr_activate;
 | 
							__entry->nr_activate0 = stat->nr_activate[0];
 | 
				
			||||||
 | 
							__entry->nr_activate1 = stat->nr_activate[1];
 | 
				
			||||||
		__entry->nr_ref_keep = stat->nr_ref_keep;
 | 
							__entry->nr_ref_keep = stat->nr_ref_keep;
 | 
				
			||||||
		__entry->nr_unmap_fail = stat->nr_unmap_fail;
 | 
							__entry->nr_unmap_fail = stat->nr_unmap_fail;
 | 
				
			||||||
		__entry->priority = priority;
 | 
							__entry->priority = priority;
 | 
				
			||||||
		__entry->reclaim_flags = trace_shrink_flags(file);
 | 
							__entry->reclaim_flags = trace_shrink_flags(file);
 | 
				
			||||||
	),
 | 
						),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate=%ld nr_ref_keep=%ld nr_unmap_fail=%ld priority=%d flags=%s",
 | 
						TP_printk("nid=%d nr_scanned=%ld nr_reclaimed=%ld nr_dirty=%ld nr_writeback=%ld nr_congested=%ld nr_immediate=%ld nr_activate_anon=%d nr_activate_file=%d nr_ref_keep=%ld nr_unmap_fail=%ld priority=%d flags=%s",
 | 
				
			||||||
		__entry->nid,
 | 
							__entry->nid,
 | 
				
			||||||
		__entry->nr_scanned, __entry->nr_reclaimed,
 | 
							__entry->nr_scanned, __entry->nr_reclaimed,
 | 
				
			||||||
		__entry->nr_dirty, __entry->nr_writeback,
 | 
							__entry->nr_dirty, __entry->nr_writeback,
 | 
				
			||||||
		__entry->nr_congested, __entry->nr_immediate,
 | 
							__entry->nr_congested, __entry->nr_immediate,
 | 
				
			||||||
		__entry->nr_activate, __entry->nr_ref_keep,
 | 
							__entry->nr_activate0, __entry->nr_activate1,
 | 
				
			||||||
		__entry->nr_unmap_fail, __entry->priority,
 | 
							__entry->nr_ref_keep, __entry->nr_unmap_fail,
 | 
				
			||||||
 | 
							__entry->priority,
 | 
				
			||||||
		show_reclaim_flags(__entry->reclaim_flags))
 | 
							show_reclaim_flags(__entry->reclaim_flags))
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										15
									
								
								mm/vmscan.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								mm/vmscan.c
									
									
									
									
									
								
							| 
						 | 
					@ -1107,6 +1107,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
 | 
				
			||||||
	LIST_HEAD(ret_pages);
 | 
						LIST_HEAD(ret_pages);
 | 
				
			||||||
	LIST_HEAD(free_pages);
 | 
						LIST_HEAD(free_pages);
 | 
				
			||||||
	unsigned nr_reclaimed = 0;
 | 
						unsigned nr_reclaimed = 0;
 | 
				
			||||||
 | 
						unsigned pgactivate = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memset(stat, 0, sizeof(*stat));
 | 
						memset(stat, 0, sizeof(*stat));
 | 
				
			||||||
	cond_resched();
 | 
						cond_resched();
 | 
				
			||||||
| 
						 | 
					@ -1466,8 +1467,10 @@ static unsigned long shrink_page_list(struct list_head *page_list,
 | 
				
			||||||
			try_to_free_swap(page);
 | 
								try_to_free_swap(page);
 | 
				
			||||||
		VM_BUG_ON_PAGE(PageActive(page), page);
 | 
							VM_BUG_ON_PAGE(PageActive(page), page);
 | 
				
			||||||
		if (!PageMlocked(page)) {
 | 
							if (!PageMlocked(page)) {
 | 
				
			||||||
 | 
								int type = page_is_file_cache(page);
 | 
				
			||||||
			SetPageActive(page);
 | 
								SetPageActive(page);
 | 
				
			||||||
			stat->nr_activate++;
 | 
								pgactivate++;
 | 
				
			||||||
 | 
								stat->nr_activate[type] += hpage_nr_pages(page);
 | 
				
			||||||
			count_memcg_page_event(page, PGACTIVATE);
 | 
								count_memcg_page_event(page, PGACTIVATE);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
keep_locked:
 | 
					keep_locked:
 | 
				
			||||||
| 
						 | 
					@ -1482,7 +1485,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
 | 
				
			||||||
	free_unref_page_list(&free_pages);
 | 
						free_unref_page_list(&free_pages);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	list_splice(&ret_pages, page_list);
 | 
						list_splice(&ret_pages, page_list);
 | 
				
			||||||
	count_vm_events(PGACTIVATE, stat->nr_activate);
 | 
						count_vm_events(PGACTIVATE, pgactivate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nr_reclaimed;
 | 
						return nr_reclaimed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1807,7 +1810,6 @@ static int too_many_isolated(struct pglist_data *pgdat, int file,
 | 
				
			||||||
static noinline_for_stack void
 | 
					static noinline_for_stack void
 | 
				
			||||||
putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list)
 | 
					putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct zone_reclaim_stat *reclaim_stat = &lruvec->reclaim_stat;
 | 
					 | 
				
			||||||
	struct pglist_data *pgdat = lruvec_pgdat(lruvec);
 | 
						struct pglist_data *pgdat = lruvec_pgdat(lruvec);
 | 
				
			||||||
	LIST_HEAD(pages_to_free);
 | 
						LIST_HEAD(pages_to_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1833,11 +1835,6 @@ putback_inactive_pages(struct lruvec *lruvec, struct list_head *page_list)
 | 
				
			||||||
		lru = page_lru(page);
 | 
							lru = page_lru(page);
 | 
				
			||||||
		add_page_to_lru_list(page, lruvec, lru);
 | 
							add_page_to_lru_list(page, lruvec, lru);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (is_active_lru(lru)) {
 | 
					 | 
				
			||||||
			int file = is_file_lru(lru);
 | 
					 | 
				
			||||||
			int numpages = hpage_nr_pages(page);
 | 
					 | 
				
			||||||
			reclaim_stat->recent_rotated[file] += numpages;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (put_page_testzero(page)) {
 | 
							if (put_page_testzero(page)) {
 | 
				
			||||||
			__ClearPageLRU(page);
 | 
								__ClearPageLRU(page);
 | 
				
			||||||
			__ClearPageActive(page);
 | 
								__ClearPageActive(page);
 | 
				
			||||||
| 
						 | 
					@ -1945,6 +1942,8 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec,
 | 
				
			||||||
		count_memcg_events(lruvec_memcg(lruvec), PGSTEAL_DIRECT,
 | 
							count_memcg_events(lruvec_memcg(lruvec), PGSTEAL_DIRECT,
 | 
				
			||||||
				   nr_reclaimed);
 | 
									   nr_reclaimed);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						reclaim_stat->recent_rotated[0] = stat.nr_activate[0];
 | 
				
			||||||
 | 
						reclaim_stat->recent_rotated[1] = stat.nr_activate[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	putback_inactive_pages(lruvec, &page_list);
 | 
						putback_inactive_pages(lruvec, &page_list);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue