Converted vm_page bit fields to flags to allow for some optimizations
[unix-history] / sys / vm / swap_pager.c
index 2fb31df..136f5f8 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     from: Utah $Hdr: swap_pager.c 1.4 91/04/30$
  *     from: @(#)swap_pager.c  7.4 (Berkeley) 5/7/91
  *
  *     from: Utah $Hdr: swap_pager.c 1.4 91/04/30$
  *     from: @(#)swap_pager.c  7.4 (Berkeley) 5/7/91
- *     $Id: swap_pager.c,v 1.2 1993/10/16 16:20:19 rgrimes Exp $
+ *     $Id: swap_pager.c,v 1.8 1993/12/19 23:24:15 wollman Exp $
  */
 
 /*
  */
 
 /*
@@ -47,9 +47,6 @@
  *     Deal with async writes in a better fashion
  */
 
  *     Deal with async writes in a better fashion
  */
 
-#include "swappager.h"
-#if NSWAPPAGER > 0
-
 #include "param.h"
 #include "proc.h"
 #include "buf.h"
 #include "param.h"
 #include "proc.h"
 #include "buf.h"
 #include "specdev.h"
 #include "vnode.h"
 #include "malloc.h"
 #include "specdev.h"
 #include "vnode.h"
 #include "malloc.h"
-#include "queue.h"
 #include "rlist.h"
 #include "rlist.h"
+#include "kernel.h"
 
 
-#include "vm_param.h"
-#include "queue.h"
-#include "lock.h"
-#include "vm_prot.h"
-#include "vm_object.h"
+#include "vm.h"
 #include "vm_page.h"
 #include "vm_pageout.h"
 #include "swap_pager.h"
 #include "vm_page.h"
 #include "vm_pageout.h"
 #include "swap_pager.h"
@@ -126,6 +119,8 @@ struct swtab {
 #endif
 } swtab[NSWSIZES+1];
 
 #endif
 } swtab[NSWSIZES+1];
 
+static int swap_pager_finish(swp_clean_t);
+
 #ifdef DEBUG
 int            swap_pager_pendingio;   /* max pending async "clean" ops */
 int            swap_pager_poip;        /* pageouts in progress */
 #ifdef DEBUG
 int            swap_pager_pendingio;   /* max pending async "clean" ops */
 int            swap_pager_poip;        /* pageouts in progress */
@@ -348,8 +343,8 @@ swap_pager_dealloc(pager)
        s = splbio();
        while (swp->sw_poip) {
                swp->sw_flags |= SW_WANTED;
        s = splbio();
        while (swp->sw_poip) {
                swp->sw_flags |= SW_WANTED;
-               assert_wait((int)swp);
-               thread_block();
+               assert_wait((int)swp, 0);
+               thread_block("swpgde");
        }
        splx(s);
        (void) swap_pager_clean(NULL, B_WRITE);
        }
        splx(s);
        (void) swap_pager_clean(NULL, B_WRITE);
@@ -377,6 +372,7 @@ swap_pager_dealloc(pager)
        free((caddr_t)pager, M_VMPAGER);
 }
 
        free((caddr_t)pager, M_VMPAGER);
 }
 
+int
 swap_pager_getpage(pager, m, sync)
        vm_pager_t pager;
        vm_page_t m;
 swap_pager_getpage(pager, m, sync)
        vm_pager_t pager;
        vm_page_t m;
@@ -389,6 +385,7 @@ swap_pager_getpage(pager, m, sync)
        return(swap_pager_io((sw_pager_t)pager->pg_data, m, B_READ));
 }
 
        return(swap_pager_io((sw_pager_t)pager->pg_data, m, B_READ));
 }
 
+int
 swap_pager_putpage(pager, m, sync)
        vm_pager_t pager;
        vm_page_t m;
 swap_pager_putpage(pager, m, sync)
        vm_pager_t pager;
        vm_page_t m;
@@ -402,7 +399,7 @@ swap_pager_putpage(pager, m, sync)
 #endif
        if (pager == NULL) {
                (void) swap_pager_clean(NULL, B_WRITE);
 #endif
        if (pager == NULL) {
                (void) swap_pager_clean(NULL, B_WRITE);
-               return;
+               return 0;
        }
        flags = B_WRITE;
        if (!sync)
        }
        flags = B_WRITE;
        if (!sync)
@@ -454,6 +451,7 @@ swap_pager_haspage(pager, offset)
  * BOGUS:  lower level IO routines expect a KVA so we have to map our
  * provided physical page into the KVA to keep them happy.
  */
  * BOGUS:  lower level IO routines expect a KVA so we have to map our
  * provided physical page into the KVA to keep them happy.
  */
+int
 swap_pager_io(swp, m, flags)
        register sw_pager_t swp;
        vm_page_t m;
 swap_pager_io(swp, m, flags)
        register sw_pager_t swp;
        vm_page_t m;
