Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Apr 2018 17:06:22 +0000 (UTC)
From:      "Jonathan T. Looney" <jtl@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r332117 - head/sys/amd64/amd64
Message-ID:  <201804061706.w36H6MEg056595@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jtl
Date: Fri Apr  6 17:06:22 2018
New Revision: 332117
URL: https://svnweb.freebsd.org/changeset/base/332117

Log:
  Pat the watchdog less while producing a coredump.  Prior to this change,
  we patted the watchdog approximately once per 4KB page of memory.  After
  this change, we pat the watchdog approximately once per 128MB of memory.
  On a sample machine, this translated to patting the watchdog approximately
  every 5.4 seconds, which "seems reasonable". We can choose a different
  value in the future, if warranted.
  
  This has extensive field experience. It is a performance improvement, and
  has not caused any known problems.
  
  Reviewed by:	imp, kib
  Sponsored by:	Netflix, Inc.
  Differential Revision:	https://reviews.freebsd.org/D14988

Modified:
  head/sys/amd64/amd64/minidump_machdep.c

Modified: head/sys/amd64/amd64/minidump_machdep.c
==============================================================================
--- head/sys/amd64/amd64/minidump_machdep.c	Fri Apr  6 17:04:21 2018	(r332116)
+++ head/sys/amd64/amd64/minidump_machdep.c	Fri Apr  6 17:06:22 2018	(r332117)
@@ -62,7 +62,7 @@ static struct kerneldumpheader kdh;
 /* Handle chunked writes. */
 static size_t fragsz;
 static void *dump_va;
-static size_t counter, progress, dumpsize;
+static size_t counter, progress, dumpsize, wdog_next;
 
 CTASSERT(sizeof(*vm_page_dump) == 8);
 static int dump_retry_count = 5;
@@ -134,6 +134,9 @@ report_progress(size_t progress, size_t dumpsize)
 	}
 }
 
+/* Pat the watchdog approximately every 128MB of the dump. */
+#define	WDOG_DUMP_INTERVAL	(128 * 1024 * 1024)
+
 static int
 blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t pa, size_t sz)
 {
@@ -173,9 +176,14 @@ blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t
 			report_progress(progress, dumpsize);
 			counter &= (1<<24) - 1;
 		}
+		if (progress <= wdog_next) {
+			wdog_kern_pat(WD_LASTVAL);
+			if (wdog_next > WDOG_DUMP_INTERVAL)
+				wdog_next -= WDOG_DUMP_INTERVAL;
+			else
+				wdog_next = 0;
+		}
 
-		wdog_kern_pat(WD_LASTVAL);
-
 		if (ptr) {
 			error = dump_append(di, ptr, 0, len);
 			if (error)
@@ -313,7 +321,7 @@ minidumpsys(struct dumperinfo *di)
 	}
 	dumpsize += PAGE_SIZE;
 
-	progress = dumpsize;
+	wdog_next = progress = dumpsize;
 
 	/* Initialize mdhdr */
 	bzero(&mdhdr, sizeof(mdhdr));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201804061706.w36H6MEg056595>