Merge branch 'master' of git+ssh://git.freedesktop.org/git/mesa/drm into drm-ttm...
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Wed, 23 Aug 2006 11:31:45 +0000 (13:31 +0200)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Wed, 23 Aug 2006 11:31:45 +0000 (13:31 +0200)
1  2 
linux-core/drm_bufs.c
linux-core/drm_hashtab.c

diff --combined linux-core/drm_bufs.c
@@@ -78,14 -78,16 +78,16 @@@ int drm_map_handle(drm_device_t *dev, d
  #error Unsupported long size. Neither 64 nor 32 bits.
  #endif
  
-       if (use_hashed_handle) {
-               return drm_ht_just_insert_please(&dev->map_hash, hash, 
-                                                user_token, 32 - PAGE_SHIFT - 3,
-                                                PAGE_SHIFT, DRM_MAP_HASH_OFFSET);
-       } else {
+       if (!use_hashed_handle) {
+               int ret;
                hash->key = user_token;
-               return drm_ht_insert_item(&dev->map_hash, hash);
+               ret = drm_ht_insert_item(&dev->map_hash, hash);
+               if (!ret) 
+                       return 0;
        }
+       return drm_ht_just_insert_please(&dev->map_hash, hash, 
+                                        user_token, 32 - PAGE_SHIFT - 3,
+                                        PAGE_SHIFT, DRM_MAP_HASH_OFFSET);
  }
  
  /**
@@@ -420,8 -422,6 +422,8 @@@ int drm_rmmap_locked(drm_device_t *dev
                dmah.size = map->size;
                __drm_pci_free(dev, &dmah);
                break;
 +      case _DRM_TTM:
 +              BUG_ON(1);
        }
        drm_free(map, sizeof(*map), DRM_MEM_MAPS);
  
diff --combined linux-core/drm_hashtab.c
@@@ -43,16 -43,7 +43,16 @@@ int drm_ht_create(drm_open_hash_t *ht, 
        ht->size = 1 << order;
        ht->order = order;
        ht->fill = 0;
 -      ht->table = vmalloc(ht->size*sizeof(*ht->table));
 +      ht->table = NULL;
 +      ht->use_vmalloc = ((ht->size * sizeof(*ht->table)) > 4*PAGE_SIZE);
 +      if (!ht->use_vmalloc) {
 +              ht->table = drm_calloc(ht->size, sizeof(*ht->table), 
 +                                     DRM_MEM_HASHTAB);
 +      } 
 +      if (!ht->table) {
 +              ht->use_vmalloc = 1;
 +              ht->table = vmalloc(ht->size*sizeof(*ht->table));       
 +      } 
        if (!ht->table) {
                DRM_ERROR("Out of memory for hash table\n");
                return -ENOMEM;
@@@ -115,7 -106,7 +115,7 @@@ int drm_ht_insert_item(drm_open_hash_t 
        hlist_for_each(list, h_list) {
                entry = hlist_entry(list, drm_hash_item_t, head);
                if (entry->key == key)
-                       return -1;
+                       return -EINVAL;
                if (entry->key > key)
                        break;
                parent = list;
@@@ -163,7 -154,7 +163,7 @@@ int drm_ht_find_item(drm_open_hash_t *h
  
        list = drm_ht_find_key(ht, key);
        if (!list)
-               return -1;
+               return -EINVAL;
  
        *item = hlist_entry(list, drm_hash_item_t, head);
        return 0;
@@@ -179,7 -170,7 +179,7 @@@ int drm_ht_remove_key(drm_open_hash_t *
                ht->fill--;
                return 0;
        }
-       return -1;
+       return -EINVAL;
  }
  
  int drm_ht_remove_item(drm_open_hash_t *ht, drm_hash_item_t *item)
  void drm_ht_remove(drm_open_hash_t *ht)
  {
        if (ht->table) {
 -              vfree(ht->table);
 +              if (ht->use_vmalloc) 
 +                      vfree(ht->table);
 +              else
 +                      drm_free(ht->table, ht->size*sizeof(*ht->table), 
 +                               DRM_MEM_HASHTAB);
                ht->table = NULL;
        }
  }