]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/vm/vm_page.h
xnu-517.tar.gz
[apple/xnu.git] / osfmk / vm / vm_page.h
index 2cb7f1a00a87940d2dc8216ecafdb7602dd89680..585c01355bf98afacd9219368e55c05010c8a6a7 100644 (file)
@@ -3,19 +3,22 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
@@ -84,6 +87,7 @@
 extern int     vm_page_ticket_roll;
 extern int     vm_page_ticket;
 
+
 #define VM_PAGE_TICKETS_IN_ROLL  512
 #define VM_PAGE_TICKET_ROLL_IDS  16
 
@@ -134,6 +138,7 @@ struct vm_page {
                        gobbled:1,      /* page used internally (P) */
                        private:1,      /* Page should not be returned to
                                         *  the free list (O) */
+                       zero_fill:1,
                        :0;
 
        unsigned int
@@ -175,7 +180,7 @@ struct vm_page {
                                           /* a pageout candidate           */
         /* we've used up all 32 bits */
 
-       vm_offset_t     phys_addr;      /* Physical address of page, passed
+       vm_offset_t     phys_page;      /* Physical address of page, passed
                                         *  to pmap_enter (read-only) */
 };
 
@@ -220,6 +225,7 @@ extern
 queue_head_t   vm_page_queue_active;   /* active memory queue */
 extern
 queue_head_t   vm_page_queue_inactive; /* inactive memory queue */
+queue_head_t   vm_page_queue_zf;       /* inactive memory queue for zero fill */
 
 extern
 vm_offset_t    first_phys_addr;        /* physical address for first_page */
@@ -246,12 +252,17 @@ extern
 int    vm_page_free_reserved;  /* How many pages reserved to do pageout */
 extern
 int    vm_page_laundry_count;  /* How many pages being laundered? */
+extern
+int    vm_page_burst_count;    /* How many pages being laundered to EMM? */
+extern
+int    vm_page_throttled_count;/* Count of zero-fill allocations throttled */
 
 decl_mutex_data(,vm_page_queue_lock)
                                /* lock on active and inactive page queues */
 decl_mutex_data(,vm_page_queue_free_lock)
                                /* lock on free page queue */
 decl_simple_lock_data(extern,vm_page_preppin_lock)     /* lock for prep/pin */
+decl_mutex_data(,vm_page_zero_fill_lock)
 
 extern unsigned int    vm_page_free_wanted;
                                /* how many threads are waiting for memory */
@@ -269,8 +280,8 @@ extern void         vm_page_bootstrap(
 extern void            vm_page_module_init(void);
 
 extern void            vm_page_create(
-                                       vm_offset_t     start,
-                                       vm_offset_t     end);
+                                       ppnum_t         start,
+                                       ppnum_t         end);
 
 extern vm_page_t       vm_page_lookup(
                                        vm_object_t             object,
@@ -309,7 +320,7 @@ extern vm_page_t    vm_page_alloc(
 
 extern void            vm_page_init(
                                        vm_page_t       page,
-                                       vm_offset_t     phys_addr);
+                                       ppnum_t         phys_page);
 
 extern void            vm_page_free(
                                        vm_page_t       page);
@@ -374,10 +385,12 @@ extern void               vm_page_gobble(
  */
 
 #define PAGE_ASSERT_WAIT(m, interruptible)                     \
-               MACRO_BEGIN                                     \
-               (m)->wanted = TRUE;                             \
-               assert_wait((event_t) (m), (interruptible));    \
-               MACRO_END
+               (((m)->wanted = TRUE),                          \
+                assert_wait((event_t) (m), (interruptible)))
+
+#define PAGE_SLEEP(o, m, interruptible)                                \
+               (((m)->wanted = TRUE),                          \
+                thread_sleep_vm_object((o), (m), (interruptible)))
 
 #define PAGE_WAKEUP_DONE(m)                                    \
                MACRO_BEGIN                                     \
@@ -410,8 +423,9 @@ extern void         vm_page_gobble(
                MACRO_END
 
 #define VM_PAGE_THROTTLED()                                            \
-               (vm_page_free_count < (vm_page_free_target -            \
-                ((vm_page_free_target-vm_page_free_min)>>2)))
+               (vm_page_free_count < vm_page_free_min &&               \
+                !current_thread()->vm_privilege &&                     \
+                ++vm_page_throttled_count)
 
 #define        VM_PAGE_WAIT()          ((void)vm_page_wait(THREAD_UNINT))
 
@@ -433,8 +447,13 @@ extern void                vm_page_gobble(
                                                                \
        if (mem->inactive) {                                    \
                assert(!mem->active);                           \
-               queue_remove(&vm_page_queue_inactive,           \
+               if (mem->zero_fill) {                           \
+                       queue_remove(&vm_page_queue_zf,         \
                        mem, vm_page_t, pageq);                 \
+               } else {                                        \
+                       queue_remove(&vm_page_queue_inactive,   \
+                       mem, vm_page_t, pageq);                 \
+               }                                               \
                mem->inactive = FALSE;                          \
                if (!mem->fictitious)                           \
                        vm_page_inactive_count--;               \