@@ -493,7 +491,7 @@ swap_pager_io(swp, m, flags)
 
                        swp->sw_flags |= SW_WANTED;
                        assert_wait((int)swp);
 
                        swp->sw_flags |= SW_WANTED;
                        assert_wait((int)swp);
-                       thread_block();
+                       thread_block("swpgio");
                }
 #else
                (void) swap_pager_clean(m, flags&B_READ);
                }
 #else
                (void) swap_pager_clean(m, flags&B_READ);
@@ -589,7 +587,7 @@ swap_pager_io(swp, m, flags)
                               m, flags);
 #endif
                bswlist.b_flags |= B_WANTED;
                               m, flags);
 #endif
                bswlist.b_flags |= B_WANTED;
-               sleep((caddr_t)&bswlist, PSWP+1);
+               tsleep((caddr_t)&bswlist, PSWP+1, "pagerio", 0);
        }
        bp = bswlist.av_forw;
        bswlist.av_forw = bp->av_forw;
        }
        bp = bswlist.av_forw;
        bswlist.av_forw = bp->av_forw;
@@ -666,8 +664,8 @@ swap_pager_io(swp, m, flags)
                swap_pager_poip++;
 #endif
        while ((bp->b_flags & B_DONE) == 0) {
                swap_pager_poip++;
 #endif
        while ((bp->b_flags & B_DONE) == 0) {
-               assert_wait((int)bp);
-               thread_block();
+               assert_wait((int)bp, 0);
+               thread_block("swpgio");
        }
 #ifdef DEBUG
        if (flags & B_READ)
        }
 #ifdef DEBUG
        if (flags & B_READ)
@@ -686,7 +684,7 @@ swap_pager_io(swp, m, flags)
                thread_wakeup((int)&bswlist);
        }
        if ((flags & B_READ) == 0 && rv == VM_PAGER_OK) {
                thread_wakeup((int)&bswlist);
        }
        if ((flags & B_READ) == 0 && rv == VM_PAGER_OK) {
-               m->clean = TRUE;
+               m->flags |= PG_CLEAN;
                pmap_clear_modify(VM_PAGE_TO_PHYS(m));
        }
        splx(s);
                pmap_clear_modify(VM_PAGE_TO_PHYS(m));
        }
        splx(s);
@@ -793,6 +791,7 @@ swap_pager_clean(m, rw)
        return(tspc ? TRUE : FALSE);
 }
 
        return(tspc ? TRUE : FALSE);
 }
 
+int
 swap_pager_finish(spc)
        register swp_clean_t spc;
 {
 swap_pager_finish(spc)
        register swp_clean_t spc;
 {
@@ -823,7 +822,7 @@ swap_pager_finish(spc)
                if (swpagerdebug & SDB_ANOM)
                        printf("swap_pager_finish: page %x dirty again\n",
                               spc->spc_m);
                if (swpagerdebug & SDB_ANOM)
                        printf("swap_pager_finish: page %x dirty again\n",
                               spc->spc_m);
-               spc->spc_m->busy = FALSE;
+               spc->spc_m->flags &= ~PG_BUSY;
                PAGE_WAKEUP(spc->spc_m);
                vm_object_unlock(object);
                return(1);
                PAGE_WAKEUP(spc->spc_m);
                vm_object_unlock(object);
                return(1);
@@ -837,18 +836,19 @@ swap_pager_finish(spc)
        if (spc->spc_flags & SPC_ERROR) {
                printf("swap_pager_finish: clean of page %x failed\n",
                       VM_PAGE_TO_PHYS(spc->spc_m));
        if (spc->spc_flags & SPC_ERROR) {
                printf("swap_pager_finish: clean of page %x failed\n",
                       VM_PAGE_TO_PHYS(spc->spc_m));
-               spc->spc_m->laundry = TRUE;
+               spc->spc_m->flags |= PG_LAUNDRY;
        } else {
        } else {
-               spc->spc_m->clean = TRUE;
+               spc->spc_m->flags |= PG_CLEAN;
                pmap_clear_modify(VM_PAGE_TO_PHYS(spc->spc_m));
        }
                pmap_clear_modify(VM_PAGE_TO_PHYS(spc->spc_m));
        }
-       spc->spc_m->busy = FALSE;
+       spc->spc_m->flags &= ~PG_BUSY;
        PAGE_WAKEUP(spc->spc_m);
 
        vm_object_unlock(object);
        return(1);
 }
 
        PAGE_WAKEUP(spc->spc_m);
 
        vm_object_unlock(object);
        return(1);
 }
 
+void
 swap_pager_iodone(bp)
        register struct buf *bp;
 {
 swap_pager_iodone(bp)
        register struct buf *bp;
 {
@@ -910,4 +910,3 @@ printf("error %d blkno %d sz %d ", bp->b_error, bp->b_blkno, bp->b_bcount);
        thread_wakeup((int) &vm_pages_needed);
        splx(s);
 }
        thread_wakeup((int) &vm_pages_needed);
        splx(s);
 }
-#endif