summaryrefslogtreecommitdiff
path: root/linux-core/drm_hashtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux-core/drm_hashtab.c')
-rw-r--r--linux-core/drm_hashtab.c95
1 files changed, 49 insertions, 46 deletions
diff --git a/linux-core/drm_hashtab.c b/linux-core/drm_hashtab.c
index 8fd6a348..3be781df 100644
--- a/linux-core/drm_hashtab.c
+++ b/linux-core/drm_hashtab.c
@@ -1,6 +1,6 @@
/**************************************************************************
*
- * Copyright 2006 Tungsten Graphics, Inc., Steamboat Springs, CO. USA.
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
@@ -50,7 +50,7 @@ drm_ht_create(drm_open_hash_t *ht, unsigned int order)
return -ENOMEM;
}
for (i=0; i< ht->size; ++i) {
- INIT_LIST_HEAD(&ht->table[i]);
+ INIT_HLIST_HEAD(&ht->table[i]);
}
return 0;
}
@@ -59,59 +59,65 @@ void
drm_ht_verbose_list(drm_open_hash_t *ht, unsigned long key)
{
drm_hash_item_t *entry;
- struct list_head *list, *h_list;
+ struct hlist_head *h_list;
+ struct hlist_node *list;
unsigned int hashed_key;
int count = 0;
hashed_key = hash_long(key, ht->order);
DRM_DEBUG("Key is 0x%08lx, Hashed key is 0x%08x\n", key, hashed_key);
h_list = &ht->table[hashed_key];
- list_for_each(list, h_list) {
- entry = list_entry(list, drm_hash_item_t, head);
+ hlist_for_each(list, h_list) {
+ entry = hlist_entry(list, drm_hash_item_t, head);
DRM_DEBUG("count %d, key: 0x%08lx\n", count++, entry->key);
}
}
-
-static struct list_head
-*drm_ht_find_key(drm_open_hash_t *ht, unsigned long key, int *found)
+static struct hlist_node
+*drm_ht_find_key(drm_open_hash_t *ht, unsigned long key)
{
drm_hash_item_t *entry;
- struct list_head *list, *h_list, *ret;
+ struct hlist_head *h_list;
+ struct hlist_node *list;
unsigned int hashed_key;
hashed_key = hash_long(key, ht->order);
-
- *found = FALSE;
h_list = &ht->table[hashed_key];
- ret = h_list;
- list_for_each(list, h_list) {
- entry = list_entry(list, drm_hash_item_t, head);
- if (entry->key == key) {
- ret = list;
- *found = TRUE;
- break;
- }
- if (entry->key > key) {
- ret = list;
+ hlist_for_each(list, h_list) {
+ entry = hlist_entry(list, drm_hash_item_t, head);
+ if (entry->key == key)
+ return list;
+ if (entry->key > key)
break;
- }
}
- return ret;
+ return NULL;
}
+
int
drm_ht_insert_item(drm_open_hash_t *ht, drm_hash_item_t *item)
{
- int found;
- struct list_head *list;
-
- list = drm_ht_find_key(ht, item->key, &found);
- if (found) {
- return -EINVAL;
+ drm_hash_item_t *entry;
+ struct hlist_head *h_list;
+ struct hlist_node *list, *parent;
+ unsigned int hashed_key;
+ unsigned long key = item->key;
+
+ hashed_key = hash_long(key, ht->order);
+ h_list = &ht->table[hashed_key];
+ parent = NULL;
+ hlist_for_each(list, h_list) {
+ entry = hlist_entry(list, drm_hash_item_t, head);
+ if (entry->key == key)
+ return -1;
+ if (entry->key > key)
+ break;
+ parent = list;
+ }
+ if (parent) {
+ hlist_add_after(parent, &item->head);
} else {
- list_add_tail(&item->head, list);
- ht->fill++;
+ hlist_add_head(&item->head, h_list);
}
return 0;
}
@@ -133,7 +139,7 @@ drm_ht_just_insert_please(drm_open_hash_t *ht, drm_hash_item_t *item,
do{
ret = drm_ht_insert_item(ht, item);
if (ret)
- item->key = (item->key + 1) & mask;
+ item->key = (item->key + 1) & mask;
} while(ret && (item->key != first));
if (ret) {
@@ -146,27 +152,24 @@ drm_ht_just_insert_please(drm_open_hash_t *ht, drm_hash_item_t *item,
int
drm_ht_find_item(drm_open_hash_t *ht, unsigned long key, drm_hash_item_t **item)
{
- int found;
- struct list_head *list;
+ struct hlist_node *list;
- list = drm_ht_find_key(ht, key, &found);
- if (!found) {
+ list = drm_ht_find_key(ht, key);
+ if (!list)
return -1;
- } else {
- *item = list_entry(list, drm_hash_item_t, head);
- return 0;
- }
+
+ *item = hlist_entry(list, drm_hash_item_t, head);
+ return 0;
}
int
drm_ht_remove_key(drm_open_hash_t *ht, unsigned long key)
{
- int found;
- struct list_head *list;
+ struct hlist_node *list;
- list = drm_ht_find_key(ht, key, &found);
- if (found) {
- list_del_init(list);
+ list = drm_ht_find_key(ht, key);
+ if (list) {
+ hlist_del_init(list);
ht->fill--;
return 0;
}
@@ -176,7 +179,7 @@ drm_ht_remove_key(drm_open_hash_t *ht, unsigned long key)
int
drm_ht_remove_item(drm_open_hash_t *ht, drm_hash_item_t *item)
{
- list_del_init(&item->head);
+ hlist_del_init(&item->head);
ht->fill--;
return 0;
}