BSD 4_4_Lite2 release
[unix-history] / usr / src / sys / vm / vm_page.h
index 68a1f5c..f9bf115 100644 (file)
@@ -1,13 +1,39 @@
 /* 
 /* 
- * Copyright (c) 1991 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * The Mach Operating System project at Carnegie-Mellon University.
  *
  *
  * This code is derived from software contributed to Berkeley by
  * The Mach Operating System project at Carnegie-Mellon University.
  *
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  *
  *
- *     @(#)vm_page.h   7.8 (Berkeley) %G%
+ *     @(#)vm_page.h   8.3 (Berkeley) 1/9/95
  *
  *
  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
  *
  *
  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
  *     queues (P).
  */
 
  *     queues (P).
  */
 
+TAILQ_HEAD(pglist, vm_page);
+
 struct vm_page {
 struct vm_page {
-       queue_chain_t   pageq;          /* queue info for FIFO
-                                        * queue or free list (P) */
-       queue_chain_t   hashq;          /* hash table links (O)*/
-       queue_chain_t   listq;          /* all pages in same object (O)*/
+       TAILQ_ENTRY(vm_page)    pageq;          /* queue info for FIFO
+                                                * queue or free list (P) */
+       TAILQ_ENTRY(vm_page)    hashq;          /* hash table links (O)*/
+       TAILQ_ENTRY(vm_page)    listq;          /* pages in same object (O)*/
 
 
-       vm_object_t     object;         /* which object am I in (O,P)*/
-       vm_offset_t     offset;         /* offset into that object (O,P) */
+       vm_object_t             object;         /* which object am I in (O,P)*/
+       vm_offset_t             offset;         /* offset into object (O,P) */
 
 
-       u_short         wire_count;     /* number wired down maps use me? (P) */
-       u_short         flags;          /* see below */
+       u_short                 wire_count;     /* wired down maps refs (P) */
+       u_short                 flags;          /* see below */
 
 
-       vm_offset_t     phys_addr;      /* physical address of page */
-       vm_prot_t       page_lock;      /* Uses prohibited by data manager */
-       vm_prot_t       unlock_request; /* Outstanding unlock request */
+       vm_offset_t             phys_addr;      /* physical address of page */
 };
 
 /*
  * These are the flags defined for vm_page.
 };
 
 /*
  * These are the flags defined for vm_page.
+ *
+ * Note: PG_FILLED and PG_DIRTY are added for the filesystems.
  */
 #define        PG_INACTIVE     0x0001          /* page is in inactive list (P) */
 #define        PG_ACTIVE       0x0002          /* page is in active list (P) */
  */
 #define        PG_INACTIVE     0x0001          /* page is in inactive list (P) */
 #define        PG_ACTIVE       0x0002          /* page is in active list (P) */
@@ -97,8 +125,9 @@ struct vm_page {
 #define        PG_TABLED       0x0040          /* page is in VP table (O) */
 #define        PG_COPYONWRITE  0x0080          /* must copy page before changing (O) */
 #define        PG_FICTITIOUS   0x0100          /* physical page doesn't exist (O) */
 #define        PG_TABLED       0x0040          /* page is in VP table (O) */
 #define        PG_COPYONWRITE  0x0080          /* must copy page before changing (O) */
 #define        PG_FICTITIOUS   0x0100          /* physical page doesn't exist (O) */
-#define        PG_ABSENT       0x0200          /* virtual page doesn't exist (O) */
-#define        PG_FAKE         0x0400          /* page is placeholder for pagein (O) */
+#define        PG_FAKE         0x0200          /* page is placeholder for pagein (O) */
+#define        PG_FILLED       0x0400          /* client flag to set when filled */
+#define        PG_DIRTY        0x0800          /* client flag to set when dirty */
 #define        PG_PAGEROWNED   0x4000          /* DEBUG: async paging op in progress */
 #define        PG_PTPAGE       0x8000          /* DEBUG: is a user page table page */
 
 #define        PG_PAGEROWNED   0x4000          /* DEBUG: async paging op in progress */
 #define        PG_PTPAGE       0x8000          /* DEBUG: is a user page table page */
 
@@ -111,9 +140,9 @@ struct vm_page {
                (PG_ACTIVE | PG_INACTIVE))) \
                panic("vm_page_check: not valid!"); \
 }
                (PG_ACTIVE | PG_INACTIVE))) \
                panic("vm_page_check: not valid!"); \
 }
