]>
git.proxmox.com Git - mirror_frr.git/blob - lib/memory_vty.c
2 * Memory and dynamic module VTY routine
4 * Copyright (C) 1998 Kunihiro Ishiguro
5 * Copyright (C) 2016-2017 David Lamparter for NetDEF, Inc.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
19 * Place, Suite 330, Boston, MA 02111-1307 USA
23 /* malloc.h is generally obsolete, however GNU Libc mallinfo wants it. */
24 #if (defined(GNU_LINUX) && defined(HAVE_MALLINFO))
26 #endif /* HAVE_MALLINFO */
33 #include "memory_vty.h"
35 /* Looking up memory status from vty interface. */
42 show_memory_mallinfo (struct vty
*vty
)
44 struct mallinfo minfo
= mallinfo();
45 char buf
[MTYPE_MEMSTR_LEN
];
47 vty_out (vty
, "System allocator statistics:%s", VTY_NEWLINE
);
48 vty_out (vty
, " Total heap allocated: %s%s",
49 mtype_memstr (buf
, MTYPE_MEMSTR_LEN
, minfo
.arena
),
51 vty_out (vty
, " Holding block headers: %s%s",
52 mtype_memstr (buf
, MTYPE_MEMSTR_LEN
, minfo
.hblkhd
),
54 vty_out (vty
, " Used small blocks: %s%s",
55 mtype_memstr (buf
, MTYPE_MEMSTR_LEN
, minfo
.usmblks
),
57 vty_out (vty
, " Used ordinary blocks: %s%s",
58 mtype_memstr (buf
, MTYPE_MEMSTR_LEN
, minfo
.uordblks
),
60 vty_out (vty
, " Free small blocks: %s%s",
61 mtype_memstr (buf
, MTYPE_MEMSTR_LEN
, minfo
.fsmblks
),
63 vty_out (vty
, " Free ordinary blocks: %s%s",
64 mtype_memstr (buf
, MTYPE_MEMSTR_LEN
, minfo
.fordblks
),
66 vty_out (vty
, " Ordinary blocks: %ld%s",
67 (unsigned long)minfo
.ordblks
,
69 vty_out (vty
, " Small blocks: %ld%s",
70 (unsigned long)minfo
.smblks
,
72 vty_out (vty
, " Holding blocks: %ld%s",
73 (unsigned long)minfo
.hblks
,
75 vty_out (vty
, "(see system documentation for 'mallinfo' for meaning)%s",
79 #endif /* HAVE_MALLINFO */
81 static int qmem_walker(void *arg
, struct memgroup
*mg
, struct memtype
*mt
)
83 struct vty
*vty
= arg
;
85 vty_out (vty
, "--- qmem %s ---%s", mg
->name
, VTY_NEWLINE
);
87 if (mt
->n_alloc
!= 0) {
89 snprintf(size
, sizeof(size
), "%6zu", mt
->size
);
90 vty_out (vty
, "%-30s: %10zu %s%s",
91 mt
->name
, mt
->n_alloc
,
93 mt
->size
== SIZE_VAR
? "(variably sized)" :
104 "Show running system information\n"
105 "Memory statistics\n")
108 show_memory_mallinfo (vty
);
109 #endif /* HAVE_MALLINFO */
111 qmem_walk(qmem_walker
, vty
);
118 "Show running system information\n"
121 struct frrmod_runtime
*plug
= frrmod_list
;
123 vty_out (vty
, "%-12s %-25s %s%s%s",
124 "Module Name", "Version", "Description",
125 VTY_NEWLINE
, VTY_NEWLINE
);
128 const struct frrmod_info
*i
= plug
->info
;
130 vty_out (vty
, "%-12s %-25s %s%s", i
->name
, i
->version
, i
->description
,
134 #ifdef HAVE_DLINFO_ORIGIN
135 char origin
[MAXPATHLEN
] = "";
136 dlinfo (plug
->dl_handle
, RTLD_DI_ORIGIN
, &origin
);
137 # ifdef HAVE_DLINFO_LINKMAP
139 struct link_map
*lm
= NULL
;
140 dlinfo (plug
->dl_handle
, RTLD_DI_LINKMAP
, &lm
);
143 name
= strrchr(lm
->l_name
, '/');
144 name
= name
? name
+ 1 : lm
->l_name
;
145 vty_out (vty
, "\tfrom: %s/%s%s", origin
, name
, VTY_NEWLINE
);
148 vty_out (vty
, "\tfrom: %s %s", origin
, plug
->load_name
, VTY_NEWLINE
);
151 vty_out (vty
, "\tfrom: %s%s", plug
->load_name
, VTY_NEWLINE
);
162 install_element (VIEW_NODE
, &show_memory_cmd
);
163 install_element (VIEW_NODE
, &show_modules_cmd
);
166 /* Stats querying from users */
167 /* Return a pointer to a human friendly string describing
168 * the byte count passed in. E.g:
169 * "0 bytes", "2048 bytes", "110kB", "500MiB", "11GiB", etc.
170 * Up to 4 significant figures will be given.
171 * The pointer returned may be NULL (indicating an error)
172 * or point to the given buffer, or point to static storage.
175 mtype_memstr (char *buf
, size_t len
, unsigned long bytes
)
186 * When we pass the 2gb barrier mallinfo() can no longer report
187 * correct data so it just does something odd...
188 * Reporting like Terrabytes of data. Which makes users...
189 * edgy.. yes edgy that's the term for it.
190 * So let's just give up gracefully
192 if (bytes
> 0x7fffffff)
200 if (bytes
& (1 << 19))
202 snprintf (buf
, len
, "%d MiB", m
);
206 if (bytes
& (1 << 9))
208 snprintf (buf
, len
, "%d KiB", k
);
211 snprintf (buf
, len
, "%ld bytes", bytes
);