/*
- * Copyright (c) 2001, 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2010 Apple Computer, Inc. All rights reserved.
*
- * @APPLE_LICENSE_HEADER_START@
- *
- * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
* 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.
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ *
+ * 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
* Please see the License for the specific language governing rights and
* limitations under the License.
*
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
/*
* @OSF_COPYRIGHT@
*/
#include "default_pager_internal.h"
+#include <default_pager/default_pager_object_server.h>
#include <kern/host.h>
-#include <kern/ledger.h>
#include <mach/host_info.h>
+#include <mach/host_priv.h>
+#include <mach/vm_map.h>
#include <ipc/ipc_space.h>
#include <vm/vm_kern.h>
+#include <vm/vm_map.h>
+#include <vm/vm_protos.h>
char my_name[] = "(default pager): ";
vm_size_t cthread_stack_size = 16 *1024;
extern vm_size_t cthread_wait_stack_size;
+#ifndef MACH_KERNEL
unsigned long long vm_page_mask;
int vm_page_shift;
+#endif
int norma_mk;
boolean_t verbose;
/* task_t default_pager_self; */ /* Our task port. */
-mutex_t dpt_lock; /* lock for the dpt array struct */
+lck_mtx_t dpt_lock; /* lock for the dpt array struct */
default_pager_thread_t **dpt_array;
memory_object_default_t default_pager_object; /* for memory_object_create. */
/* Memory created by default_pager_object_create should mostly be resident. */
#define DEFAULT_PAGER_EXTERNAL_COUNT (2)
-unsigned int default_pager_internal_count = DEFAULT_PAGER_INTERNAL_COUNT;
+int default_pager_internal_count = DEFAULT_PAGER_INTERNAL_COUNT;
/* Number of "internal" threads. */
-unsigned int default_pager_external_count = DEFAULT_PAGER_EXTERNAL_COUNT;
+int default_pager_external_count = DEFAULT_PAGER_EXTERNAL_COUNT;
/* Number of "external" threads. */
/*
void default_pager(void);
void default_pager_thread(void *);
void default_pager_initialize(void);
-void default_pager_set_policy(MACH_PORT_FACE);
boolean_t dp_parse_argument(char *); /* forward; */
unsigned int d_to_i(char *); /* forward; */
-
extern int vstruct_def_clshift;
+struct global_stats global_stats;
/*
* Initialize and Run the default pager
default_pager(void)
{
int i, id;
- static char here[] = "default_pager";
- mach_msg_options_t server_options;
+ __unused static char here[] = "default_pager";
default_pager_thread_t dpt;
kern_return_t kr;
if (dpt_array[id] == NULL)
Panic("alloc pager thread");
kr = vm_allocate(kernel_map, &((dpt_array[id])->dpt_buffer),
- vm_page_size << vstruct_def_clshift, TRUE);
+ vm_page_size << vstruct_def_clshift, VM_FLAGS_ANYWHERE);
if (kr != KERN_SUCCESS)
Panic("alloc thread buffer");
kr = vm_map_wire(kernel_map, (dpt_array[id])->dpt_buffer,
boolean_t dp_parse_argument(char *av)
{
char *rhs = av;
- static char here[] = "dp_parse_argument";
+ __unused static char here[] = "dp_parse_argument";
/* Check for '-v' flag */
}
int
-start_def_pager(char *bs_device)
+start_def_pager( __unused char *bs_device )
{
- int my_node;
/*
MACH_PORT_FACE master_device_port;
*/
- MACH_PORT_FACE security_port;
/*
- MACH_PORT_FACE root_ledger_wired;
- MACH_PORT_FACE root_ledger_paged;
+ MACH_PORT_FACE security_port;
*/
- static char here[] = "main";
- int need_dp_init = 1;
-
+ __unused static char here[] = "main";
-/*
- default_pager_host_port = ipc_port_make_send(realhost.host_priv_self);
- master_device_port = ipc_port_make_send(master_device_port);
- root_ledger_wired = ipc_port_make_send(root_wired_ledger_port);
- root_ledger_paged = ipc_port_make_send(root_paged_ledger_port);
-*/
- security_port = ipc_port_make_send(realhost.host_security_self);
-
#if NORMA_VM
norma_mk = 1;
/* setup read buffers, etc */
default_pager_initialize();
+
+#ifndef MACH_KERNEL
default_pager();
-}
+#endif
-/*
- * Return TRUE if string 2 is a prefix of string 1.
- */
-boolean_t
-strprefix(register const char *s1, register const char *s2)
-{
- register int c;
-
- while ((c = *s2++) != '\0') {
- if (c != *s1++)
- return (FALSE);
- }
- return (TRUE);
+ /* start the backing store monitor, it runs on a callout thread */
+ default_pager_backing_store_monitor_callout =
+ thread_call_allocate(default_pager_backing_store_monitor, NULL);
+ if (!default_pager_backing_store_monitor_callout)
+ panic("can't start backing store monitor thread");
+ thread_call_enter(default_pager_backing_store_monitor_callout);
+
+ return (0);
}
-
kern_return_t
default_pager_info(
memory_object_default_t pager,
default_pager_info_t *infop)
{
- vm_size_t pages_total, pages_free;
+ uint64_t pages_total, pages_free;
if (pager != default_pager_object)
return KERN_INVALID_ARGUMENT;
bs_global_info(&pages_total, &pages_free);
- infop->dpi_total_space = ptoa(pages_total);
- infop->dpi_free_space = ptoa(pages_free);
+ infop->dpi_total_space = (vm_size_t) ptoa_64(pages_total);
+ infop->dpi_free_space = (vm_size_t) ptoa_64(pages_free);
infop->dpi_page_size = vm_page_size;
return KERN_SUCCESS;
}
+kern_return_t
+default_pager_info_64(
+ memory_object_default_t pager,
+ default_pager_info_64_t *infop)
+{
+ uint64_t pages_total, pages_free;
+
+ if (pager != default_pager_object)
+ return KERN_INVALID_ARGUMENT;
+
+ bs_global_info(&pages_total, &pages_free);
+
+ infop->dpi_total_space = ptoa_64(pages_total);
+ infop->dpi_free_space = ptoa_64(pages_free);
+ infop->dpi_page_size = vm_page_size;
+ infop->dpi_flags = 0;
+ if (dp_encryption_inited && dp_encryption == TRUE) {
+ infop->dpi_flags |= DPI_ENCRYPTED;
+ }
+
+ return KERN_SUCCESS;
+}
+
+lck_grp_t default_pager_lck_grp;
+lck_grp_attr_t default_pager_lck_grp_attr;
+lck_attr_t default_pager_lck_attr;
+
+
+
void
-default_pager_initialize()
+default_pager_initialize(void)
{
kern_return_t kr;
- static char here[] = "default_pager_initialize";
+ __unused static char here[] = "default_pager_initialize";
+ lck_grp_attr_setdefault(&default_pager_lck_grp_attr);
+ lck_grp_init(&default_pager_lck_grp, "default_pager", &default_pager_lck_grp_attr);
+ lck_attr_setdefault(&default_pager_lck_attr);
/*
* Vm variables.
*/
+#ifndef MACH_KERNEL
vm_page_mask = vm_page_size - 1;
- vm_page_shift = local_log2(vm_page_size);
+ assert((unsigned int) vm_page_size == vm_page_size);
+ vm_page_shift = local_log2((unsigned int) vm_page_size);
+#endif
/*
* List of all vstructs.
vstruct_zone = zinit(sizeof(struct vstruct),
10000 * sizeof(struct vstruct),
8192, "vstruct zone");
+ zone_change(vstruct_zone, Z_CALLERACCT, FALSE);
+ zone_change(vstruct_zone, Z_NOENCRYPT, TRUE);
+
VSL_LOCK_INIT();
queue_init(&vstruct_list.vsl_queue);
vstruct_list.vsl_count = 0;
}
#else /* USER_PAGER */
{
- int clsize;
+ unsigned int clsize;
memory_object_default_t dmm;
dmm = default_pager_object;
- clsize = (vm_page_size << vstruct_def_clshift);
+ assert((unsigned int) vm_page_size == vm_page_size);
+ clsize = ((unsigned int) vm_page_size << vstruct_def_clshift);
kr = host_default_memory_manager(host_priv_self(), &dmm, clsize);
if ((kr != KERN_SUCCESS) ||
(dmm != MEMORY_OBJECT_DEFAULT_NULL))