mirror of
https://github.com/apache/nuttx.git
synced 2026-05-30 21:36:28 +08:00
fs/procfs: Add logic to show the state of the page allocator in /proc/meminfo.
This commit is contained in:
@@ -53,6 +53,7 @@
|
|||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
|
#include <nuttx/pgalloc.h>
|
||||||
#include <nuttx/mm/mm.h>
|
#include <nuttx/mm/mm.h>
|
||||||
#include <nuttx/fs/fs.h>
|
#include <nuttx/fs/fs.h>
|
||||||
#include <nuttx/fs/procfs.h>
|
#include <nuttx/fs/procfs.h>
|
||||||
@@ -304,21 +305,23 @@ static ssize_t meminfo_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
#ifdef CONFIG_MM_KERNEL_HEAP
|
#ifdef CONFIG_MM_KERNEL_HEAP
|
||||||
if (totalsize < buflen)
|
if (totalsize < buflen)
|
||||||
{
|
{
|
||||||
buffer += copysize;
|
buffer += copysize;
|
||||||
buflen -= copysize;
|
buflen -= copysize;
|
||||||
|
|
||||||
/* The second line is the memory data */
|
/* Show kernel heap information */
|
||||||
|
|
||||||
#ifdef CONFIG_CAN_PASS_STRUCTS
|
#ifdef CONFIG_CAN_PASS_STRUCTS
|
||||||
mem = kmm_mallinfo();
|
mem = kmm_mallinfo();
|
||||||
#else
|
#else
|
||||||
(void)kmm_mallinfo(&mem);
|
(void)kmm_mallinfo(&mem);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
linesize = snprintf(procfile->line, MEMINFO_LINELEN,
|
linesize = snprintf(procfile->line, MEMINFO_LINELEN,
|
||||||
"Kmem: %11d%11d%11d%11d\n",
|
"Kmem: %11ul%11ul%11ul%11ul\n",
|
||||||
mem.arena, mem.uordblks, mem.fordblks,
|
(unsigned long)mem.arena,
|
||||||
mem.mxordblk);
|
(unsigned long)mem.uordblks,
|
||||||
|
(unsigned long)mem.fordblks,
|
||||||
|
(unsigned long)mem.mxordblk);
|
||||||
copysize = procfs_memcpy(procfile->line, linesize, buffer, buflen,
|
copysize = procfs_memcpy(procfile->line, linesize, buffer, buflen,
|
||||||
&offset);
|
&offset);
|
||||||
totalsize += copysize;
|
totalsize += copysize;
|
||||||
@@ -328,21 +331,54 @@ static ssize_t meminfo_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
#if !defined(CONFIG_BUILD_KERNEL)
|
#if !defined(CONFIG_BUILD_KERNEL)
|
||||||
if (totalsize < buflen)
|
if (totalsize < buflen)
|
||||||
{
|
{
|
||||||
buffer += copysize;
|
buffer += copysize;
|
||||||
buflen -= copysize;
|
buflen -= copysize;
|
||||||
|
|
||||||
/* The second line is the memory data */
|
/* Show user heap information */
|
||||||
|
|
||||||
#ifdef CONFIG_CAN_PASS_STRUCTS
|
#ifdef CONFIG_CAN_PASS_STRUCTS
|
||||||
mem = kumm_mallinfo();
|
mem = kumm_mallinfo();
|
||||||
#else
|
#else
|
||||||
(void)kumm_mallinfo(&mem);
|
(void)kumm_mallinfo(&mem);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
linesize = snprintf(procfile->line, MEMINFO_LINELEN,
|
linesize = snprintf(procfile->line, MEMINFO_LINELEN,
|
||||||
"Umem: %11d%11d%11d%11d\n",
|
"Umem: %11ul%11ul%11ul%11ul\n",
|
||||||
mem.arena, mem.uordblks, mem.fordblks,
|
(unsigned long)mem.arena,
|
||||||
mem.mxordblk);
|
(unsigned long)mem.uordblks,
|
||||||
|
(unsigned long)mem.fordblks,
|
||||||
|
(unsigned long)mem.mxordblk);
|
||||||
|
copysize = procfs_memcpy(procfile->line, linesize, buffer, buflen,
|
||||||
|
&offset);
|
||||||
|
totalsize += copysize;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_MM_PGALLOC
|
||||||
|
if (totalsize < buflen)
|
||||||
|
{
|
||||||
|
struct pginfo_s pginfo;
|
||||||
|
unsigned long total;
|
||||||
|
unsigned long available;
|
||||||
|
unsigned long allocated;
|
||||||
|
unsigned long max;
|
||||||
|
|
||||||
|
buffer += copysize;
|
||||||
|
buflen -= copysize;
|
||||||
|
|
||||||
|
/* Show page allocator information */
|
||||||
|
|
||||||
|
mm_pginfo(&pginfo);
|
||||||
|
|
||||||
|
total = (unsigned long)pginfo.ntotal << MM_PGSHIFT;
|
||||||
|
available = (unsigned long)pginfo.nfree << MM_PGSHIFT;
|
||||||
|
allocated = total - available;
|
||||||
|
max = (unsigned long)pginfo.mxfree << MM_PGSHIFT;
|
||||||
|
|
||||||
|
linesize = snprintf(procfile->line, MEMINFO_LINELEN,
|
||||||
|
"Page: %11ul%11ul%11ul%11ul\n",
|
||||||
|
total, allocated, available, max);
|
||||||
|
|
||||||
copysize = procfs_memcpy(procfile->line, linesize, buffer, buflen,
|
copysize = procfs_memcpy(procfile->line, linesize, buffer, buflen,
|
||||||
&offset);
|
&offset);
|
||||||
totalsize += copysize;
|
totalsize += copysize;
|
||||||
@@ -352,17 +388,21 @@ static ssize_t meminfo_read(FAR struct file *filep, FAR char *buffer,
|
|||||||
#if defined(CONFIG_ARCH_HAVE_PROGMEM) && defined(CONFIG_FS_PROCFS_INCLUDE_PROGMEM)
|
#if defined(CONFIG_ARCH_HAVE_PROGMEM) && defined(CONFIG_FS_PROCFS_INCLUDE_PROGMEM)
|
||||||
if (totalsize < buflen)
|
if (totalsize < buflen)
|
||||||
{
|
{
|
||||||
buffer += copysize;
|
struct progmem_info_s progmem;
|
||||||
buflen -= copysize;
|
|
||||||
|
buffer += copysize;
|
||||||
|
buflen -= copysize;
|
||||||
|
|
||||||
/* The second line is the memory data */
|
/* The second line is the memory data */
|
||||||
|
|
||||||
meminfo_progmem(&progmem);
|
meminfo_progmem(&progmem);
|
||||||
|
|
||||||
linesize = snprintf(procfile->line, PROGMEM_LINELEN,
|
linesize = snprintf(procfile->line, MEMINFO_LINELEN,
|
||||||
"Prog: %11d%11d%11d%11d\n",
|
"Prog: %11ul%11ul%11ul%11ul\n",
|
||||||
progmem.arena, progmem.uordblks, progmem.fordblks,
|
(unsigned long)progmem.arena,
|
||||||
progmem.mxordblk);
|
(unsigned long)progmem.uordblks,
|
||||||
|
(unsigned long)progmem.fordblks,
|
||||||
|
(unsigned long)progmem.mxordblk);
|
||||||
copysize = procfs_memcpy(procfile->line, linesize, buffer, buflen,
|
copysize = procfs_memcpy(procfile->line, linesize, buffer, buflen,
|
||||||
&offset);
|
&offset);
|
||||||
totalsize += copysize;
|
totalsize += copysize;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user