X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=lib%2Fmemory_vty.c;h=5fd9c3b900437c13a5feb6c2f792d7aa96a08c33;hb=2569910bb6e5c00ececc60ed15b182e14a88cb9d;hp=5983efbdccba8c0bd50095fcf6e3b77c4ceefa33;hpb=21bb7c877480d911486a389cb67f8ee318306e38;p=mirror_frr.git diff --git a/lib/memory_vty.c b/lib/memory_vty.c index 5983efbdc..5fd9c3b90 100644 --- a/lib/memory_vty.c +++ b/lib/memory_vty.c @@ -21,11 +21,16 @@ #include /* malloc.h is generally obsolete, however GNU Libc mallinfo wants it. */ -#if (defined(GNU_LINUX) && defined(HAVE_MALLINFO)) +#ifdef HAVE_MALLOC_H #include -#endif /* HAVE_MALLINFO */ +#endif +#ifdef HAVE_MALLOC_MALLOC_H +#include +#endif #include +#ifdef HAVE_LINK_H #include +#endif #include "log.h" #include "memory.h" @@ -38,48 +43,77 @@ #include "command.h" #ifdef HAVE_MALLINFO -static int -show_memory_mallinfo (struct vty *vty) +static int show_memory_mallinfo(struct vty *vty) { - struct mallinfo minfo = mallinfo(); - char buf[MTYPE_MEMSTR_LEN]; - - vty_outln (vty, "System allocator statistics:"); - vty_outln (vty, " Total heap allocated: %s", - mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.arena)); - vty_outln (vty, " Holding block headers: %s", - mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.hblkhd)); - vty_outln (vty, " Used small blocks: %s", - mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.usmblks)); - vty_outln (vty, " Used ordinary blocks: %s", - mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.uordblks)); - vty_outln (vty, " Free small blocks: %s", - mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.fsmblks)); - vty_outln (vty, " Free ordinary blocks: %s", - mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.fordblks)); - vty_outln (vty, " Ordinary blocks: %ld", - (unsigned long)minfo.ordblks); - vty_outln (vty, " Small blocks: %ld", - (unsigned long)minfo.smblks); - vty_outln (vty, " Holding blocks: %ld", - (unsigned long)minfo.hblks); - vty_outln (vty,"(see system documentation for 'mallinfo' for meaning)"); - return 1; + struct mallinfo minfo = mallinfo(); + char buf[MTYPE_MEMSTR_LEN]; + + vty_out(vty, "System allocator statistics:\n"); + vty_out(vty, " Total heap allocated: %s\n", + mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.arena)); + vty_out(vty, " Holding block headers: %s\n", + mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.hblkhd)); + vty_out(vty, " Used small blocks: %s\n", + mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.usmblks)); + vty_out(vty, " Used ordinary blocks: %s\n", + mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.uordblks)); + vty_out(vty, " Free small blocks: %s\n", + mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.fsmblks)); + vty_out(vty, " Free ordinary blocks: %s\n", + mtype_memstr(buf, MTYPE_MEMSTR_LEN, minfo.fordblks)); + vty_out(vty, " Ordinary blocks: %ld\n", + (unsigned long)minfo.ordblks); + vty_out(vty, " Small blocks: %ld\n", + (unsigned long)minfo.smblks); + vty_out(vty, " Holding blocks: %ld\n", + (unsigned long)minfo.hblks); + vty_out(vty, "(see system documentation for 'mallinfo' for meaning)\n"); + return 1; } #endif /* HAVE_MALLINFO */ static int qmem_walker(void *arg, struct memgroup *mg, struct memtype *mt) { struct vty *vty = arg; - if (!mt) - vty_outln (vty, "--- qmem %s ---", mg->name); - else { + if (!mt) { + vty_out(vty, "--- qmem %s ---\n", mg->name); + vty_out(vty, "%-30s: %8s %-8s%s %8s %9s\n", + "Type", "Current#", " Size", +#ifdef HAVE_MALLOC_USABLE_SIZE + " Total", +#else + "", +#endif + "Max#", +#ifdef HAVE_MALLOC_USABLE_SIZE + "MaxBytes" +#else + "" +#endif + ); + } else { if (mt->n_alloc != 0) { char size[32]; snprintf(size, sizeof(size), "%6zu", mt->size); - vty_outln (vty, "%-30s: %10zu %s", - mt->name, mt->n_alloc, - mt->size == 0 ? "" : mt->size == SIZE_VAR ? "(variably sized)" : size); +#ifdef HAVE_MALLOC_USABLE_SIZE +#define TSTR " %9zu" +#define TARG , mt->total +#define TARG2 , mt->max_size +#else +#define TSTR "" +#define TARG +#define TARG2 +#endif + vty_out(vty, "%-30s: %8zu %-8s"TSTR" %8zu"TSTR"\n", + mt->name, + mt->n_alloc, + mt->size == 0 ? "" + : mt->size == SIZE_VAR + ? "variable" + : size + TARG, + mt->n_max + TARG2); } } return 0; @@ -93,11 +127,11 @@ DEFUN (show_memory, "Memory statistics\n") { #ifdef HAVE_MALLINFO - show_memory_mallinfo (vty); + show_memory_mallinfo(vty); #endif /* HAVE_MALLINFO */ - qmem_walk(qmem_walker, vty); - return CMD_SUCCESS; + qmem_walk(qmem_walker, vty); + return CMD_SUCCESS; } DEFUN (show_modules, @@ -106,48 +140,44 @@ DEFUN (show_modules, "Show running system information\n" "Loaded modules\n") { - struct frrmod_runtime *plug = frrmod_list; - - vty_outln (vty, "%-12s %-25s %s%s", - "Module Name", "Version", "Description", - VTYNL); - while (plug) - { - const struct frrmod_info *i = plug->info; - - vty_outln (vty, "%-12s %-25s %s", i->name, i->version,i->description); - if (plug->dl_handle) - { + struct frrmod_runtime *plug = frrmod_list; + + vty_out(vty, "%-12s %-25s %s\n\n", "Module Name", "Version", + "Description"); + while (plug) { + const struct frrmod_info *i = plug->info; + + vty_out(vty, "%-12s %-25s %s\n", i->name, i->version, + i->description); + if (plug->dl_handle) { #ifdef HAVE_DLINFO_ORIGIN - char origin[MAXPATHLEN] = ""; - dlinfo (plug->dl_handle, RTLD_DI_ORIGIN, &origin); -# ifdef HAVE_DLINFO_LINKMAP - const char *name; - struct link_map *lm = NULL; - dlinfo (plug->dl_handle, RTLD_DI_LINKMAP, &lm); - if (lm) - { - name = strrchr(lm->l_name, '/'); - name = name ? name + 1 : lm->l_name; - vty_outln (vty, "\tfrom: %s/%s", origin, name); - } -# else - vty_outln (vty, "\tfrom: %s ", origin, plug->load_name); -# endif + char origin[MAXPATHLEN] = ""; + dlinfo(plug->dl_handle, RTLD_DI_ORIGIN, &origin); +#ifdef HAVE_DLINFO_LINKMAP + const char *name; + struct link_map *lm = NULL; + dlinfo(plug->dl_handle, RTLD_DI_LINKMAP, &lm); + if (lm) { + name = strrchr(lm->l_name, '/'); + name = name ? name + 1 : lm->l_name; + vty_out(vty, "\tfrom: %s/%s\n", origin, name); + } #else - vty_outln (vty, "\tfrom: %s", plug->load_name); + vty_out(vty, "\tfrom: %s \n", origin, plug->load_name); #endif - } - plug = plug->next; - } - return CMD_SUCCESS; +#else + vty_out(vty, "\tfrom: %s\n", plug->load_name); +#endif + } + plug = plug->next; + } + return CMD_SUCCESS; } -void -memory_init (void) +void memory_init(void) { - install_element (VIEW_NODE, &show_memory_cmd); - install_element (VIEW_NODE, &show_modules_cmd); + install_element(VIEW_NODE, &show_memory_cmd); + install_element(VIEW_NODE, &show_modules_cmd); } /* Stats querying from users */ @@ -158,44 +188,39 @@ memory_init (void) * The pointer returned may be NULL (indicating an error) * or point to the given buffer, or point to static storage. */ -const char * -mtype_memstr (char *buf, size_t len, unsigned long bytes) +const char *mtype_memstr(char *buf, size_t len, unsigned long bytes) { - unsigned int m, k; - - /* easy cases */ - if (!bytes) - return "0 bytes"; - if (bytes == 1) - return "1 byte"; - - /* - * When we pass the 2gb barrier mallinfo() can no longer report - * correct data so it just does something odd... - * Reporting like Terrabytes of data. Which makes users... - * edgy.. yes edgy that's the term for it. - * So let's just give up gracefully - */ - if (bytes > 0x7fffffff) - return "> 2GB"; - - m = bytes >> 20; - k = bytes >> 10; - - if (m > 10) - { - if (bytes & (1 << 19)) - m++; - snprintf (buf, len, "%d MiB", m); - } - else if (k > 10) - { - if (bytes & (1 << 9)) - k++; - snprintf (buf, len, "%d KiB", k); - } - else - snprintf (buf, len, "%ld bytes", bytes); - - return buf; + unsigned int m, k; + + /* easy cases */ + if (!bytes) + return "0 bytes"; + if (bytes == 1) + return "1 byte"; + + /* + * When we pass the 2gb barrier mallinfo() can no longer report + * correct data so it just does something odd... + * Reporting like Terrabytes of data. Which makes users... + * edgy.. yes edgy that's the term for it. + * So let's just give up gracefully + */ + if (bytes > 0x7fffffff) + return "> 2GB"; + + m = bytes >> 20; + k = bytes >> 10; + + if (m > 10) { + if (bytes & (1 << 19)) + m++; + snprintf(buf, len, "%d MiB", m); + } else if (k > 10) { + if (bytes & (1 << 9)) + k++; + snprintf(buf, len, "%d KiB", k); + } else + snprintf(buf, len, "%ld bytes", bytes); + + return buf; }