[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH] free: add page cache information in free command
From:       Barry Song <Barry.Song () csr ! com>
Date:       2012-03-26 5:51:03
Message-ID: 1332741063-16917-1-git-send-email-Barry.Song () csr ! com
[Download RAW message or body]

From: Barry Song <Baohua.Song@csr.com>

"-/+ buffers/cache" is much more useful than "-/+ buffers". page cache is
the main source reclaimed for new allocation. so showing the cache is more
important to users than only showing buffers.

this patch reads cache information from /proc/meminfo and make free command
full.

Signed-off-by: Barry Song <Baohua.Song@csr.com>
---
 procps/free.c |   54 ++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/procps/free.c b/procps/free.c
index 47f2fc3..0b6a518 100644
--- a/procps/free.c
+++ b/procps/free.c
@@ -16,8 +16,8 @@
 //usage:
 //usage:#define free_example_usage
 //usage:       "$ free\n"
-//usage:       "              total         used         free       shared      \
                buffers\n"
-//usage:       "  Mem:       257628       248724         8904        59644        \
93124\n" +//usage:       "              total         used         free       shared  \
buffers    cached\n" +//usage:       "  Mem:       257628       248724         8904   \
59644        93124    102400\n"  //usage:       " Swap:       128516         8404     \
120112\n"  //usage:       "Total:       386144       257128       129016\n"
 
@@ -44,11 +44,35 @@ static unsigned long long scale(unsigned long d)
 	return ((unsigned long long)d * G.mem_unit) >> G_unit_steps;
 }
 
+static unsigned long get_cache_from_meminfo(void)
+{
+#define LINE_LEN 256
+	FILE *fp;
+	char str[LINE_LEN];
+	unsigned long long cached;
+	if((fp = fopen("/proc/meminfo","rt")) == NULL) {
+		printf("Cantnot open /proc/meminfo");
+		exit(1);
+	}
+
+	while(1) {
+		fgets(str, LINE_LEN, fp);
+		if (!strncmp(str, "Cached:", strlen("Cached:")))
+			break;
+	}
+
+	cached = atoi(str + strlen("Cached:"));
+
+	fclose(fp);
+
+	return cached;
+}
 
 int free_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int free_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
 {
 	struct sysinfo info;
+	unsigned long long cached;
 
 	INIT_G();
 
@@ -75,43 +99,45 @@ int free_main(int argc UNUSED_PARAM, char **argv \
IF_NOT_DESKTOP(UNUSED_PARAM))  #endif
 
 	sysinfo(&info);
+	cached = get_cache_from_meminfo();
 
 	/* Kernels prior to 2.4.x will return info.mem_unit==0, so cope... */
 	G.mem_unit = (info.mem_unit ? info.mem_unit : 1);
 
-	printf("     %13s%13s%13s%13s%13s\n",
+	printf("            %13s%13s%13s%13s%13s%13s\n",
 		"total",
 		"used",
 		"free",
-		"shared", "buffers" /* swap and total don't have these columns */
+		"shared", "buffers", "cached" /* swap and total don't have these columns */
 		/* procps version 3.2.8 also shows "cached" column, but
 		 * sysinfo() does not provide this value, need to parse
 		 * /proc/meminfo instead and get "Cached: NNN kB" from there.
 		 */
 	);
 
-#define FIELDS_5 "%13llu%13llu%13llu%13llu%13llu\n"
-#define FIELDS_3 (FIELDS_5 + 2*6)
-#define FIELDS_2 (FIELDS_5 + 3*6)
+#define FIELDS_6 "%13llu%13llu%13llu%13llu%13llu%13llu\n"
+#define FIELDS_3 (FIELDS_6 + 3*6)
+#define FIELDS_2 (FIELDS_6 + 4*6)
 
-	printf("Mem: ");
-	printf(FIELDS_5,
+	printf("Mem:        ");
+	printf(FIELDS_6,
 		scale(info.totalram),
 		scale(info.totalram - info.freeram),
 		scale(info.freeram),
 		scale(info.sharedram),
-		scale(info.bufferram)
+		scale(info.bufferram),
+		scale(cached)
 	);
 	/* Show alternate, more meaningful busy/free numbers by counting
 	 * buffer cache as free memory (make it "-/+ buffers/cache"
 	 * if/when we add support for "cached" column): */
-	printf("-/+ buffers:      ");
+	printf("-/+ buffers/cached:      ");
 	printf(FIELDS_2,
-		scale(info.totalram - info.freeram - info.bufferram),
-		scale(info.freeram + info.bufferram)
+		scale(info.totalram - info.freeram - info.bufferram - cached),
+		scale(info.freeram + info.bufferram + cached)
 	);
 #if BB_MMU
-	printf("Swap:");
+	printf("Swap:      ");
 	printf(FIELDS_3,
 		scale(info.totalswap),
 		scale(info.totalswap - info.freeswap),
-- 
1.7.0.4



Member of the CSR plc group of companies. CSR plc registered in England and Wales, \
registered number 4187346, registered office Churchill House, Cambridge Business \
Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom More information can be found \
at www.csr.com. Follow CSR on Twitter at http://twitter.com/CSR_PLC and read our blog \
at www.csr.com/blog _______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic