Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Sep 2019 20:28:16 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r351830 - head/sys/vm
Message-ID:  <201909042028.x84KSGHS060580@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Wed Sep  4 20:28:16 2019
New Revision: 351830
URL: https://svnweb.freebsd.org/changeset/base/351830

Log:
  madvise(MADV_FREE): Quick fix to time rewind.
  
  Don't free pages in a shadowing object.  While this degrades MADV_FREE
  to a no-op (and we could, instead, choose to fall back to
  MADV_DONTNEED, at the cost of changing pmap_madvise), this is
  presently considered a temporary fix. We may prefer to risk a little
  fragmentation of the map by creating a zero/OBJT_DEFAULT entry over
  top of the existing object and, simultaneously, revert to the existing
  marking any pages in the former shadowing object in the advised region
  as reclaimable.  At least one consumer of MADV_FREE (snmalloc) may use
  mmap() to construct zeroed pages "eventually" here anyway, so the
  fragmentation may be coming anyway.
  
  Submitted by:	Nathaniel Filardo <nwf20@cl.cam.ac.uk>
  PR:	240061
  Reviewed by:	markj
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D21517

Modified:
  head/sys/vm/vm_map.c

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c	Wed Sep  4 20:14:21 2019	(r351829)
+++ head/sys/vm/vm_map.c	Wed Sep  4 20:28:16 2019	(r351830)
@@ -2736,6 +2736,18 @@ vm_map_madvise(
 			if (current->eflags & MAP_ENTRY_IS_SUB_MAP)
 				continue;
 
+			/*
+			 * MADV_FREE would otherwise rewind time to
+			 * the creation of the shadow object.  Because
+			 * we hold the VM map read-locked, neither the
+			 * entry's object nor the presence of a
+			 * backing object can change.
+			 */
+			if (behav == MADV_FREE &&
+			    current->object.vm_object != NULL &&
+			    current->object.vm_object->backing_object != NULL)
+				continue;
+
 			pstart = OFF_TO_IDX(current->offset);
 			pend = pstart + atop(current->end - current->start);
 			useStart = current->start;



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