[PATCH] free: add page cache information in free command

Barry Song Barry.Song at csr.com
Mon Mar 26 05:51:03 UTC 2012


From: Barry Song <Baohua.Song at 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 at 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


More information about the busybox mailing list