Changed object hash list to be a list rather than a tailq. This saves

space for the hash list buckets and is a little faster. The features
of tailq aren't needed. Increased the size of the object hash table
to improve performance. In the future, this will be changed so that
the table is sized dynamically.
This commit is contained in:
David Greenman 1995-05-02 05:57:11 +00:00
parent 0023507d9f
commit f325917a65
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=8216
2 changed files with 22 additions and 29 deletions

View File

@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
* $Id: vm_object.c,v 1.43 1995/04/16 12:56:19 davidg Exp $
* $Id: vm_object.c,v 1.44 1995/04/21 02:48:40 dyson Exp $
*/
/*
@ -119,9 +119,10 @@ struct vm_object kmem_object_store;
int vm_object_cache_max;
#define VM_OBJECT_HASH_COUNT 509
#define VM_OBJECT_HASH_COUNT 1021
struct vm_object_hash_head vm_object_hashtable[VM_OBJECT_HASH_COUNT];
#define OBJECT_HASH(pager) ((unsigned long)(pager) % VM_OBJECT_HASH_COUNT)
long object_collapses;
long object_bypasses;
@ -176,7 +177,7 @@ vm_object_init(vm_offset_t nothing)
vm_object_cache_max += (cnt.v_page_count - 1000) / 4;
for (i = 0; i < VM_OBJECT_HASH_COUNT; i++)
TAILQ_INIT(&vm_object_hashtable[i]);
LIST_INIT(&vm_object_hashtable[i]);
kernel_object = &kernel_object_store;
_vm_object_allocate(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS,
@ -1005,12 +1006,6 @@ vm_object_shadow(object, offset, length)
*object = result;
}
/*
* vm_object_hash hashes the pager/id pair.
*/
#define vm_object_hash(pager) \
(((unsigned)pager >> 5)%VM_OBJECT_HASH_COUNT)
/*
* vm_object_lookup looks in the object cache for an object with the
@ -1026,9 +1021,8 @@ vm_object_lookup(pager)
vm_object_cache_lock();
for (entry = vm_object_hashtable[vm_object_hash(pager)].tqh_first;
entry != NULL;
entry = entry->hash_links.tqe_next) {
for (entry = vm_object_hashtable[OBJECT_HASH(pager)].lh_first;
entry != NULL; entry = entry->hash_links.le_next) {
object = entry->object;
if (object->pager == pager) {
vm_object_lock(object);
@ -1071,13 +1065,13 @@ vm_object_enter(object, pager)
if (pager == NULL)
return;
bucket = &vm_object_hashtable[vm_object_hash(pager)];
bucket = &vm_object_hashtable[OBJECT_HASH(pager)];
entry = (vm_object_hash_entry_t)
malloc((u_long) sizeof *entry, M_VMOBJHASH, M_WAITOK);
entry->object = object;
vm_object_cache_lock();
TAILQ_INSERT_TAIL(bucket, entry, hash_links);
LIST_INSERT_HEAD(bucket, entry, hash_links);
vm_object_cache_unlock();
}
@ -1097,14 +1091,13 @@ vm_object_remove(pager)
register vm_object_hash_entry_t entry;
register vm_object_t object;
bucket = &vm_object_hashtable[vm_object_hash(pager)];
bucket = &vm_object_hashtable[OBJECT_HASH(pager)];
for (entry = bucket->tqh_first;
entry != NULL;
entry = entry->hash_links.tqe_next) {
for (entry = bucket->lh_first;
entry != NULL; entry = entry->hash_links.le_next) {
object = entry->object;
if (object->pager == pager) {
TAILQ_REMOVE(bucket, entry, hash_links);
LIST_REMOVE(entry, hash_links);
free((caddr_t) entry, M_VMOBJHASH);
break;
}
@ -1761,9 +1754,8 @@ vm_object_check() {
*/
for (i=0; i<VM_OBJECT_HASH_COUNT;i++) {
int lsize = 0;
for (entry = vm_object_hashtable[i].tqh_first;
entry != NULL;
entry = entry->hash_links.tqe_next) {
for (entry = vm_object_hashtable[i].lh_first;
entry != NULL; entry = entry->hash_links.le_next) {
if( entry->object->flags & OBJ_INTERNAL) {
printf("vmochk: internal obj on hash: size: %d\n", entry->object->size);
}
@ -1782,13 +1774,14 @@ vm_object_check() {
for (object = vm_object_list.tqh_first;
object != NULL;
object = object->object_list.tqe_next) {
if( object->flags & OBJ_INTERNAL) {
if( object->ref_count == 0) {
if (object->flags & OBJ_INTERNAL) {
if (object->ref_count == 0) {
printf("vmochk: internal obj has zero ref count: %d\n",
object->size);
}
if( !vm_object_in_map(object)) {
printf("vmochk: internal obj is not in a map: ref: %d, size: %d, pager: 0x%x, shadow: 0x%x\n", object->ref_count, object->size, object->pager, object->shadow);
if (!vm_object_in_map(object)) {
printf("vmochk: internal obj is not in a map: ref: %d, size: %d, pager: 0x%x, shadow: 0x%x\n",
object->ref_count, object->size, object->pager, object->shadow);
}
}
}

View File

@ -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.16 1995/03/22 12:24:11 davidg Exp $
* $Id: vm_object.h,v 1.17 1995/04/09 06:03:51 davidg Exp $
*/
/*
@ -115,10 +115,10 @@ struct vm_object {
#define OBJ_PIPWNT 0x0040 /* paging in progress wanted */
#define OBJ_WRITEABLE 0x0080 /* object has been made writeable */
TAILQ_HEAD(vm_object_hash_head, vm_object_hash_entry);
LIST_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 */
LIST_ENTRY(vm_object_hash_entry) hash_links; /* hash chain links */
vm_object_t object; /* object represened */
};