mm: migrate: Add a tracepoint for migrate_pages
The pgmigrate_success and pgmigrate_fail vmstat counters tells the user about migration activity but not the type or the reason. This patch adds a tracepoint to identify the type of page migration and why the page is being migrated. Signed-off-by: Mel Gorman <mgorman@suse.de> Reviewed-by: Rik van Riel <riel@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								5647bc293a
							
						
					
				
			
			
				commit
				
					
						7b2a2d4a18
					
				
			
		
					 8 changed files with 82 additions and 10 deletions
				
			
		|  | @ -7,6 +7,15 @@ | |||
| 
 | ||||
| typedef struct page *new_page_t(struct page *, unsigned long private, int **); | ||||
| 
 | ||||
| enum migrate_reason { | ||||
| 	MR_COMPACTION, | ||||
| 	MR_MEMORY_FAILURE, | ||||
| 	MR_MEMORY_HOTPLUG, | ||||
| 	MR_SYSCALL,		/* also applies to cpusets */ | ||||
| 	MR_MEMPOLICY_MBIND, | ||||
| 	MR_CMA | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_MIGRATION | ||||
| 
 | ||||
| extern void putback_lru_pages(struct list_head *l); | ||||
|  | @ -14,7 +23,7 @@ extern int migrate_page(struct address_space *, | |||
| 			struct page *, struct page *, enum migrate_mode); | ||||
| extern int migrate_pages(struct list_head *l, new_page_t x, | ||||
| 			unsigned long private, bool offlining, | ||||
| 			enum migrate_mode mode); | ||||
| 			enum migrate_mode mode, int reason); | ||||
| extern int migrate_huge_page(struct page *, new_page_t x, | ||||
| 			unsigned long private, bool offlining, | ||||
| 			enum migrate_mode mode); | ||||
|  | @ -35,7 +44,7 @@ extern int migrate_huge_page_move_mapping(struct address_space *mapping, | |||
| static inline void putback_lru_pages(struct list_head *l) {} | ||||
| static inline int migrate_pages(struct list_head *l, new_page_t x, | ||||
| 		unsigned long private, bool offlining, | ||||
| 		enum migrate_mode mode) { return -ENOSYS; } | ||||
| 		enum migrate_mode mode, int reason) { return -ENOSYS; } | ||||
| static inline int migrate_huge_page(struct page *page, new_page_t x, | ||||
| 		unsigned long private, bool offlining, | ||||
| 		enum migrate_mode mode) { return -ENOSYS; } | ||||
|  |  | |||
							
								
								
									
										51
									
								
								include/trace/events/migrate.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								include/trace/events/migrate.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| #undef TRACE_SYSTEM | ||||
| #define TRACE_SYSTEM migrate | ||||
| 
 | ||||
| #if !defined(_TRACE_MIGRATE_H) || defined(TRACE_HEADER_MULTI_READ) | ||||
| #define _TRACE_MIGRATE_H | ||||
| 
 | ||||
| #define MIGRATE_MODE						\ | ||||
| 	{MIGRATE_ASYNC,		"MIGRATE_ASYNC"},		\ | ||||
| 	{MIGRATE_SYNC_LIGHT,	"MIGRATE_SYNC_LIGHT"},		\ | ||||
| 	{MIGRATE_SYNC,		"MIGRATE_SYNC"}		 | ||||
| 
 | ||||
| #define MIGRATE_REASON						\ | ||||
| 	{MR_COMPACTION,		"compaction"},			\ | ||||
| 	{MR_MEMORY_FAILURE,	"memory_failure"},		\ | ||||
| 	{MR_MEMORY_HOTPLUG,	"memory_hotplug"},		\ | ||||
| 	{MR_SYSCALL,		"syscall_or_cpuset"},		\ | ||||
| 	{MR_MEMPOLICY_MBIND,	"mempolicy_mbind"},		\ | ||||
| 	{MR_CMA,		"cma"} | ||||
| 
 | ||||
| TRACE_EVENT(mm_migrate_pages, | ||||
| 
 | ||||
| 	TP_PROTO(unsigned long succeeded, unsigned long failed, | ||||
| 		 enum migrate_mode mode, int reason), | ||||
| 
 | ||||
| 	TP_ARGS(succeeded, failed, mode, reason), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(	unsigned long,		succeeded) | ||||
| 		__field(	unsigned long,		failed) | ||||
| 		__field(	enum migrate_mode,	mode) | ||||
| 		__field(	int,			reason) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->succeeded	= succeeded; | ||||
| 		__entry->failed		= failed; | ||||
| 		__entry->mode		= mode; | ||||
| 		__entry->reason		= reason; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("nr_succeeded=%lu nr_failed=%lu mode=%s reason=%s", | ||||
| 		__entry->succeeded, | ||||
| 		__entry->failed, | ||||
| 		__print_symbolic(__entry->mode, MIGRATE_MODE), | ||||
| 		__print_symbolic(__entry->reason, MIGRATE_REASON)) | ||||
| ); | ||||
| 
 | ||||
| #endif /* _TRACE_MIGRATE_H */ | ||||
| 
 | ||||
