Index: linux-2.6.21-rc5-mm4/Documentation/vm/slabinfo.c =================================================================== --- linux-2.6.21-rc5-mm4.orig/Documentation/vm/slabinfo.c 2007-04-03 23:02:36.000000000 -0700 +++ linux-2.6.21-rc5-mm4/Documentation/vm/slabinfo.c 2007-04-03 23:03:05.000000000 -0700 @@ -14,13 +14,15 @@ #include #include #include +#include char buffer[200]; int show_alias = 0; -int show_slab = 1; -int show_parameter = 0; +int show_slab = 0; +int show_parameters = 0; int skip_zero = 1; +int show_numa = 0; int page_size; @@ -90,12 +92,24 @@ int store_size(char *buffer, unsigned lo void alias(const char *name) { - char *target; + int count; + char *p; if (!show_alias) return; - /* Read link target */ - printf("%20s -> %s", name, target); + + count = readlink(name, buffer, sizeof(buffer)); + + if (count < 0) + return; + + buffer[count] = 0; + + p = buffer + count; + + while (p > buffer && p[-1] != '/') + p--; + printf("%-20s -> %s\n", name, p); } int line = 0; @@ -172,11 +186,12 @@ void slab(const char *name) *p++ = 'T'; *p = 0; - printf("%-20s %8ld %7d %8s %14s %3ld %1ld %3d %3d %s\n", + printf("%-20s %8ld %7ld %8s %14s %3ld %1ld %3ld %3ld %s\n", name, objects, object_size, size_str, dist_str, objs_per_slab, order, slabs ? (partial * 100) / slabs : 100, - slabs ? (objects * object_size * 100) / (slabs * (page_size << order)) : 100, + slabs ? (objects * object_size * 100) / + (slabs * (page_size << order)) : 100, flags); out: chdir(".."); @@ -184,19 +199,55 @@ out: void parameter(const char *name) { - if (!show_parameter) + if (!show_parameters) return; } +struct option opts[] = { + { "aliases", 0, NULL, 'a' }, + { "slabs", 0, NULL, 's' }, + { "numa", 0, NULL, 'n' }, + { "parameters", 0, NULL, 'p' }, + { "zero", 0, NULL, 'z' }, + { NULL, 0, NULL, 0 } +}; + int main(int argc, char *argv[]) { DIR *dir; struct dirent *de; + int c; page_size = getpagesize(); if (chdir("/sys/slab")) fatal("This kernel does not have SLUB support.\n"); + + while ((c = getopt_long(argc, argv, "anpsz", opts, NULL)) != -1) + switch(c) { + case 's': + show_slab = 1; + break; + case 'a': + show_alias = 1; + break; + case 'n': + show_numa = 1; + break; + case 'p': + show_parameters = 1; + break; + case 'z': + skip_zero = 0; + break; + default: + fatal("%s: Invalid option '%c'\n", optopt); + + } + + if (!show_slab && !show_alias && !show_parameters) + show_slab = 1; + dir = opendir("."); while ((de = readdir(dir))) { if (de->d_name[0] == '.')