initialize swpa buffers to use proc0 credential (from Leres)
[unix-history] / usr / src / sys / vm / vm_pager.c
index afa3e8c..33f1f2d 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)vm_pager.c  7.3 (Berkeley) %G%
+ *     @(#)vm_pager.c  7.8 (Berkeley) %G%
  *
  *
  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
  *
  *
  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
  *     for builtin pagers.
  */
 
  *     for builtin pagers.
  */
 
-#include "param.h"
-#include "malloc.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
 
 
-#include "vm.h"
-#include "vm_page.h"
-#include "vm_kern.h"
-
-#ifdef hp300
-#include "../hp300/hp300/pte.h"                        /* XXX XXX XXX */
-#endif
+#include <vm/vm.h>
+#include <vm/vm_page.h>
+#include <vm/vm_kern.h>
 
 #include "swappager.h"
 
 #include "swappager.h"
-
 #if NSWAPPAGER > 0
 extern struct pagerops swappagerops;
 #if NSWAPPAGER > 0
 extern struct pagerops swappagerops;
-#else
-#define        swappagerops    NULL
+#define        swappagerops_p  &swappagerops
 #endif
 #endif
+
 #include "vnodepager.h"
 #if NVNODEPAGER > 0
 extern struct pagerops vnodepagerops;
 #include "vnodepager.h"
 #if NVNODEPAGER > 0
 extern struct pagerops vnodepagerops;
-#else
-#define        vnodepagerops   NULL
+#define        vnodepagerops_p &vnodepagerops
 #endif
 #endif
+
 #include "devpager.h"
 #if NDEVPAGER > 0
 extern struct pagerops devicepagerops;
 #include "devpager.h"
 #if NDEVPAGER > 0
 extern struct pagerops devicepagerops;
-#else
-#define        devicepagerops  NULL
+#define        devicepagerops_p &devicepagerops
 #endif
 
 struct pagerops *pagertab[] = {
 #endif
 
 struct pagerops *pagertab[] = {
-       &swappagerops,          /* PG_SWAP */
-       &vnodepagerops,         /* PG_VNODE */
-       &devicepagerops,        /* PG_DEV */
+#if NSWAPPAGER > 0
+       swappagerops_p,         /* PG_SWAP */
+#endif
+#if NVNODEPAGER > 0
+       vnodepagerops_p,        /* PG_VNODE */
+#endif
+#if NDEVPAGER > 0
+       devicepagerops_p,       /* PG_DEV */
+#endif
 };
 int npagers = sizeof (pagertab) / sizeof (pagertab[0]);
 
 };
 int npagers = sizeof (pagertab) / sizeof (pagertab[0]);
 
@@ -87,17 +88,17 @@ struct pagerops *dfltpagerops = NULL;       /* default pager */
  */
 #define PAGER_MAP_SIZE (256 * PAGE_SIZE)
 vm_map_t pager_map;
  */
 #define PAGER_MAP_SIZE (256 * PAGE_SIZE)
 vm_map_t pager_map;
+vm_offset_t pager_sva, pager_eva;
 
 void
 vm_pager_init()
 {
 
 void
 vm_pager_init()
 {
-       vm_offset_t whocares1, whocares2;
        struct pagerops **pgops;
 
        /*
         * Allocate a kernel submap for tracking get/put page mappings
         */
        struct pagerops **pgops;
 
        /*
         * Allocate a kernel submap for tracking get/put page mappings
         */
-       pager_map = kmem_suballoc(kernel_map, &whocares1, &whocares2,
+       pager_map = kmem_suballoc(kernel_map, &pager_sva, &pager_eva,
                                  PAGER_MAP_SIZE, FALSE);
        /*
         * Initialize known pagers
                                  PAGER_MAP_SIZE, FALSE);
        /*
         * Initialize known pagers
@@ -135,6 +136,7 @@ vm_pager_deallocate(pager)
        VM_PAGER_DEALLOC(pager);
 }
 
        VM_PAGER_DEALLOC(pager);
 }
 
+int
 vm_pager_get(pager, m, sync)
        vm_pager_t      pager;
        vm_page_t       m;
 vm_pager_get(pager, m, sync)
        vm_pager_t      pager;
        vm_page_t       m;
@@ -147,6 +149,7 @@ vm_pager_get(pager, m, sync)
        return(VM_PAGER_GET(pager, m, sync));
 }
 
        return(VM_PAGER_GET(pager, m, sync));
 }
 
+int
 vm_pager_put(pager, m, sync)
        vm_pager_t      pager;
        vm_page_t       m;
 vm_pager_put(pager, m, sync)
        vm_pager_t      pager;
        vm_page_t       m;
@@ -186,18 +189,18 @@ vm_pager_map_page(m)
 {
        vm_offset_t kva;
 
 {
        vm_offset_t kva;
 
+#ifdef DEBUG
+       if (!m->busy || m->active)
+               panic("vm_pager_map_page: page active or not busy");
+       if (m->pagerowned)
+               printf("vm_pager_map_page: page %x already in pager\n", m);
+#endif
        kva = kmem_alloc_wait(pager_map, PAGE_SIZE);
        kva = kmem_alloc_wait(pager_map, PAGE_SIZE);
-#ifdef hp300
-       /*
-        * XXX: cannot use pmap_enter as the mapping would be
-        * removed by a pmap_remove_all().
-        */
-       *(int *)kvtopte(kva) = VM_PAGE_TO_PHYS(m) | PG_CI | PG_V;
-       TBIS(kva);
-#else
+#ifdef DEBUG
+       m->pagerowned = 1;
+#endif
        pmap_enter(vm_map_pmap(pager_map), kva, VM_PAGE_TO_PHYS(m),
                   VM_PROT_DEFAULT, TRUE);
        pmap_enter(vm_map_pmap(pager_map), kva, VM_PAGE_TO_PHYS(m),
                   VM_PROT_DEFAULT, TRUE);
-#endif
        return(kva);
 }
 
        return(kva);
 }
 
@@ -205,11 +208,20 @@ void
 vm_pager_unmap_page(kva)
        vm_offset_t     kva;
 {
 vm_pager_unmap_page(kva)
        vm_offset_t     kva;
 {
-#ifdef hp300
-       *(int *)kvtopte(kva) = PG_NV;
-       TBIS(kva);
+#ifdef DEBUG
+       vm_page_t m;
+
+       m = PHYS_TO_VM_PAGE(pmap_extract(vm_map_pmap(pager_map), kva));
 #endif
 #endif
+       pmap_remove(vm_map_pmap(pager_map), kva, kva + PAGE_SIZE);
        kmem_free_wakeup(pager_map, kva, PAGE_SIZE);
        kmem_free_wakeup(pager_map, kva, PAGE_SIZE);
+#ifdef DEBUG
+       if (m->pagerowned)
+               m->pagerowned = 0;
+       else
+               printf("vm_pager_unmap_page: page %x(%x/%x) not owned\n",
+                      m, kva, VM_PAGE_TO_PHYS(m));
+#endif
 }
 
 vm_pager_t
 }
 
 vm_pager_t
@@ -232,6 +244,7 @@ vm_pager_lookup(list, handle)
  * This routine gains a reference to the object.
  * Explicit deallocation is necessary.
  */
  * This routine gains a reference to the object.
  * Explicit deallocation is necessary.
  */
+int
 pager_cache(object, should_cache)
        vm_object_t     object;
        boolean_t       should_cache;
 pager_cache(object, should_cache)
        vm_object_t     object;
        boolean_t       should_cache;
@@ -241,7 +254,10 @@ pager_cache(object, should_cache)
 
        vm_object_cache_lock();
        vm_object_lock(object);
 
        vm_object_cache_lock();
        vm_object_lock(object);
-       object->can_persist = should_cache;
+       if (should_cache)
+               object->flags |= OBJ_CANPERSIST;
+       else
+               object->flags &= ~OBJ_CANPERSIST;
        vm_object_unlock(object);
        vm_object_cache_unlock();
 
        vm_object_unlock(object);
        vm_object_cache_unlock();