svn commit: r197197 - in stable/7: sys sys/amd64/amd64 sys/arm/arm sys/conf sys/contrib/pf sys/fs/procfs sys/i386/i386 sys/ia64/ia64 sys/kern sys/sparc64/sparc64 sys/sys sys/vm usr.bin/procstat

John Baldwin jhb at FreeBSD.org
Mon Sep 14 17:34:50 UTC 2009


Author: jhb
Date: Mon Sep 14 17:34:49 2009
New Revision: 197197
URL: http://svn.freebsd.org/changeset/base/197197

Log:
  MFC 195840, 195844, and 196637:
  Add a new type of VM object: OBJT_SG.  An OBJT_SG object is very similar to
  a device pager (OBJT_DEVICE) object in that it uses fictitious pages to
  provide aliases to other memory addresses.  The primary difference is that
  it uses an sglist(9) to determine the physical addresses for a given offset
  into the object instead of invoking the d_mmap() method in a device driver.

Added:
  stable/7/sys/vm/sg_pager.c
     - copied, changed from r195840, head/sys/vm/sg_pager.c
Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/amd64/amd64/pmap.c
  stable/7/sys/arm/arm/pmap.c
  stable/7/sys/conf/files
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/fs/procfs/procfs_map.c
  stable/7/sys/i386/i386/pmap.c
  stable/7/sys/ia64/ia64/pmap.c
  stable/7/sys/kern/kern_proc.c
  stable/7/sys/sparc64/sparc64/pmap.c
  stable/7/sys/sys/user.h
  stable/7/sys/vm/vm.h
  stable/7/sys/vm/vm_fault.c
  stable/7/sys/vm/vm_map.c
  stable/7/sys/vm/vm_meter.c
  stable/7/sys/vm/vm_object.c
  stable/7/sys/vm/vm_object.h
  stable/7/sys/vm/vm_page.c
  stable/7/sys/vm/vm_pageout.c
  stable/7/sys/vm/vm_pager.c
  stable/7/sys/vm/vm_pager.h
  stable/7/usr.bin/procstat/   (props changed)
  stable/7/usr.bin/procstat/procstat_vm.c

