[PATCH 8/11] [DEBUG] Add statistics

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch is strictly debug only.  It outputs some information to
/proc/buddyinfo that may help explain what went wrong if page clustering
totally breaks down and prints out a trace when fallbacks occur to help
determine if allocation flagging is incomplete.


Signed-off-by: Mel Gorman <[email protected]>
---

 page_alloc.c |   32 ++++++++++++++++++++++++++++++++
 vmstat.c     |   16 ++++++++++++++++
 2 files changed, 48 insertions(+)

diff -rup -X /usr/src/patchset-0.6/bin//dontdiff linux-2.6.19-rc5-mm2-008_reclaimable/mm/page_alloc.c linux-2.6.19-rc5-mm2-009_stats/mm/page_alloc.c
--- linux-2.6.19-rc5-mm2-008_reclaimable/mm/page_alloc.c	2006-11-21 10:57:46.000000000 +0000
+++ linux-2.6.19-rc5-mm2-009_stats/mm/page_alloc.c	2006-11-21 11:52:40.000000000 +0000
@@ -58,6 +58,10 @@ unsigned long totalram_pages __read_most
 unsigned long totalreserve_pages __read_mostly;
 long nr_swap_pages;
 int percpu_pagelist_fraction;
+#ifdef CONFIG_PAGE_CLUSTERING
+int split_count[MIGRATE_TYPES];
+int fallback_counts[MIGRATE_TYPES];
+#endif /* CONFIG_PAGE_CLUSTERING */
 
 static void __free_pages_ok(struct page *page, unsigned int order);
 
@@ -84,6 +88,8 @@ int sysctl_lowmem_reserve_ratio[MAX_NR_Z
 #endif
 };
 
+static int printfallback_count;
+
 EXPORT_SYMBOL(totalram_pages);
 
 static char *zone_names[MAX_NR_ZONES] = {
@@ -750,6 +756,27 @@ static struct page *__rmqueue_fallback(s
 					struct page, lru);
 			area->nr_free--;
 
+			/* Account for a MAX_ORDER block being split */
+			if (current_order == MAX_ORDER - 1 &&
+					order < MAX_ORDER - 1) {
+				split_count[start_migratetype]++;
+			}
+
+			/* Account for fallbacks of interest */
+			if (order < HUGETLB_PAGE_ORDER &&
+					current_order != MAX_ORDER - 1) {
+				fallback_counts[start_migratetype]++;
+				if (printfallback_count < 500 && start_migratetype != MIGRATE_MOVABLE) {
+					printfallback_count++;
+					printk("ALLOC FALLBACK %d TYPE %d TO %d ZONE %s\n", printfallback_count, start_migratetype, migratetype, zone->name);
+					printk("===========================\n");
+					dump_stack();
+					printk("===========================\n");
+			}
+
+
+			}
+
 			/* Remove the page from the freelists */
 			list_del(&page->lru);
 			rmv_page_order(page);
@@ -805,6 +832,11 @@ static struct page *__rmqueue(struct zon
 		if (list_empty(&area->free_list[migratetype]))
 			continue;
 
+#ifdef CONFIG_PAGE_CLUSTERING
+		if (current_order == MAX_ORDER - 1 && order < MAX_ORDER - 1)
+			split_count[migratetype]++;
+#endif /* CONFIG_PAGE_CLUSTERING */
+
 		page = list_entry(area->free_list[migratetype].next,
 					struct page, lru);
 		list_del(&page->lru);
diff -rup -X /usr/src/patchset-0.6/bin//dontdiff linux-2.6.19-rc5-mm2-008_reclaimable/mm/vmstat.c linux-2.6.19-rc5-mm2-009_stats/mm/vmstat.c
--- linux-2.6.19-rc5-mm2-008_reclaimable/mm/vmstat.c	2006-11-14 14:01:37.000000000 +0000
+++ linux-2.6.19-rc5-mm2-009_stats/mm/vmstat.c	2006-11-21 10:59:36.000000000 +0000
@@ -13,6 +13,11 @@
 #include <linux/module.h>
 #include <linux/cpu.h>
 
+#ifdef CONFIG_PAGE_CLUSTERING
+extern int split_count[MIGRATE_TYPES];
+extern int fallback_counts[MIGRATE_TYPES];
+#endif /* CONFIG_PAGE_CLUSTERING */
+
 void __get_zone_counts(unsigned long *active, unsigned long *inactive,
 			unsigned long *free, struct pglist_data *pgdat)
 {
@@ -403,6 +408,17 @@ static void *frag_next(struct seq_file *
 
 static void frag_stop(struct seq_file *m, void *arg)
 {
+#ifdef CONFIG_PAGE_CLUSTERING
+	seq_printf(m, "Fallback counts\n");
+	seq_printf(m, "Unmovable: %8d\n", fallback_counts[MIGRATE_UNMOVABLE]);
+	seq_printf(m, "Reclaim:   %8d\n", fallback_counts[MIGRATE_RECLAIMABLE]);
+	seq_printf(m, "Movable:   %8d\n", fallback_counts[MIGRATE_MOVABLE]);
+
+	seq_printf(m, "\nSplit counts\n");
+	seq_printf(m, "Unmovable: %8d\n", split_count[MIGRATE_UNMOVABLE]);
+	seq_printf(m, "Reclaim:   %8d\n", split_count[MIGRATE_RECLAIMABLE]);
+	seq_printf(m, "Movable:   %8d\n", split_count[MIGRATE_MOVABLE]);
+#endif /* CONFIG_PAGE_CLUSTERING */
 }
 
 /*
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux