Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 May 2016 17:48:43 +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: r298891 - head/sys/vm
Message-ID:  <201605011748.u41Hmh5i042414@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun May  1 17:48:43 2016
New Revision: 298891
URL: https://svnweb.freebsd.org/changeset/base/298891

Log:
  Avoid duplicated calls to pmap_page_get_memattr().
  
  Avoid logging inconsistency for the /dev/mem device at all. The driver
  leaves memattr intact, and the corrective action in the device pager
  handles it right.
  
  In the logged warning, name the driver we blame, and show memory
  attributes values.
  
  Reported and tested by:	pho
  Reviewed by:	alc
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D6149

Modified:
  head/sys/vm/device_pager.c

Modified: head/sys/vm/device_pager.c
==============================================================================
--- head/sys/vm/device_pager.c	Sun May  1 17:46:56 2016	(r298890)
+++ head/sys/vm/device_pager.c	Sun May  1 17:48:43 2016	(r298891)
@@ -299,7 +299,7 @@ old_dev_pager_fault(vm_object_t object, 
 	struct cdevsw *csw;
 	struct file *fpop;
 	struct thread *td;
-	vm_memattr_t memattr;
+	vm_memattr_t memattr, memattr1;
 	int ref, ret;
 
 	memattr = object->memattr;
@@ -327,10 +327,18 @@ old_dev_pager_fault(vm_object_t object, 
 
 	/* If "paddr" is a real page, perform a sanity check on "memattr". */
 	if ((m_paddr = vm_phys_paddr_to_vm_page(paddr)) != NULL &&
-	    pmap_page_get_memattr(m_paddr) != memattr) {
-		memattr = pmap_page_get_memattr(m_paddr);
-		printf(
-	    "WARNING: A device driver has set \"memattr\" inconsistently.\n");
+	    (memattr1 = pmap_page_get_memattr(m_paddr)) != memattr) {
+		/*
+		 * For the /dev/mem d_mmap routine to return the
+		 * correct memattr, pmap_page_get_memattr() needs to
+		 * be called, which we do there.
+		 */
+		if ((csw->d_flags & D_MEM) == 0) {
+			printf("WARNING: Device driver %s has set "
+			    "\"memattr\" inconsistently (drv %u pmap %u).\n",
+			    csw->d_name, memattr, memattr1);
+		}
+		memattr = memattr1;
 	}
 	if (((*mres)->flags & PG_FICTITIOUS) != 0) {
 		/*



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