Modified: stable/7/sys/amd64/amd64/pmap.c
==============================================================================
--- stable/7/sys/amd64/amd64/pmap.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/amd64/amd64/pmap.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -3350,7 +3350,7 @@ pmap_object_init_pt(pmap_t pmap, vm_offs
 	int pat_mode;
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-	KASSERT(object->type == OBJT_DEVICE,
+	KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
 	    ("pmap_object_init_pt: non-device object"));
 	if ((addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) {
 		if (!vm_object_populate(object, pindex, pindex + atop(size)))
@@ -4592,7 +4592,8 @@ vm_offset_t
 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
 {
 
-	if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
+	if ((obj == NULL) || (size < NBPDR) ||
+	    (obj->type != OBJT_DEVICE && obj->type != OBJT_SG)) {
 		return addr;
 	}
 

Modified: stable/7/sys/arm/arm/pmap.c
==============================================================================
--- stable/7/sys/arm/arm/pmap.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/arm/arm/pmap.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -3071,7 +3071,7 @@ pmap_object_init_pt(pmap_t pmap, vm_offs
 {
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-	KASSERT(object->type == OBJT_DEVICE,
+	KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
 	    ("pmap_object_init_pt: non-device object"));
 }
 

Modified: stable/7/sys/conf/files
==============================================================================
--- stable/7/sys/conf/files	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/conf/files	Mon Sep 14 17:34:49 2009	(r197197)
@@ -2210,6 +2210,7 @@ vm/default_pager.c		standard
 vm/device_pager.c		standard
 vm/phys_pager.c			standard
 vm/redzone.c			optional DEBUG_REDZONE
+vm/sg_pager.c			standard
 vm/swap_pager.c			standard
 vm/uma_core.c			standard
 vm/uma_dbg.c			standard

Modified: stable/7/sys/fs/procfs/procfs_map.c
==============================================================================
--- stable/7/sys/fs/procfs/procfs_map.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/fs/procfs/procfs_map.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -177,6 +177,7 @@ procfs_doprocmap(PFS_FILL_ARGS)
 				type = "swap";
 				vp = NULL;
 				break;
+			case OBJT_SG:
 			case OBJT_DEVICE:
 				type = "device";
 				vp = NULL;

Modified: stable/7/sys/i386/i386/pmap.c
==============================================================================
--- stable/7/sys/i386/i386/pmap.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/i386/i386/pmap.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -3474,7 +3474,7 @@ pmap_object_init_pt(pmap_t pmap, vm_offs
 	int pat_mode;
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-	KASSERT(object->type == OBJT_DEVICE,
+	KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
 	    ("pmap_object_init_pt: non-device object"));
 	if (pseflag && 
 	    (addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) {
@@ -4712,7 +4712,8 @@ vm_offset_t
 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
 {
 
-	if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
+	if ((obj == NULL) || (size < NBPDR) ||
+	    (obj->type != OBJT_DEVICE && obj->type != OBJT_SG)) {
 		return addr;
 	}
 

Modified: stable/7/sys/ia64/ia64/pmap.c
==============================================================================
--- stable/7/sys/ia64/ia64/pmap.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/ia64/ia64/pmap.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -1737,7 +1737,7 @@ pmap_object_init_pt(pmap_t pmap, vm_offs
 {
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-	KASSERT(object->type == OBJT_DEVICE,
+	KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
 	    ("pmap_object_init_pt: non-device object"));
 }
 

Modified: stable/7/sys/kern/kern_proc.c
==============================================================================
--- stable/7/sys/kern/kern_proc.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/kern/kern_proc.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -1488,6 +1488,9 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_A
 			case OBJT_DEAD:
 				kve->kve_type = KVME_TYPE_DEAD;
 				break;
+			case OBJT_SG:
+				kve->kve_type = KVME_TYPE_SG;
+				break;
 			default:
 				kve->kve_type = KVME_TYPE_UNKNOWN;
 				break;
@@ -1659,6 +1662,9 @@ sysctl_kern_proc_vmmap(SYSCTL_HANDLER_AR
 			case OBJT_DEAD:
 				kve->kve_type = KVME_TYPE_DEAD;
 				break;
+			case OBJT_SG:
+				kve->kve_type = KVME_TYPE_SG;
+				break;
 			default:
 				kve->kve_type = KVME_TYPE_UNKNOWN;
 				break;

Modified: stable/7/sys/sparc64/sparc64/pmap.c
==============================================================================
--- stable/7/sys/sparc64/sparc64/pmap.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/sparc64/sparc64/pmap.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -1495,7 +1495,7 @@ pmap_object_init_pt(pmap_t pm, vm_offset
 {
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-	KASSERT(object->type == OBJT_DEVICE,
+	KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
 	    ("pmap_object_init_pt: non-device object"));
 }
 

Modified: stable/7/sys/sys/user.h
==============================================================================
--- stable/7/sys/sys/user.h	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/sys/user.h	Mon Sep 14 17:34:49 2009	(r197197)
@@ -334,6 +334,7 @@ struct kinfo_file {
 #define	KVME_TYPE_DEVICE	4
 #define	KVME_TYPE_PHYS		5
 #define	KVME_TYPE_DEAD		6
+#define	KVME_TYPE_SG		7
 #define	KVME_TYPE_UNKNOWN	255
 
 #define	KVME_PROT_READ		0x00000001

Copied and modified: stable/7/sys/vm/sg_pager.c (from r195840, head/sys/vm/sg_pager.c)
==============================================================================
--- head/sys/vm/sg_pager.c	Fri Jul 24 13:50:29 2009	(r195840, copy source)
+++ stable/7/sys/vm/sg_pager.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/lock.h>
 #include <sys/mutex.h>
 #include <sys/sglist.h>
+#include <sys/systm.h>
 #include <vm/vm.h>
 #include <vm/vm_object.h>
 #include <vm/vm_page.h>
@@ -45,7 +46,7 @@ __FBSDID("$FreeBSD$");
 
 static void sg_pager_init(void);
 static vm_object_t sg_pager_alloc(void *, vm_ooffset_t, vm_prot_t,
-    vm_ooffset_t, struct ucred *);
+    vm_ooffset_t);
 static void sg_pager_dealloc(vm_object_t);
 static int sg_pager_getpages(vm_object_t, vm_page_t *, int, int);
 static void sg_pager_putpages(vm_object_t, vm_page_t *, int, 
@@ -78,7 +79,7 @@ sg_pager_init(void)
 
 static vm_object_t
 sg_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot,
-    vm_ooffset_t foff, struct ucred *cred)
+    vm_ooffset_t foff)
 {
 	struct sglist *sg;
 	vm_object_t object;
@@ -193,21 +194,18 @@ sg_pager_getpages(vm_object_t object, vm
 	    ("backing page for SG is fake"));
 
 	/* Construct a new fake page. */
-	printf("SG: getting fake page for paddr %lx\n", paddr);
 	page = sg_pager_getfake(paddr, memattr);
 	VM_OBJECT_LOCK(object);
 	TAILQ_INSERT_TAIL(&object->un_pager.sgp.sgp_pglist, page, pageq);
 
 	/* Free the original pages and insert this fake page into the object. */
 	vm_page_lock_queues();
-	for (i = 0; i < count; i++) {
-		printf("SG: freeing VM page %p\n", m[i]);
+	for (i = 0; i < count; i++)
 		vm_page_free(m[i]);
-	}
 	vm_page_unlock_queues();
-	printf("SG: Inserting new fake page\n");
 	vm_page_insert(page, object, offset);
 	m[reqpage] = page;
+	page->valid = VM_PAGE_BITS_ALL;
 
 	return (VM_PAGER_OK);
 }

Modified: stable/7/sys/vm/vm.h
==============================================================================
--- stable/7/sys/vm/vm.h	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm.h	Mon Sep 14 17:34:49 2009	(r197197)
@@ -89,7 +89,7 @@ typedef u_char vm_prot_t;	/* protection 
 #define	VM_PROT_DEFAULT		VM_PROT_ALL
 
 enum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS,
-		OBJT_DEAD };
+		OBJT_DEAD, OBJT_SG };
 typedef u_char objtype_t;
 
 union vm_map_object;

Modified: stable/7/sys/vm/vm_fault.c
==============================================================================
--- stable/7/sys/vm/vm_fault.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_fault.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -485,7 +485,8 @@ readrest:
 			    (fs.first_object == fs.object ||
 			     (is_first_object_locked = VM_OBJECT_TRYLOCK(fs.first_object))) &&
 			    fs.first_object->type != OBJT_DEVICE &&
-			    fs.first_object->type != OBJT_PHYS) {
+			    fs.first_object->type != OBJT_PHYS &&
+			    fs.first_object->type != OBJT_SG) {
 				vm_pindex_t firstpindex, tmppindex;
 
 				if (fs.first_pindex < 2 * VM_FAULT_READ)

Modified: stable/7/sys/vm/vm_map.c
==============================================================================
--- stable/7/sys/vm/vm_map.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_map.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -1478,7 +1478,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offse
 	if ((prot & (VM_PROT_READ | VM_PROT_EXECUTE)) == 0 || object == NULL)
 		return;
 	VM_OBJECT_LOCK(object);
-	if (object->type == OBJT_DEVICE) {
+	if (object->type == OBJT_DEVICE || object->type == OBJT_SG) {
 		pmap_object_init_pt(map->pmap, addr, object, pindex, size);
 		goto unlock_return;
 	}
@@ -1954,7 +1954,8 @@ done:
 				 */
 				vm_fault_unwire(map, entry->start, entry->end,
 				    entry->object.vm_object != NULL &&
-				    entry->object.vm_object->type == OBJT_DEVICE);
+				    (entry->object.vm_object->type == OBJT_DEVICE ||
+				    entry->object.vm_object->type == OBJT_SG));
 			}
 		}
 		KASSERT(entry->eflags & MAP_ENTRY_IN_TRANSITION,
@@ -2073,7 +2074,8 @@ vm_map_wire(vm_map_t map, vm_offset_t st
 			saved_start = entry->start;
 			saved_end = entry->end;
 			fictitious = entry->object.vm_object != NULL &&
-			    entry->object.vm_object->type == OBJT_DEVICE;
+			    (entry->object.vm_object->type == OBJT_DEVICE ||
+			    entry->object.vm_object->type == OBJT_SG);
 			/*
 			 * Release the map lock, relying on the in-transition
 			 * mark.
@@ -2169,7 +2171,8 @@ done:
 				 */
 				vm_fault_unwire(map, entry->start, entry->end,
 				    entry->object.vm_object != NULL &&
-				    entry->object.vm_object->type == OBJT_DEVICE);
+				    (entry->object.vm_object->type == OBJT_DEVICE ||
+				    entry->object.vm_object->type == OBJT_SG));
 			}
 		}
 	next_entry_done:
@@ -2294,7 +2297,8 @@ vm_map_entry_unwire(vm_map_t map, vm_map
 {
 	vm_fault_unwire(map, entry->start, entry->end,
 	    entry->object.vm_object != NULL &&
-	    entry->object.vm_object->type == OBJT_DEVICE);
+	    (entry->object.vm_object->type == OBJT_DEVICE ||
+	    entry->object.vm_object->type == OBJT_SG));
 	entry->wired_count = 0;
 }
 

Modified: stable/7/sys/vm/vm_meter.c
==============================================================================
--- stable/7/sys/vm/vm_meter.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_meter.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -211,7 +211,7 @@ vmtotal(SYSCTL_HANDLER_ARGS)
 		 * synchronization should not impair the accuracy of
 		 * the reported statistics. 
 		 */
-		if (object->type == OBJT_DEVICE) {
+		if (object->type == OBJT_DEVICE || object->type == OBJT_SG) {
 			/*
 			 * Devices, like /dev/mem, will badly skew our totals.
 			 */

Modified: stable/7/sys/vm/vm_object.c
==============================================================================
--- stable/7/sys/vm/vm_object.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_object.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -306,6 +306,7 @@ vm_object_set_memattr(vm_object_t object
 	case OBJT_DEFAULT:
 	case OBJT_DEVICE:
 	case OBJT_PHYS:
+	case OBJT_SG:
 	case OBJT_SWAP:
 	case OBJT_VNODE:
 		if (!TAILQ_EMPTY(&object->memq))

Modified: stable/7/sys/vm/vm_object.h
==============================================================================
--- stable/7/sys/vm/vm_object.h	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_object.h	Mon Sep 14 17:34:49 2009	(r197197)
@@ -124,6 +124,15 @@ struct vm_object {
 		} devp;
 
 		/*
+		 * SG pager
+		 *
+		 *	sgp_pglist - list of allocated pages
+		 */
+		struct {
+			TAILQ_HEAD(, vm_page) sgp_pglist;
+		} sgp;
+
+		/*
 		 * Swap pager
 		 *
 		 *	swp_bcount - number of swap 'swblock' metablocks, each

Modified: stable/7/sys/vm/vm_page.c
==============================================================================
--- stable/7/sys/vm/vm_page.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_page.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -1149,7 +1149,7 @@ vm_page_alloc(vm_object_t object, vm_pin
 	if (object != NULL) {
 		/* Ignore device objects; the pager sets "memattr" for them. */
 		if (object->memattr != VM_MEMATTR_DEFAULT &&
-		    object->type != OBJT_DEVICE)
+		    object->type != OBJT_DEVICE && object->type != OBJT_SG)
 			pmap_page_set_memattr(m, object->memattr);
 		vm_page_insert(m, object, pindex);
 	} else

Modified: stable/7/sys/vm/vm_pageout.c
==============================================================================
--- stable/7/sys/vm/vm_pageout.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_pageout.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -516,7 +516,9 @@ vm_pageout_object_deactivate_pages(pmap,
 	int actcount, rcount, remove_mode;
 
 	VM_OBJECT_LOCK_ASSERT(first_object, MA_OWNED);
-	if (first_object->type == OBJT_DEVICE || first_object->type == OBJT_PHYS)
+	if (first_object->type == OBJT_DEVICE ||
+	    first_object->type == OBJT_SG ||
+	    first_object->type == OBJT_PHYS)
 		return;
 	for (object = first_object;; object = backing_object) {
 		if (pmap_resident_count(pmap) <= desired)

Modified: stable/7/sys/vm/vm_pager.c
==============================================================================
--- stable/7/sys/vm/vm_pager.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_pager.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -160,7 +160,8 @@ struct pagerops *pagertab[] = {
 	&vnodepagerops,		/* OBJT_VNODE */
 	&devicepagerops,	/* OBJT_DEVICE */
 	&physpagerops,		/* OBJT_PHYS */
-	&deadpagerops		/* OBJT_DEAD */
+	&deadpagerops,		/* OBJT_DEAD */
+	&sgpagerops		/* OBJT_SG */
 };
 
 static const int npagers = sizeof(pagertab) / sizeof(pagertab[0]);

Modified: stable/7/sys/vm/vm_pager.h
==============================================================================
--- stable/7/sys/vm/vm_pager.h	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/sys/vm/vm_pager.h	Mon Sep 14 17:34:49 2009	(r197197)
@@ -71,6 +71,7 @@ extern struct pagerops swappagerops;
 extern struct pagerops vnodepagerops;
 extern struct pagerops devicepagerops;
 extern struct pagerops physpagerops;
+extern struct pagerops sgpagerops;
 
 /*
  * get/put return values

Modified: stable/7/usr.bin/procstat/procstat_vm.c
==============================================================================
--- stable/7/usr.bin/procstat/procstat_vm.c	Mon Sep 14 16:52:38 2009	(r197196)
+++ stable/7/usr.bin/procstat/procstat_vm.c	Mon Sep 14 17:34:49 2009	(r197197)
@@ -93,6 +93,9 @@ procstat_vm(pid_t pid, struct kinfo_proc
 		case KVME_TYPE_DEAD:
 			str = "dd";
 			break;
+		case KVME_TYPE_SG:
+			str = "sg";
+			break;
 		case KVME_TYPE_UNKNOWN:
 		default:
 			str = "??";


More information about the svn-src-stable-7 mailing list