]> git.itanic.dy.fi Git - linux-stable/commitdiff
tools/vm/page_owner_sort.c: support sorting by stack trace
authorSean Anderson <seanga2@gmail.com>
Fri, 25 Mar 2022 01:08:41 +0000 (18:08 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 Mar 2022 02:06:44 +0000 (19:06 -0700)
This adds the ability to sort by stacktraces.  This is helpful when
comparing multiple dumps of page_owner taken at different times, since
blocks will not be reordered if they were allocated/free'd.

Link: https://lkml.kernel.org/r/20211124193709.1805776-2-seanga2@gmail.com
Signed-off-by: Sean Anderson <seanga2@gmail.com>
Cc: Zhenliang Wei <weizhenliang@huawei.com>
Cc: Changhee Han <ch0.han@lge.com>
Cc: Tang Bin <tangbin@cmss.chinamobile.com>
Cc: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Yinan Zhang <zhangyinan2019@email.szu.edu.cn>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
tools/vm/page_owner_sort.c

index 5582d8454d3bd225590b675abf28d7b83d44a4df..1b2acf02d3cd6f11c9c223a05d975964a7f4ac1f 100644 (file)
@@ -29,7 +29,6 @@ struct block_list {
        int page_num;
 };
 
-static int sort_by_memory;
 static regex_t order_pattern;
 static struct block_list *list;
 static int list_size;
@@ -134,13 +133,16 @@ static void add_list(char *buf, int len)
 
 static void usage(void)
 {
-       printf("Usage: ./page_owner_sort [-m] <input> <output>\n"
-               "-m     Sort by total memory. If this option is unset, sort by times\n"
+       printf("Usage: ./page_owner_sort [OPTIONS] <input> <output>\n"
+               "-m     Sort by total memory.\n"
+               "-s     Sort by the stack trace.\n"
+               "-t     Sort by times (default).\n"
        );
 }
 
 int main(int argc, char **argv)
 {
+       int (*cmp)(const void *, const void *) = compare_num;
        FILE *fin, *fout;
        char *buf;
        int ret, i, count;
@@ -149,10 +151,16 @@ int main(int argc, char **argv)
        int err;
        int opt;
 
-       while ((opt = getopt(argc, argv, "m")) != -1)
+       while ((opt = getopt(argc, argv, "mst")) != -1)
                switch (opt) {
                case 'm':
-                       sort_by_memory = 1;
+                       cmp = compare_page_num;
+                       break;
+               case 's':
+                       cmp = compare_stacktrace;
+                       break;
+               case 't':
+                       cmp = compare_num;
                        break;
                default:
                        usage();
@@ -221,10 +229,7 @@ int main(int argc, char **argv)
                }
        }
 
-       if (sort_by_memory)
-               qsort(list2, count, sizeof(list[0]), compare_page_num);
-       else
-               qsort(list2, count, sizeof(list[0]), compare_num);
+       qsort(list2, count, sizeof(list[0]), cmp);
 
        for (i = 0; i < count; i++)
                fprintf(fout, "%d times, %d pages:\n%s\n",