Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Mar 2015 22:00:12 +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: r280196 - head/sys/x86/iommu
Message-ID:  <201503172200.t2HM0CYu038513@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue Mar 17 22:00:11 2015
New Revision: 280196
URL: https://svnweb.freebsd.org/changeset/base/280196

Log:
  When initial placement of the new entry crosses the boundary,
  allocator tries to move the entry up, after the boundary.  The new
  location may still fail to satisfy boundary requirement, for instance,
  if the boundary is set to page size, and allocation is of multiple
  pages.
  
  Recheck that boundary is not crossed after the move.  If it is
  crossed, give up on allocating the whole entry and split it.
  
  Reported by:	Michael Fuckner <michael@fuckner.net>, running nvme(4)
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/sys/x86/iommu/intel_gas.c

Modified: head/sys/x86/iommu/intel_gas.c
==============================================================================
--- head/sys/x86/iommu/intel_gas.c	Tue Mar 17 21:55:33 2015	(r280195)
+++ head/sys/x86/iommu/intel_gas.c	Tue Mar 17 22:00:11 2015	(r280196)
@@ -327,13 +327,15 @@ dmar_gas_match_one(struct dmar_gas_match
 	start = roundup2(bs, a->common->alignment);
 	/* DMAR_PAGE_SIZE to create gap after new entry. */
 	if (start + a->size + DMAR_PAGE_SIZE <= prev->end + prev->free_after &&
-	    start + a->size <= end) {
+	    start + a->size <= end && dmar_test_boundary(start, a->size,
+	    a->common->boundary)) {
 		a->entry->start = start;
 		return (true);
 	}
 
 	/*
-	 * Not enough space to align at boundary, but allowed to split.
+	 * Not enough space to align at the requested boundary, or
+	 * boundary is smaller than the size, but allowed to split.
 	 * We already checked that start + size does not overlap end.
 	 *
 	 * XXXKIB. It is possible that bs is exactly at the start of



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