@@ -883,6 +883,7 @@ static void frag_stop(struct seq_file *m, void *arg)
883
883
884
884
/* Walk all the zones in a node and print using a callback */
885
885
static void walk_zones_in_node (struct seq_file * m , pg_data_t * pgdat ,
886
+ bool nolock ,
886
887
void (* print )(struct seq_file * m , pg_data_t * , struct zone * ))
887
888
{
888
889
struct zone * zone ;
@@ -893,9 +894,11 @@ static void walk_zones_in_node(struct seq_file *m, pg_data_t *pgdat,
893
894
if (!populated_zone (zone ))
894
895
continue ;
895
896
896
- spin_lock_irqsave (& zone -> lock , flags );
897
+ if (!nolock )
898
+ spin_lock_irqsave (& zone -> lock , flags );
897
899
print (m , pgdat , zone );
898
- spin_unlock_irqrestore (& zone -> lock , flags );
900
+ if (!nolock )
901
+ spin_unlock_irqrestore (& zone -> lock , flags );
899
902
}
900
903
}
901
904
#endif
@@ -931,7 +934,7 @@ static void frag_show_print(struct seq_file *m, pg_data_t *pgdat,
931
934
static int frag_show (struct seq_file * m , void * arg )
932
935
{
933
936
pg_data_t * pgdat = (pg_data_t * )arg ;
934
- walk_zones_in_node (m , pgdat , frag_show_print );
937
+ walk_zones_in_node (m , pgdat , false, frag_show_print );
935
938
return 0 ;
936
939
}
937
940
@@ -972,7 +975,7 @@ static int pagetypeinfo_showfree(struct seq_file *m, void *arg)
972
975
seq_printf (m , "%6d " , order );
973
976
seq_putc (m , '\n' );
974
977
975
- walk_zones_in_node (m , pgdat , pagetypeinfo_showfree_print );
978
+ walk_zones_in_node (m , pgdat , false, pagetypeinfo_showfree_print );
976
979
977
980
return 0 ;
978
981
}
@@ -1021,7 +1024,7 @@ static int pagetypeinfo_showblockcount(struct seq_file *m, void *arg)
1021
1024
for (mtype = 0 ; mtype < MIGRATE_TYPES ; mtype ++ )
1022
1025
seq_printf (m , "%12s " , migratetype_names [mtype ]);
1023
1026
seq_putc (m , '\n' );
1024
- walk_zones_in_node (m , pgdat , pagetypeinfo_showblockcount_print );
1027
+ walk_zones_in_node (m , pgdat , false, pagetypeinfo_showblockcount_print );
1025
1028
1026
1029
return 0 ;
1027
1030
}
@@ -1065,7 +1068,11 @@ static void pagetypeinfo_showmixedcount_print(struct seq_file *m,
1065
1068
1066
1069
page = pfn_to_page (pfn );
1067
1070
if (PageBuddy (page )) {
1068
- pfn += (1UL << page_order (page )) - 1 ;
1071
+ unsigned long freepage_order ;
1072
+
1073
+ freepage_order = page_order_unsafe (page );
1074
+ if (freepage_order < MAX_ORDER )
1075
+ pfn += (1UL << freepage_order ) - 1 ;
1069
1076
continue ;
1070
1077
}
1071
1078
@@ -1120,7 +1127,7 @@ static void pagetypeinfo_showmixedcount(struct seq_file *m, pg_data_t *pgdat)
1120
1127
seq_printf (m , "%12s " , migratetype_names [mtype ]);
1121
1128
seq_putc (m , '\n' );
1122
1129
1123
- walk_zones_in_node (m , pgdat , pagetypeinfo_showmixedcount_print );
1130
+ walk_zones_in_node (m , pgdat , true, pagetypeinfo_showmixedcount_print );
1124
1131
#endif /* CONFIG_PAGE_OWNER */
1125
1132
}
1126
1133
@@ -1253,7 +1260,7 @@ static void zoneinfo_show_print(struct seq_file *m, pg_data_t *pgdat,
1253
1260
static int zoneinfo_show (struct seq_file * m , void * arg )
1254
1261
{
1255
1262
pg_data_t * pgdat = (pg_data_t * )arg ;
1256
- walk_zones_in_node (m , pgdat , zoneinfo_show_print );
1263
+ walk_zones_in_node (m , pgdat , false, zoneinfo_show_print );
1257
1264
return 0 ;
1258
1265
}
1259
1266
@@ -1601,7 +1608,7 @@ static int unusable_show(struct seq_file *m, void *arg)
1601
1608
if (!node_state (pgdat -> node_id , N_MEMORY ))
1602
1609
return 0 ;
1603
1610
1604
- walk_zones_in_node (m , pgdat , unusable_show_print );
1611
+ walk_zones_in_node (m , pgdat , false, unusable_show_print );
1605
1612
1606
1613
return 0 ;
1607
1614
}
@@ -1653,7 +1660,7 @@ static int extfrag_show(struct seq_file *m, void *arg)
1653
1660
{
1654
1661
pg_data_t * pgdat = (pg_data_t * )arg ;
1655
1662
1656
- walk_zones_in_node (m , pgdat , extfrag_show_print );
1663
+ walk_zones_in_node (m , pgdat , false, extfrag_show_print );
1657
1664
1658
1665
return 0 ;
1659
1666
}
0 commit comments