| /* This part must be outside protection */ | ||||
| #include <trace/define_trace.h> | ||||
|  | @ -990,7 +990,8 @@ static int compact_zone(struct zone *zone, struct compact_control *cc) | |||
| 		nr_migrate = cc->nr_migratepages; | ||||
| 		err = migrate_pages(&cc->migratepages, compaction_alloc, | ||||
| 				(unsigned long)cc, false, | ||||
| 				cc->sync ? MIGRATE_SYNC_LIGHT : MIGRATE_ASYNC); | ||||
| 				cc->sync ? MIGRATE_SYNC_LIGHT : MIGRATE_ASYNC, | ||||
| 				MR_COMPACTION); | ||||
| 		update_nr_listpages(cc); | ||||
| 		nr_remaining = cc->nr_migratepages; | ||||
| 
 | ||||
|  |  | |||
|  | @ -1558,7 +1558,8 @@ int soft_offline_page(struct page *page, int flags) | |||
| 					    page_is_file_cache(page)); | ||||
| 		list_add(&page->lru, &pagelist); | ||||
| 		ret = migrate_pages(&pagelist, new_page, MPOL_MF_MOVE_ALL, | ||||
| 							false, MIGRATE_SYNC); | ||||
| 							false, MIGRATE_SYNC, | ||||
| 							MR_MEMORY_FAILURE); | ||||
| 		if (ret) { | ||||
| 			putback_lru_pages(&pagelist); | ||||
| 			pr_info("soft offline: %#lx: migration failed %d, type %lx\n", | ||||
|  |  | |||
|  | @ -812,7 +812,8 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) | |||
| 		 * migrate_pages returns # of failed pages. | ||||
| 		 */ | ||||
| 		ret = migrate_pages(&source, alloc_migrate_target, 0, | ||||
| 							true, MIGRATE_SYNC); | ||||
| 							true, MIGRATE_SYNC, | ||||
| 							MR_MEMORY_HOTPLUG); | ||||
| 		if (ret) | ||||
| 			putback_lru_pages(&source); | ||||
| 	} | ||||
|  |  | |||
|  | @ -961,7 +961,8 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest, | |||
| 
 | ||||
| 	if (!list_empty(&pagelist)) { | ||||
| 		err = migrate_pages(&pagelist, new_node_page, dest, | ||||
| 							false, MIGRATE_SYNC); | ||||
| 							false, MIGRATE_SYNC, | ||||
| 							MR_SYSCALL); | ||||
| 		if (err) | ||||
| 			putback_lru_pages(&pagelist); | ||||
| 	} | ||||
|  | @ -1202,7 +1203,8 @@ static long do_mbind(unsigned long start, unsigned long len, | |||
| 		if (!list_empty(&pagelist)) { | ||||
| 			nr_failed = migrate_pages(&pagelist, new_vma_page, | ||||
| 						(unsigned long)vma, | ||||
| 						false, MIGRATE_SYNC); | ||||
| 						false, MIGRATE_SYNC, | ||||
| 						MR_MEMPOLICY_MBIND); | ||||
| 			if (nr_failed) | ||||
| 				putback_lru_pages(&pagelist); | ||||
| 		} | ||||
|  |  | |||
							
								
								
									
										10
									
								
								mm/migrate.c
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								mm/migrate.c
									
										
									
									
									
								
							|  | @ -38,6 +38,9 @@ | |||
| 
 | ||||
| #include <asm/tlbflush.h> | ||||
| 
 | ||||
| #define CREATE_TRACE_POINTS | ||||
| #include <trace/events/migrate.h> | ||||
| 
 | ||||
| #include "internal.h" | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -958,7 +961,7 @@ out: | |||
|  */ | ||||
| int migrate_pages(struct list_head *from, | ||||
| 		new_page_t get_new_page, unsigned long private, bool offlining, | ||||
| 		enum migrate_mode mode) | ||||
| 		enum migrate_mode mode, int reason) | ||||
| { | ||||
| 	int retry = 1; | ||||
| 	int nr_failed = 0; | ||||
|  | @ -1004,6 +1007,8 @@ out: | |||
| 		count_vm_events(PGMIGRATE_SUCCESS, nr_succeeded); | ||||
| 	if (nr_failed) | ||||
| 		count_vm_events(PGMIGRATE_FAIL, nr_failed); | ||||
| 	trace_mm_migrate_pages(nr_succeeded, nr_failed, mode, reason); | ||||
| 
 | ||||
| 	if (!swapwrite) | ||||
| 		current->flags &= ~PF_SWAPWRITE; | ||||
| 
 | ||||
|  | @ -1145,7 +1150,8 @@ set_status: | |||
| 	err = 0; | ||||
| 	if (!list_empty(&pagelist)) { | ||||
| 		err = migrate_pages(&pagelist, new_page_node, | ||||
| 				(unsigned long)pm, 0, MIGRATE_SYNC); | ||||
| 				(unsigned long)pm, 0, MIGRATE_SYNC, | ||||
| 				MR_SYSCALL); | ||||
| 		if (err) | ||||
| 			putback_lru_pages(&pagelist); | ||||
| 	} | ||||
|  |  | |||
|  | @ -5707,7 +5707,8 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, | |||
| 
 | ||||
| 		ret = migrate_pages(&cc->migratepages, | ||||
| 				    alloc_migrate_target, | ||||
| 				    0, false, MIGRATE_SYNC); | ||||
| 				    0, false, MIGRATE_SYNC, | ||||
| 				    MR_CMA); | ||||
| 	} | ||||
| 
 | ||||
| 	putback_lru_pages(&cc->migratepages); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mel Gorman
				Mel Gorman