app/testpmd: support dumping socket memory
[dpdk.git] / app / test-pmd / cmdline.c
index 7b86bef..7dc4eec 100644 (file)
@@ -9566,6 +9566,56 @@ dump_struct_sizes(void)
 #undef DUMP_SIZE
 }
 
+
+/* Dump the socket memory statistics on console */
+static void
+dump_socket_mem(FILE *f)
+{
+       struct rte_malloc_socket_stats socket_stats;
+       unsigned int i;
+       size_t total = 0;
+       size_t alloc = 0;
+       size_t free = 0;
+       unsigned int n_alloc = 0;
+       unsigned int n_free = 0;
+       static size_t last_allocs;
+       static size_t last_total;
+
+
+       for (i = 0; i < RTE_MAX_NUMA_NODES; i++) {
+               if (rte_malloc_get_socket_stats(i, &socket_stats) ||
+                   !socket_stats.heap_totalsz_bytes)
+                       continue;
+               total += socket_stats.heap_totalsz_bytes;
+               alloc += socket_stats.heap_allocsz_bytes;
+               free += socket_stats.heap_freesz_bytes;
+               n_alloc += socket_stats.alloc_count;
+               n_free += socket_stats.free_count;
+               fprintf(f,
+                       "Socket %u: size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n",
+                       i,
+                       (double)socket_stats.heap_totalsz_bytes / (1024 * 1024),
+                       (double)socket_stats.heap_allocsz_bytes / (1024 * 1024),
+                       (double)socket_stats.heap_allocsz_bytes * 100 /
+                       (double)socket_stats.heap_totalsz_bytes,
+                       (double)socket_stats.heap_freesz_bytes / (1024 * 1024),
+                       socket_stats.alloc_count,
+                       socket_stats.free_count);
+       }
+       fprintf(f,
+               "Total   : size(M) total: %.6lf alloc: %.6lf(%.3lf%%) free: %.6lf \tcount alloc: %-4u free: %u\n",
+               (double)total / (1024 * 1024), (double)alloc / (1024 * 1024),
+               (double)alloc * 100 / (double)total,
+               (double)free / (1024 * 1024),
+               n_alloc, n_free);
+       if (last_allocs)
+               fprintf(stdout, "Memory total change: %.6lf(M), allocation change: %.6lf(M)\n",
+                       ((double)total - (double)last_total) / (1024 * 1024),
+                       (double)(alloc - (double)last_allocs) / 1024 / 1024);
+       last_allocs = alloc;
+       last_total = total;
+}
+
 static void cmd_dump_parsed(void *parsed_result,
                            __rte_unused struct cmdline *cl,
                            __rte_unused void *data)
@@ -9574,6 +9624,8 @@ static void cmd_dump_parsed(void *parsed_result,
 
        if (!strcmp(res->dump, "dump_physmem"))
                rte_dump_physmem_layout(stdout);
+       else if (!strcmp(res->dump, "dump_socket_mem"))
+               dump_socket_mem(stdout);
        else if (!strcmp(res->dump, "dump_memzone"))
                rte_memzone_dump(stdout);
        else if (!strcmp(res->dump, "dump_struct_sizes"))
@@ -9592,6 +9644,7 @@ cmdline_parse_token_string_t cmd_dump_dump =
        TOKEN_STRING_INITIALIZER(struct cmd_dump_result, dump,
                "dump_physmem#"
                "dump_memzone#"
+               "dump_socket_mem#"
                "dump_struct_sizes#"
                "dump_ring#"
                "dump_mempool#"