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 = "??";
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to