diff options
Diffstat (limited to 'sys/vm/vm_object.h')
-rw-r--r-- | sys/vm/vm_object.h | 182 |
1 files changed, 108 insertions, 74 deletions
diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index cec90ae42544..03661df96c9d 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * @@ -40,17 +40,17 @@ * All rights reserved. * * Authors: Avadis Tevanian, Jr., Michael Wayne Young - * + * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_object.h,v 1.2 1994/08/02 07:55:31 davidg Exp $ + * $Id: vm_object.h,v 1.3 1994/11/06 05:07:52 davidg Exp $ */ /* @@ -81,97 +81,131 @@ */ struct vm_object { - struct pglist memq; /* Resident memory */ - TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ - u_short flags; /* see below */ - u_short paging_in_progress; /* Paging (in or out) so - don't collapse or destroy */ - simple_lock_data_t Lock; /* Synchronization */ - int ref_count; /* How many refs?? */ - vm_size_t size; /* Object size */ - int resident_page_count; - /* number of resident pages */ - struct vm_object *copy; /* Object that holds copies of - my changed pages */ - vm_pager_t pager; /* Where to get data */ - vm_offset_t paging_offset; /* Offset into paging space */ - struct vm_object *shadow; /* My shadow */ - vm_offset_t shadow_offset; /* Offset in shadow */ - TAILQ_ENTRY(vm_object) cached_list; /* for persistence */ - TAILQ_ENTRY(vm_object) reverse_shadow_list; /* chain of objects that are shadowed */ - TAILQ_HEAD(rslist, vm_object) reverse_shadow_head; /* objects that this is a shadow for */ + struct pglist memq; /* Resident memory */ + TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ + u_short flags; /* see below */ + u_short paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ + int ref_count; /* How many refs?? */ + struct { + int recursion; /* object locking */ + struct proc *proc; /* process owned */ + } lock; + vm_size_t size; /* Object size */ + int resident_page_count; + /* number of resident pages */ + struct vm_object *copy; /* Object that holds copies of my changed pages */ + vm_pager_t pager; /* Where to get data */ + vm_offset_t paging_offset; /* Offset into paging space */ + struct vm_object *shadow; /* My shadow */ + vm_offset_t shadow_offset; /* Offset in shadow */ + TAILQ_ENTRY(vm_object) cached_list; /* for persistence */ + TAILQ_ENTRY(vm_object) reverse_shadow_list; /* chain of objects that are shadowed */ + TAILQ_HEAD(rslist, vm_object) reverse_shadow_head; /* objects that this is a shadow for */ }; + /* * Flags */ -#define OBJ_CANPERSIST 0x0001 /* allow to persist */ -#define OBJ_INTERNAL 0x0002 /* internally created object */ -#define OBJ_ACTIVE 0x0004 /* used to mark active objects */ +#define OBJ_CANPERSIST 0x0001 /* allow to persist */ +#define OBJ_INTERNAL 0x0002 /* internally created object */ +#define OBJ_ACTIVE 0x0004 /* used to mark active objects */ +#define OBJ_DEAD 0x0008 /* used to mark dead objects during rundown */ +#define OBJ_ILOCKED 0x0010 /* lock from modification */ +#define OBJ_ILOCKWT 0x0020 /* wait for lock from modification */ TAILQ_HEAD(vm_object_hash_head, vm_object_hash_entry); struct vm_object_hash_entry { - TAILQ_ENTRY(vm_object_hash_entry) hash_links; /* hash chain links */ - vm_object_t object; /* object represened */ + TAILQ_ENTRY(vm_object_hash_entry) hash_links; /* hash chain links */ + vm_object_t object; /* object represened */ }; -typedef struct vm_object_hash_entry *vm_object_hash_entry_t; +typedef struct vm_object_hash_entry *vm_object_hash_entry_t; #ifdef KERNEL TAILQ_HEAD(object_q, vm_object); -struct object_q vm_object_cached_list; /* list of objects persisting */ -int vm_object_cached; /* size of cached list */ -simple_lock_data_t vm_cache_lock; /* lock for object cache */ +struct object_q vm_object_cached_list; /* list of objects persisting */ +int vm_object_cached; /* size of cached list */ +simple_lock_data_t vm_cache_lock; /* lock for object cache */ + +struct object_q vm_object_list; /* list of allocated objects */ +long vm_object_count; /* count of all objects */ +simple_lock_data_t vm_object_list_lock; -struct object_q vm_object_list; /* list of allocated objects */ -long vm_object_count; /* count of all objects */ -simple_lock_data_t vm_object_list_lock; - /* lock for object list and count */ + /* lock for object list and count */ -vm_object_t kernel_object; /* the single kernel object */ -vm_object_t kmem_object; +vm_object_t kernel_object; /* the single kernel object */ +vm_object_t kmem_object; #define vm_object_cache_lock() simple_lock(&vm_cache_lock) #define vm_object_cache_unlock() simple_unlock(&vm_cache_lock) -#endif /* KERNEL */ +#endif /* KERNEL */ +#define vm_object_sleep(event, object, interruptible) \ + thread_sleep((event), &(object)->Lock, (interruptible)) +#if 0 #define vm_object_lock_init(object) simple_lock_init(&(object)->Lock) #define vm_object_lock(object) simple_lock(&(object)->Lock) #define vm_object_unlock(object) simple_unlock(&(object)->Lock) #define vm_object_lock_try(object) simple_lock_try(&(object)->Lock) -#define vm_object_sleep(event, object, interruptible) \ - thread_sleep((event), &(object)->Lock, (interruptible)) +#endif +#define vm_object_lock_init(object) (object->flags &= ~OBJ_ILOCKED, object->lock.recursion = 0, object->lock.proc = 0) + +static __inline void +vm_object_lock(vm_object_t obj) +{ + if (obj->flags & OBJ_ILOCKED) { + ++obj->lock.recursion; + return; + } + obj->flags |= OBJ_ILOCKED; + obj->lock.recursion = 1; +} + +static __inline void +vm_object_unlock(vm_object_t obj) +{ + --obj->lock.recursion; + if (obj->lock.recursion != 0) + return; + obj->flags &= ~OBJ_ILOCKED; +} + +static __inline int +vm_object_lock_try(vm_object_t obj) +{ + if (obj->flags & OBJ_ILOCKED) { + ++obj->lock.recursion; + return 1; + } + obj->flags |= OBJ_ILOCKED; + obj->lock.recursion = 1; + return 1; +} #ifdef KERNEL -vm_object_t vm_object_allocate __P((vm_size_t)); -void vm_object_cache_clear __P((void)); -void vm_object_cache_trim __P((void)); -boolean_t vm_object_coalesce __P((vm_object_t, vm_object_t, - vm_offset_t, vm_offset_t, vm_offset_t, vm_size_t)); -void vm_object_collapse __P((vm_object_t)); -void vm_object_copy __P((vm_object_t, vm_offset_t, vm_size_t, - vm_object_t *, vm_offset_t *, boolean_t *)); -void vm_object_deactivate_pages __P((vm_object_t)); -void vm_object_deallocate __P((vm_object_t)); -void vm_object_enter __P((vm_object_t, vm_pager_t)); -void vm_object_init __P((vm_size_t)); -vm_object_t vm_object_lookup __P((vm_pager_t)); -boolean_t vm_object_page_clean __P((vm_object_t, - vm_offset_t, vm_offset_t, boolean_t, boolean_t)); -void vm_object_page_remove __P((vm_object_t, - vm_offset_t, vm_offset_t)); -void vm_object_pmap_copy __P((vm_object_t, - vm_offset_t, vm_offset_t)); -void vm_object_pmap_remove __P((vm_object_t, - vm_offset_t, vm_offset_t)); -void vm_object_print __P((vm_object_t, boolean_t)); -void vm_object_reference __P((vm_object_t)); -void vm_object_remove __P((vm_pager_t)); -void vm_object_setpager __P((vm_object_t, - vm_pager_t, vm_offset_t, boolean_t)); -void vm_object_shadow __P((vm_object_t *, - vm_offset_t *, vm_size_t)); -void vm_object_terminate __P((vm_object_t)); +vm_object_t vm_object_allocate __P((vm_size_t)); +void vm_object_cache_clear __P((void)); +void vm_object_cache_trim __P((void)); +boolean_t vm_object_coalesce __P((vm_object_t, vm_object_t, vm_offset_t, vm_offset_t, vm_offset_t, vm_size_t)); +void vm_object_collapse __P((vm_object_t)); +void vm_object_copy __P((vm_object_t, vm_offset_t, vm_size_t, vm_object_t *, vm_offset_t *, boolean_t *)); +void vm_object_deactivate_pages __P((vm_object_t)); +void vm_object_deallocate __P((vm_object_t)); +void vm_object_enter __P((vm_object_t, vm_pager_t)); +void vm_object_init __P((vm_size_t)); +vm_object_t vm_object_lookup __P((vm_pager_t)); +boolean_t vm_object_page_clean __P((vm_object_t, vm_offset_t, vm_offset_t, boolean_t, boolean_t)); +void vm_object_page_remove __P((vm_object_t, vm_offset_t, vm_offset_t)); +void vm_object_pmap_copy __P((vm_object_t, vm_offset_t, vm_offset_t)); +void vm_object_pmap_remove __P((vm_object_t, vm_offset_t, vm_offset_t)); +void vm_object_print __P((vm_object_t, boolean_t)); +void vm_object_reference __P((vm_object_t)); +void vm_object_remove __P((vm_pager_t)); +void vm_object_setpager __P((vm_object_t, vm_pager_t, vm_offset_t, boolean_t)); +void vm_object_shadow __P((vm_object_t *, vm_offset_t *, vm_size_t)); +void vm_object_terminate __P((vm_object_t)); + #endif -#endif /* _VM_OBJECT_ */ +#endif /* _VM_OBJECT_ */ |