148 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#undef TRACE_SYSTEM3#define TRACE_SYSTEM migrate4 5#if !defined(_TRACE_MIGRATE_H) || defined(TRACE_HEADER_MULTI_READ)6#define _TRACE_MIGRATE_H7 8#include <linux/tracepoint.h>9 10#define MIGRATE_MODE \11 EM( MIGRATE_ASYNC, "MIGRATE_ASYNC") \12 EM( MIGRATE_SYNC_LIGHT, "MIGRATE_SYNC_LIGHT") \13 EMe(MIGRATE_SYNC, "MIGRATE_SYNC")14 15 16#define MIGRATE_REASON \17 EM( MR_COMPACTION, "compaction") \18 EM( MR_MEMORY_FAILURE, "memory_failure") \19 EM( MR_MEMORY_HOTPLUG, "memory_hotplug") \20 EM( MR_SYSCALL, "syscall_or_cpuset") \21 EM( MR_MEMPOLICY_MBIND, "mempolicy_mbind") \22 EM( MR_NUMA_MISPLACED, "numa_misplaced") \23 EM( MR_CONTIG_RANGE, "contig_range") \24 EM( MR_LONGTERM_PIN, "longterm_pin") \25 EM( MR_DEMOTION, "demotion") \26 EMe(MR_DAMON, "damon")27 28/*29 * First define the enums in the above macros to be exported to userspace30 * via TRACE_DEFINE_ENUM().31 */32#undef EM33#undef EMe34#define EM(a, b) TRACE_DEFINE_ENUM(a);35#define EMe(a, b) TRACE_DEFINE_ENUM(a);36 37MIGRATE_MODE38MIGRATE_REASON39 40/*41 * Now redefine the EM() and EMe() macros to map the enums to the strings42 * that will be printed in the output.43 */44#undef EM45#undef EMe46#define EM(a, b) {a, b},47#define EMe(a, b) {a, b}48 49TRACE_EVENT(mm_migrate_pages,50 51 TP_PROTO(unsigned long succeeded, unsigned long failed,52 unsigned long thp_succeeded, unsigned long thp_failed,53 unsigned long thp_split, unsigned long large_folio_split,54 enum migrate_mode mode, int reason),55 56 TP_ARGS(succeeded, failed, thp_succeeded, thp_failed,57 thp_split, large_folio_split, mode, reason),58 59 TP_STRUCT__entry(60 __field( unsigned long, succeeded)61 __field( unsigned long, failed)62 __field( unsigned long, thp_succeeded)63 __field( unsigned long, thp_failed)64 __field( unsigned long, thp_split)65 __field( unsigned long, large_folio_split)66 __field( enum migrate_mode, mode)67 __field( int, reason)68 ),69 70 TP_fast_assign(71 __entry->succeeded = succeeded;72 __entry->failed = failed;73 __entry->thp_succeeded = thp_succeeded;74 __entry->thp_failed = thp_failed;75 __entry->thp_split = thp_split;76 __entry->large_folio_split = large_folio_split;77 __entry->mode = mode;78 __entry->reason = reason;79 ),80 81 TP_printk("nr_succeeded=%lu nr_failed=%lu nr_thp_succeeded=%lu nr_thp_failed=%lu nr_thp_split=%lu nr_split=%lu mode=%s reason=%s",82 __entry->succeeded,83 __entry->failed,84 __entry->thp_succeeded,85 __entry->thp_failed,86 __entry->thp_split,87 __entry->large_folio_split,88 __print_symbolic(__entry->mode, MIGRATE_MODE),89 __print_symbolic(__entry->reason, MIGRATE_REASON))90);91 92TRACE_EVENT(mm_migrate_pages_start,93 94 TP_PROTO(enum migrate_mode mode, int reason),95 96 TP_ARGS(mode, reason),97 98 TP_STRUCT__entry(99 __field(enum migrate_mode, mode)100 __field(int, reason)101 ),102 103 TP_fast_assign(104 __entry->mode = mode;105 __entry->reason = reason;106 ),107 108 TP_printk("mode=%s reason=%s",109 __print_symbolic(__entry->mode, MIGRATE_MODE),110 __print_symbolic(__entry->reason, MIGRATE_REASON))111);112 113DECLARE_EVENT_CLASS(migration_pte,114 115 TP_PROTO(unsigned long addr, unsigned long pte, int order),116 117 TP_ARGS(addr, pte, order),118 119 TP_STRUCT__entry(120 __field(unsigned long, addr)121 __field(unsigned long, pte)122 __field(int, order)123 ),124 125 TP_fast_assign(126 __entry->addr = addr;127 __entry->pte = pte;128 __entry->order = order;129 ),130 131 TP_printk("addr=%lx, pte=%lx order=%d", __entry->addr, __entry->pte, __entry->order)132);133 134DEFINE_EVENT(migration_pte, set_migration_pte,135 TP_PROTO(unsigned long addr, unsigned long pte, int order),136 TP_ARGS(addr, pte, order)137);138 139DEFINE_EVENT(migration_pte, remove_migration_pte,140 TP_PROTO(unsigned long addr, unsigned long pte, int order),141 TP_ARGS(addr, pte, order)142);143 144#endif /* _TRACE_MIGRATE_H */145 146/* This part must be outside protection */147#include <trace/define_trace.h>148