drm/ttm: Print debug information on memory manager when eviction fails
authorJerome Glisse <jglisse@redhat.com>
Wed, 9 Dec 2009 20:55:10 +0000 (21:55 +0100)
committerDave Airlie <airlied@redhat.com>
Thu, 10 Dec 2009 05:28:13 +0000 (15:28 +1000)
This add helper function to print information on eviction placements
and memory manager status when eviction fails to allocate memory
space.

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/ttm/ttm_bo.c

index cf88347..a835b6f 100644 (file)
@@ -59,6 +59,60 @@ static struct attribute ttm_bo_count = {
        .mode = S_IRUGO
 };
 
+static inline int ttm_mem_type_from_flags(uint32_t flags, uint32_t *mem_type)
+{
+       int i;
+
+       for (i = 0; i <= TTM_PL_PRIV5; i++)
+               if (flags & (1 << i)) {
+                       *mem_type = i;
+                       return 0;
+               }
+       return -EINVAL;
+}
+
+static void ttm_mem_type_manager_debug(struct ttm_bo_global *glob,
+                                       struct ttm_mem_type_manager *man)
+{
+       printk(KERN_ERR TTM_PFX "    has_type: %d\n", man->has_type);
+       printk(KERN_ERR TTM_PFX "    use_type: %d\n", man->use_type);
+       printk(KERN_ERR TTM_PFX "    flags: 0x%08X\n", man->flags);
+       printk(KERN_ERR TTM_PFX "    gpu_offset: 0x%08lX\n", man->gpu_offset);
+       printk(KERN_ERR TTM_PFX "    io_offset: 0x%08lX\n", man->io_offset);
+       printk(KERN_ERR TTM_PFX "    io_size: %ld\n", man->io_size);
+       printk(KERN_ERR TTM_PFX "    size: %ld\n", (unsigned long)man->size);
+       printk(KERN_ERR TTM_PFX "    available_caching: 0x%08X\n",
+               man->available_caching);
+       printk(KERN_ERR TTM_PFX "    default_caching: 0x%08X\n",
+               man->default_caching);
+       spin_lock(&glob->lru_lock);
+       drm_mm_debug_table(&man->manager, TTM_PFX);
+       spin_unlock(&glob->lru_lock);
+}
+
+static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo,
+                                       struct ttm_placement *placement)
+{
+       struct ttm_bo_device *bdev = bo->bdev;
+       struct ttm_bo_global *glob = bo->glob;
+       struct ttm_mem_type_manager *man;
+       int i, ret, mem_type;
+
+       printk(KERN_ERR TTM_PFX "No space for %p (%ld pages, %ldK, %ldM)\n",
+               bo, bo->mem.num_pages, bo->mem.size >> 10,
+               bo->mem.size >> 20);
+       for (i = 0; i < placement->num_placement; i++) {
+               ret = ttm_mem_type_from_flags(placement->placement[i],
+                                               &mem_type);
+               if (ret)
+                       return;
+               man = &bdev->man[mem_type];
+               printk(KERN_ERR TTM_PFX "  placement[%d]=0x%08X (%d)\n",
+                       i, placement->placement[i], mem_type);
+               ttm_mem_type_manager_debug(glob, man);
+       }
+}
+
 static ssize_t ttm_bo_global_show(struct kobject *kobj,
                                  struct attribute *attr,
                                  char *buffer)
@@ -592,10 +646,12 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
        ret = ttm_bo_mem_space(bo, &placement, &evict_mem, interruptible,
                                no_wait);
        if (ret) {
-               if (ret != -ERESTARTSYS)
+               if (ret != -ERESTARTSYS) {
                        printk(KERN_ERR TTM_PFX
                               "Failed to find memory space for "
                               "buffer 0x%p eviction.\n", bo);
+                       ttm_bo_mem_space_debug(bo, &placement);
+               }
                goto out;
        }
 
@@ -768,18 +824,6 @@ static bool ttm_bo_mt_compatible(struct ttm_mem_type_manager *man,
        return true;
 }
 
-static inline int ttm_mem_type_from_flags(uint32_t flags, uint32_t *mem_type)
-{
-       int i;
-
-       for (i = 0; i <= TTM_PL_PRIV5; i++)
-               if (flags & (1 << i)) {
-                       *mem_type = i;
-                       return 0;
-               }
-       return -EINVAL;
-}
-
 /**
  * Creates space for memory region @mem according to its type.
  *