On 2021/9/18 08:30, John Hubbard wrote: > On 9/17/21 02:48, Weizhao Ouyang wrote: > ... >>>> const struct trace_print_flags pageflag_names[] = { >>> Good catch! Thanks! >>> >>> Reviewed-by: "Huang, Ying" <ying.huang@xxxxxxxxx> >>> >>> It may be better to use BUILD_BUG_ON() to capture similar issue earlier? >> >> How about move migrate_reason_names into mm/page_owner.c and make it size uninitialized(get rid of MR_TYPES). >> Then use BUILD_BUG_ON(ARRAY_SIZE(migrate_reason_names != MR_TYPES)) to check it? >> > A couple more thoughts: > > 1) From a naming and location point of view, migrate_reason_names[] > really doesn't want to be located in page_owner.c. Commit 7cd12b4abfd2 ("mm, page_owner: track and print last migrate reason") imported migrate_reason_names for page owner in mm/debug.c, and it only used by page_owner.c now, maybe it's not so sensitive or we can rename it. > 2) There are actually three places to synchronize, not two. And in fact, > sure enough, the MR_CONTIG_RANGE is already drifting out of synch: it > has a string of "cma" in mm/debug.c, versus "contig_range" in > include/trace/events/migrate.h. Yes, "cma" is out of synch after commit 310253514bbf ("mm/migrate: rename migration reason MR_CMA to MR_CONTIG_RANGE"). Update it to "contig_range" in migrate_reason_names can fix up it. > So...is it possible to use the macro and enums in > include/trace/events/migrate.h, to define the connection between > migrate_reason and a string, everywhere? As for synchronization, tracepoint use TRACE_DEFINE_ENUM() macro to map enums. In general, this kind of synch between subsystem and trace event subsystem is mostly conscious. So it more likes that include/linux/migrate.h is connected to include/trace/events/migrate.h and migrate_reason_names, the others hasn't relationship except same reason string. Anyway, I didn't find a simply way the build the "everywhere" relationship behind the packaged TRACE_DEFINE_ENUM , what do you think. Thanks, Weizhao