hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/vm/slabinfo.c
....@@ -79,6 +79,7 @@
7979 int sort_active;
8080 int set_debug;
8181 int show_ops;
82
+int sort_partial;
8283 int show_activity;
8384 int output_lines = -1;
8485 int sort_loss;
....@@ -110,39 +111,45 @@
110111 static void usage(void)
111112 {
112113 printf("slabinfo 4/15/2011. (c) 2007 sgi/(c) 2011 Linux Foundation.\n\n"
113
- "slabinfo [-ahnpvtsz] [-d debugopts] [slab-regexp]\n"
114
+ "slabinfo [-aABDefhilLnoPrsStTUvXz1] [N=K] [-dafzput] [slab-regexp]\n"
114115 "-a|--aliases Show aliases\n"
115116 "-A|--activity Most active slabs first\n"
116
- "-d<options>|--debug=<options> Set/Clear Debug options\n"
117
+ "-B|--Bytes Show size in bytes\n"
117118 "-D|--display-active Switch line format to activity\n"
118119 "-e|--empty Show empty slabs\n"
119120 "-f|--first-alias Show first alias\n"
120121 "-h|--help Show usage information\n"
121122 "-i|--inverted Inverted list\n"
122123 "-l|--slabs Show slabs\n"
124
+ "-L|--Loss Sort by loss\n"
123125 "-n|--numa Show NUMA information\n"
124
- "-o|--ops Show kmem_cache_ops\n"
126
+ "-N|--lines=K Show the first K slabs\n"
127
+ "-o|--ops Show kmem_cache_ops\n"
128
+ "-P|--partial Sort by number of partial slabs\n"
129
+ "-r|--report Detailed report on single slabs\n"
125130 "-s|--shrink Shrink slabs\n"
126
- "-r|--report Detailed report on single slabs\n"
127131 "-S|--Size Sort by size\n"
128132 "-t|--tracking Show alloc/free information\n"
129133 "-T|--Totals Show summary information\n"
134
+ "-U|--Unreclaim Show unreclaimable slabs only\n"
130135 "-v|--validate Validate slabs\n"
136
+ "-X|--Xtotals Show extended summary information\n"
131137 "-z|--zero Include empty slabs\n"
132138 "-1|--1ref Single reference\n"
133
- "-N|--lines=K Show the first K slabs\n"
134
- "-L|--Loss Sort by loss\n"
135
- "-X|--Xtotals Show extended summary information\n"
136
- "-B|--Bytes Show size in bytes\n"
137
- "-U|--Unreclaim Show unreclaimable slabs only\n"
138
- "\nValid debug options (FZPUT may be combined)\n"
139
- "a / A Switch on all debug options (=FZUP)\n"
140
- "- Switch off all debug options\n"
141
- "f / F Sanity Checks (SLAB_CONSISTENCY_CHECKS)\n"
142
- "z / Z Redzoning\n"
143
- "p / P Poisoning\n"
144
- "u / U Tracking\n"
145
- "t / T Tracing\n"
139
+
140
+ "\n"
141
+ "-d | --debug Switch off all debug options\n"
142
+ "-da | --debug=a Switch on all debug options (--debug=FZPU)\n"
143
+
144
+ "\n"
145
+ "-d[afzput] | --debug=[afzput]\n"
146
+ " f | F Sanity Checks (SLAB_CONSISTENCY_CHECKS)\n"
147
+ " z | Z Redzoning\n"
148
+ " p | P Poisoning\n"
149
+ " u | U Tracking\n"
150
+ " t | T Tracing\n"
151
+
152
+ "\nSorting options (--Loss, --Size, --Partial) are mutually exclusive\n"
146153 );
147154 }
148155
....@@ -226,6 +233,24 @@
226233 return l;
227234 }
228235
236
+static unsigned long read_debug_slab_obj(struct slabinfo *s, const char *name)
237
+{
238
+ char x[128];
239
+ FILE *f;
240
+ size_t l;
241
+
242
+ snprintf(x, 128, "/sys/kernel/debug/slab/%s/%s", s->name, name);
243
+ f = fopen(x, "r");
244
+ if (!f) {
245
+ buffer[0] = 0;
246
+ l = 0;
247
+ } else {
248
+ l = fread(buffer, 1, sizeof(buffer), f);
249
+ buffer[l] = 0;
250
+ fclose(f);
251
+ }
252
+ return l;
253
+}
229254
230255 /*
231256 * Put a size string together
....@@ -402,14 +427,18 @@
402427 {
403428 printf("\n%s: Kernel object allocation\n", s->name);
404429 printf("-----------------------------------------------------------------------\n");
405
- if (read_slab_obj(s, "alloc_calls"))
430
+ if (read_debug_slab_obj(s, "alloc_traces"))
431
+ printf("%s", buffer);
432
+ else if (read_slab_obj(s, "alloc_calls"))
406433 printf("%s", buffer);
407434 else
408435 printf("No Data\n");
409436
410437 printf("\n%s: Kernel object freeing\n", s->name);
411438 printf("------------------------------------------------------------------------\n");
412
- if (read_slab_obj(s, "free_calls"))
439
+ if (read_debug_slab_obj(s, "free_traces"))
440
+ printf("%s", buffer);
441
+ else if (read_slab_obj(s, "free_calls"))
413442 printf("%s", buffer);
414443 else
415444 printf("No Data\n");
....@@ -713,11 +742,11 @@
713742 return;
714743
715744 if (sanity && !s->sanity_checks) {
716
- set_obj(s, "sanity", 1);
745
+ set_obj(s, "sanity_checks", 1);
717746 }
718747 if (!sanity && s->sanity_checks) {
719748 if (slab_empty(s))
720
- set_obj(s, "sanity", 0);
749
+ set_obj(s, "sanity_checks", 0);
721750 else
722751 fprintf(stderr, "%s not empty cannot disable sanity checks\n", s->name);
723752 }
....@@ -1038,13 +1067,27 @@
10381067 for (s2 = s1 + 1; s2 < slabinfo + slabs; s2++) {
10391068 int result;
10401069
1041
- if (sort_size)
1042
- result = slab_size(s1) < slab_size(s2);
1043
- else if (sort_active)
1044
- result = slab_activity(s1) < slab_activity(s2);
1045
- else if (sort_loss)
1046
- result = slab_waste(s1) < slab_waste(s2);
1047
- else
1070
+ if (sort_size) {
1071
+ if (slab_size(s1) == slab_size(s2))
1072
+ result = strcasecmp(s1->name, s2->name);
1073
+ else
1074
+ result = slab_size(s1) < slab_size(s2);
1075
+ } else if (sort_active) {
1076
+ if (slab_activity(s1) == slab_activity(s2))
1077
+ result = strcasecmp(s1->name, s2->name);
1078
+ else
1079
+ result = slab_activity(s1) < slab_activity(s2);
1080
+ } else if (sort_loss) {
1081
+ if (slab_waste(s1) == slab_waste(s2))
1082
+ result = strcasecmp(s1->name, s2->name);
1083
+ else
1084
+ result = slab_waste(s1) < slab_waste(s2);
1085
+ } else if (sort_partial) {
1086
+ if (s1->partial == s2->partial)
1087
+ result = strcasecmp(s1->name, s2->name);
1088
+ else
1089
+ result = s1->partial < s2->partial;
1090
+ } else
10481091 result = strcasecmp(s1->name, s2->name);
10491092
10501093 if (show_inverted)
....@@ -1304,33 +1347,46 @@
13041347 }
13051348 }
13061349
1350
+static void _xtotals(char *heading, char *underline,
1351
+ int loss, int size, int partial)
1352
+{
1353
+ printf("%s%s", heading, underline);
1354
+ line = 0;
1355
+ sort_loss = loss;
1356
+ sort_size = size;
1357
+ sort_partial = partial;
1358
+ sort_slabs();
1359
+ output_slabs();
1360
+}
1361
+
13071362 static void xtotals(void)
13081363 {
1364
+ char *heading, *underline;
1365
+
13091366 totals();
13101367
13111368 link_slabs();
13121369 rename_slabs();
13131370
1314
- printf("\nSlabs sorted by size\n");
1315
- printf("--------------------\n");
1316
- sort_loss = 0;
1317
- sort_size = 1;
1318
- sort_slabs();
1319
- output_slabs();
1371
+ heading = "\nSlabs sorted by size\n";
1372
+ underline = "--------------------\n";
1373
+ _xtotals(heading, underline, 0, 1, 0);
13201374
1321
- printf("\nSlabs sorted by loss\n");
1322
- printf("--------------------\n");
1323
- line = 0;
1324
- sort_loss = 1;
1325
- sort_size = 0;
1326
- sort_slabs();
1327
- output_slabs();
1375
+ heading = "\nSlabs sorted by loss\n";
1376
+ underline = "--------------------\n";
1377
+ _xtotals(heading, underline, 1, 0, 0);
1378
+
1379
+ heading = "\nSlabs sorted by number of partial slabs\n";
1380
+ underline = "---------------------------------------\n";
1381
+ _xtotals(heading, underline, 0, 0, 1);
1382
+
13281383 printf("\n");
13291384 }
13301385
13311386 struct option opts[] = {
13321387 { "aliases", no_argument, NULL, 'a' },
13331388 { "activity", no_argument, NULL, 'A' },
1389
+ { "Bytes", no_argument, NULL, 'B'},
13341390 { "debug", optional_argument, NULL, 'd' },
13351391 { "display-activity", no_argument, NULL, 'D' },
13361392 { "empty", no_argument, NULL, 'e' },
....@@ -1338,21 +1394,21 @@
13381394 { "help", no_argument, NULL, 'h' },
13391395 { "inverted", no_argument, NULL, 'i'},
13401396 { "slabs", no_argument, NULL, 'l' },
1397
+ { "Loss", no_argument, NULL, 'L'},
13411398 { "numa", no_argument, NULL, 'n' },
1399
+ { "lines", required_argument, NULL, 'N'},
13421400 { "ops", no_argument, NULL, 'o' },
1343
- { "shrink", no_argument, NULL, 's' },
1401
+ { "partial", no_argument, NULL, 'p'},
13441402 { "report", no_argument, NULL, 'r' },
1403
+ { "shrink", no_argument, NULL, 's' },
13451404 { "Size", no_argument, NULL, 'S'},
13461405 { "tracking", no_argument, NULL, 't'},
13471406 { "Totals", no_argument, NULL, 'T'},
1407
+ { "Unreclaim", no_argument, NULL, 'U'},
13481408 { "validate", no_argument, NULL, 'v' },
1409
+ { "Xtotals", no_argument, NULL, 'X'},
13491410 { "zero", no_argument, NULL, 'z' },
13501411 { "1ref", no_argument, NULL, '1'},
1351
- { "lines", required_argument, NULL, 'N'},
1352
- { "Loss", no_argument, NULL, 'L'},
1353
- { "Xtotals", no_argument, NULL, 'X'},
1354
- { "Bytes", no_argument, NULL, 'B'},
1355
- { "Unreclaim", no_argument, NULL, 'U'},
13561412 { NULL, 0, NULL, 0 }
13571413 };
13581414
....@@ -1364,17 +1420,17 @@
13641420
13651421 page_size = getpagesize();
13661422
1367
- while ((c = getopt_long(argc, argv, "aAd::Defhil1noprstvzTSN:LXBU",
1423
+ while ((c = getopt_long(argc, argv, "aABd::DefhilLnN:oPrsStTUvXz1",
13681424 opts, NULL)) != -1)
13691425 switch (c) {
1370
- case '1':
1371
- show_single_ref = 1;
1372
- break;
13731426 case 'a':
13741427 show_alias = 1;
13751428 break;
13761429 case 'A':
13771430 sort_active = 1;
1431
+ break;
1432
+ case 'B':
1433
+ show_bytes = 1;
13781434 break;
13791435 case 'd':
13801436 set_debug = 1;
....@@ -1396,35 +1452,14 @@
13961452 case 'i':
13971453 show_inverted = 1;
13981454 break;
1399
- case 'n':
1400
- show_numa = 1;
1401
- break;
1402
- case 'o':
1403
- show_ops = 1;
1404
- break;
1405
- case 'r':
1406
- show_report = 1;
1407
- break;
1408
- case 's':
1409
- shrink = 1;
1410
- break;
14111455 case 'l':
14121456 show_slab = 1;
14131457 break;
1414
- case 't':
1415
- show_track = 1;
1458
+ case 'L':
1459
+ sort_loss = 1;
14161460 break;
1417
- case 'v':
1418
- validate = 1;
1419
- break;
1420
- case 'z':
1421
- skip_zero = 0;
1422
- break;
1423
- case 'T':
1424
- show_totals = 1;
1425
- break;
1426
- case 'S':
1427
- sort_size = 1;
1461
+ case 'n':
1462
+ show_numa = 1;
14281463 break;
14291464 case 'N':
14301465 if (optarg) {
....@@ -1433,8 +1468,32 @@
14331468 output_lines = 1;
14341469 }
14351470 break;
1436
- case 'L':
1437
- sort_loss = 1;
1471
+ case 'o':
1472
+ show_ops = 1;
1473
+ break;
1474
+ case 'r':
1475
+ show_report = 1;
1476
+ break;
1477
+ case 'P':
1478
+ sort_partial = 1;
1479
+ break;
1480
+ case 's':
1481
+ shrink = 1;
1482
+ break;
1483
+ case 'S':
1484
+ sort_size = 1;
1485
+ break;
1486
+ case 't':
1487
+ show_track = 1;
1488
+ break;
1489
+ case 'T':
1490
+ show_totals = 1;
1491
+ break;
1492
+ case 'U':
1493
+ unreclaim_only = 1;
1494
+ break;
1495
+ case 'v':
1496
+ validate = 1;
14381497 break;
14391498 case 'X':
14401499 if (output_lines == -1)
....@@ -1442,11 +1501,11 @@
14421501 extended_totals = 1;
14431502 show_bytes = 1;
14441503 break;
1445
- case 'B':
1446
- show_bytes = 1;
1504
+ case 'z':
1505
+ skip_zero = 0;
14471506 break;
1448
- case 'U':
1449
- unreclaim_only = 1;
1507
+ case '1':
1508
+ show_single_ref = 1;
14501509 break;
14511510 default:
14521511 fatal("%s: Invalid option '%c'\n", argv[0], optopt);