diff -ur linux-2.6.38-rc2-bak/drivers/gpu/drm/drm_gem.c linux-2.6.38-rc2/drivers/gpu/drm/drm_gem.c --- linux-2.6.38-rc2-bak/drivers/gpu/drm/drm_gem.c 2011-01-26 11:04:48.000000000 -0500 +++ linux-2.6.38-rc2/drivers/gpu/drm/drm_gem.c 2011-02-01 10:35:22.000000000 -0500 @@ -101,7 +101,8 @@ dev->mm_private = mm; - if (drm_ht_create(&mm->offset_hash, 19)) { +/* if (drm_ht_create(&mm->offset_hash, 19)) {*/ + if (drm_ht_create(&mm->offset_hash, 9)) { kfree(mm); return -ENOMEM; } diff -ur linux-2.6.38-rc2-bak/drivers/gpu/drm/drm_hashtab.c linux-2.6.38-rc2/drivers/gpu/drm/drm_hashtab.c --- linux-2.6.38-rc2-bak/drivers/gpu/drm/drm_hashtab.c 2011-01-26 11:04:48.000000000 -0500 +++ linux-2.6.38-rc2/drivers/gpu/drm/drm_hashtab.c 2011-02-01 10:36:06.000000000 -0500 @@ -73,11 +73,13 @@ 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); + DRM_INFO("Key is 0x%08lx, Hashed key is 0x%08x\n", key, hashed_key); h_list = &ht->table[hashed_key]; hlist_for_each(list, h_list) { entry = hlist_entry(list, struct drm_hash_item, head); - DRM_DEBUG("count %d, key: 0x%08lx\n", count++, entry->key); + DRM_INFO("count %d, key: 0x%08lx list: 0x%p list->next: 0x%p\n", count++, entry->key, list, list->next); + WARN_ON(count >= 16); + if (count >= 16) break; } } @@ -110,6 +112,9 @@ unsigned int hashed_key; unsigned long key = item->key; + DRM_INFO("drm_ht_insert_item: before insert, fill=%u\n", ht->fill); + drm_ht_verbose_list(ht, key); + hashed_key = hash_long(key, ht->order); h_list = &ht->table[hashed_key]; parent = NULL; @@ -126,6 +131,10 @@ } else { hlist_add_head(&item->head, h_list); } + + DRM_INFO("drm_ht_insert_item: after insert, fill=%u\n", ht->fill); + drm_ht_verbose_list(ht, key); + return 0; } EXPORT_SYMBOL(drm_ht_insert_item); @@ -177,10 +186,16 @@ { struct hlist_node *list; + DRM_INFO("drm_ht_remove_key: before remove, fill=%u\n", ht->fill); + drm_ht_verbose_list(ht, key); + list = drm_ht_find_key(ht, key); if (list) { hlist_del_init(list); ht->fill--; + + DRM_INFO("drm_ht_remove_key: after remove, fill=%u\n", ht->fill); + drm_ht_verbose_list(ht, key); return 0; } return -EINVAL; @@ -188,8 +203,17 @@ int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item) { + unsigned long key = item->key; + + DRM_INFO("drm_ht_remove_item: before remove, fill=%u\n", ht->fill); + drm_ht_verbose_list(ht, key); + hlist_del_init(&item->head); ht->fill--; + + DRM_INFO("drm_ht_remove_item: after remove, fill=%u\n", ht->fill); + drm_ht_verbose_list(ht, key); + return 0; } EXPORT_SYMBOL(drm_ht_remove_item);