-#else  VM_PAGE_DEBUG
+#else /* VM_PAGE_DEBUG */
 #define        VM_PAGE_CHECK(mem)
 #define        VM_PAGE_CHECK(mem)
-#endif VM_PAGE_DEBUG
+#endif /* VM_PAGE_DEBUG */
 
 #ifdef KERNEL
 /*
 
 #ifdef KERNEL
 /*
@@ -133,11 +162,11 @@ struct vm_page {
  */
 
 extern
  */
 
 extern
-queue_head_t   vm_page_queue_free;     /* memory free queue */
+struct pglist  vm_page_queue_free;     /* memory free queue */
 extern
 extern
-queue_head_t   vm_page_queue_active;   /* active memory queue */
+struct pglist  vm_page_queue_active;   /* active memory queue */
 extern
 extern
-queue_head_t   vm_page_queue_inactive; /* inactive memory queue */
+struct pglist  vm_page_queue_inactive; /* inactive memory queue */
 
 extern
 vm_page_t      vm_page_array;          /* First resident page in table */
 
 extern
 vm_page_t      vm_page_array;          /* First resident page in table */
@@ -173,14 +202,14 @@ simple_lock_data_t        vm_page_queue_free_lock;
 
 #define PAGE_ASSERT_WAIT(m, interruptible)     { \
                                (m)->flags |= PG_WANTED; \
 
 #define PAGE_ASSERT_WAIT(m, interruptible)     { \
                                (m)->flags |= PG_WANTED; \
-                               assert_wait((int) (m), (interruptible)); \
+                               assert_wait((m), (interruptible)); \
                        }
 
 #define PAGE_WAKEUP(m) { \
                                (m)->flags &= ~PG_BUSY; \
                                if ((m)->flags & PG_WANTED) { \
                                        (m)->flags &= ~PG_WANTED; \
                        }
 
 #define PAGE_WAKEUP(m) { \
                                (m)->flags &= ~PG_BUSY; \
                                if ((m)->flags & PG_WANTED) { \
                                        (m)->flags &= ~PG_WANTED; \
-                                       thread_wakeup((int) (m)); \
+                                       thread_wakeup((m)); \
                                } \
                        }
 
                                } \
                        }
 
@@ -189,19 +218,10 @@ simple_lock_data_t        vm_page_queue_free_lock;
 
 #define vm_page_set_modified(m)        { (m)->flags &= ~PG_CLEAN; }
 
 
 #define vm_page_set_modified(m)        { (m)->flags &= ~PG_CLEAN; }
 
-#ifdef DEBUG
-#define        VM_PAGE_DEBUG_INIT(m)
-#else
-#define        VM_PAGE_DEBUG_INIT(m)
-#endif
-
 #define        VM_PAGE_INIT(mem, object, offset) { \
        (mem)->flags = PG_BUSY | PG_CLEAN | PG_FAKE; \
        vm_page_insert((mem), (object), (offset)); \
 #define        VM_PAGE_INIT(mem, object, offset) { \
        (mem)->flags = PG_BUSY | PG_CLEAN | PG_FAKE; \
        vm_page_insert((mem), (object), (offset)); \
-       (mem)->page_lock = VM_PROT_NONE; \
-       (mem)->unlock_request = VM_PROT_NONE; \
        (mem)->wire_count = 0; \
        (mem)->wire_count = 0; \
-       VM_PAGE_DEBUG_INIT(mem); \
 }
 
 void            vm_page_activate __P((vm_page_t));
 }
 
 void            vm_page_activate __P((vm_page_t));