[RFC PATCH] makedumpfile: exclude ZFS file cache pages

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

 



From: Don Brady <don.brady@xxxxxxxxxxx>

ZFS caches pages for file data in its Adaptive Replacement Cache (ARC).
This cache is separate from the VFS page cache.  The amount of data
cached can be significant and it would be ideal to exclude it from the
crashdump file.  ZFS can tag these pages so they are easily identifiable
from within makedumpfile.

ref https://github.com/zfsonlinux/zfs/pull/8899/files

Below is a suggested patch that can work in tandem with the above ZFS
changes to exclude the ZFS ARC file data pages from a dump file.

Signed-off-by: Don Brady <don.brady@xxxxxxxxxxx>
---
 makedumpfile.c | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index d76a435..b760934 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -85,6 +85,7 @@ mdf_pfn_t pfn_zero;
 mdf_pfn_t pfn_memhole;
 mdf_pfn_t pfn_cache;
 mdf_pfn_t pfn_cache_private;
+mdf_pfn_t pfn_zfs_arc_pages;
 mdf_pfn_t pfn_user;
 mdf_pfn_t pfn_free;
 mdf_pfn_t pfn_hwpoison;
@@ -282,6 +283,20 @@ is_cache_page(unsigned long flags)
 	return FALSE;
 }
 
+#define	ZFS_ABD_FILE_CACHE	0x2F5ABDF11ECAC4E
+
+static int
+is_zfs_cache_page(unsigned long flags, unsigned long private)
+{
+	/*
+	 * ZFS cached file data resides in pages with a private tag
+	 */
+	if (isPrivate(flags) && private == ZFS_ABD_FILE_CACHE)
+		return TRUE;
+
+	return FALSE;
+}
+
 static inline unsigned long
 calculate_len_buf_out(long page_size)
 {
@@ -6048,6 +6063,13 @@ __exclude_unnecessary_pages(unsigned long mem_map,
 			else
 				pfn_counter = &pfn_cache;
 		}
+		/*
+		 * Exclude ZFS ARC pages
+		 */
+		else if ((info->dump_level & DL_EXCLUDE_CACHE_PRI)
+		    && is_zfs_cache_page(flags, private)) {
+			pfn_counter = &pfn_zfs_arc_pages;
+		}
 		/*
 		 * Exclude the data page of the user process.
 		 *  - anonymous pages
@@ -7551,6 +7573,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
 	if (info->flag_cyclic) {
 		pfn_zero = pfn_cache = pfn_cache_private = 0;
 		pfn_user = pfn_free = pfn_hwpoison = pfn_offline = 0;
+		pfn_zfs_arc_pages = 0;
 		pfn_memhole = info->max_mapnr;
 	}
 
@@ -8833,6 +8856,7 @@ write_kdump_pages_and_bitmap_cyclic(struct cache_data *cd_header, struct cache_d
 		 */
 		pfn_zero = pfn_cache = pfn_cache_private = 0;
 		pfn_user = pfn_free = pfn_hwpoison = pfn_offline = 0;
+		pfn_zfs_arc_pages = 0;
 		pfn_memhole = info->max_mapnr;
 
 		/*
@@ -9777,7 +9801,8 @@ print_report(void)
 	pfn_original = info->max_mapnr - pfn_memhole;
 
 	pfn_excluded = pfn_zero + pfn_cache + pfn_cache_private
-	    + pfn_user + pfn_free + pfn_hwpoison + pfn_offline;
+	    + pfn_user + pfn_free + pfn_hwpoison + pfn_offline
+	    + pfn_zfs_arc_pages;
 	shrinking = (pfn_original - pfn_excluded) * 100;
 	shrinking = shrinking / pfn_original;
 
@@ -9788,6 +9813,9 @@ print_report(void)
 	REPORT_MSG("    Non-private cache pages : 0x%016llx\n", pfn_cache);
 	REPORT_MSG("    Private cache pages     : 0x%016llx\n",
 	    pfn_cache_private);
+	if (pfn_zfs_arc_pages != 0)
+		REPORT_MSG("    ZFS ARC file data pages : 0x%016llx\n",
+		    pfn_zfs_arc_pages);
 	REPORT_MSG("    User process data pages : 0x%016llx\n", pfn_user);
 	REPORT_MSG("    Free pages              : 0x%016llx\n", pfn_free);
 	REPORT_MSG("    Hwpoison pages          : 0x%016llx\n", pfn_hwpoison);
@@ -9819,7 +9847,8 @@ print_mem_usage(void)
 	pfn_original = info->max_mapnr - pfn_memhole;
 
 	pfn_excluded = pfn_zero + pfn_cache + pfn_cache_private
-	    + pfn_user + pfn_free + pfn_hwpoison + pfn_offline;
+	    + pfn_user + pfn_free + pfn_hwpoison + pfn_offline
+	    + pfn_zfs_arc_pages;
 	shrinking = (pfn_original - pfn_excluded) * 100;
 	shrinking = shrinking / pfn_original;
 	total_size = info->page_size * pfn_original;
@@ -9833,6 +9862,9 @@ print_mem_usage(void)
 	    pfn_cache);
 	MSG("PRI_CACHE	%-16llu	yes		Cache pages with private flag\n",
 	    pfn_cache_private);
+	if (pfn_zfs_arc_pages != 0)
+		MSG("ZFS_CACHE	%-16llu	yes		ZFS ARC data pages\n",
+		    pfn_zfs_arc_pages);
 	MSG("USER		%-16llu	yes		User process pages\n", pfn_user);
 	MSG("FREE		%-16llu	yes		Free pages\n", pfn_free);
 	MSG("KERN_DATA	%-16llu	no		Dumpable kernel data \n",
-- 
2.17.1


_______________________________________________
kexec mailing list
kexec@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/kexec



[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux