OSDN Git Service

Merge commit 'origin/drm-gem' into modesetting-gem
[android-x86/external-libdrm.git] / linux-core / drm_proc.c
index 2ccf6d9..690e081 100644 (file)
@@ -51,6 +51,10 @@ static int drm_bufs_info(char *buf, char **start, off_t offset,
                         int request, int *eof, void *data);
 static int drm_objects_info(char *buf, char **start, off_t offset,
                         int request, int *eof, void *data);
+static int drm_gem_name_info(char *buf, char **start, off_t offset,
+                            int request, int *eof, void *data);
+static int drm_gem_object_info(char *buf, char **start, off_t offset,
+                              int request, int *eof, void *data);
 #if DRM_DEBUG_CODE
 static int drm_vma_info(char *buf, char **start, off_t offset,
                        int request, int *eof, void *data);
@@ -70,6 +74,8 @@ static struct drm_proc_list {
        {"queues", drm_queues_info},
        {"bufs", drm_bufs_info},
        {"objects", drm_objects_info},
+       {"gem_names", drm_gem_name_info},
+       {"gem_objects", drm_gem_object_info},
 #if DRM_DEBUG_CODE
        {"vma", drm_vma_info},
 #endif
@@ -175,6 +181,9 @@ static int drm_name_info(char *buf, char **start, off_t offset, int request,
                return 0;
        }
 
+       if (!master)
+               return 0;
+
        *start = &buf[offset];
        *eof = 0;
 
@@ -210,7 +219,6 @@ static int drm__vm_info(char *buf, char **start, off_t offset, int request,
                        int *eof, void *data)
 {
        struct drm_minor *minor = (struct drm_minor *) data; 
-       struct drm_master *master = minor->master;
        struct drm_device *dev = minor->dev;
        int len = 0;
        struct drm_map *map;
@@ -269,7 +277,6 @@ static int drm_vm_info(char *buf, char **start, off_t offset, int request,
                       int *eof, void *data)
 {
        struct drm_minor *minor = (struct drm_minor *) data; 
-       struct drm_master *master = minor->master;
        struct drm_device *dev = minor->dev;
        int ret;
 
@@ -448,9 +455,10 @@ static int drm__objects_info(char *buf, char **start, off_t offset, int request,
        struct drm_buffer_manager *bm = &dev->bm;
        struct drm_fence_manager *fm = &dev->fm;
        uint64_t used_mem;
+       uint64_t used_emer;
        uint64_t low_mem;
        uint64_t high_mem;
-
+       uint64_t emer_mem;
 
        if (offset > DRM_PROC_LIMIT) {
                *eof = 1;
@@ -479,7 +487,7 @@ static int drm__objects_info(char *buf, char **start, off_t offset, int request,
                DRM_PROC_PRINT("Buffer objects are not supported by this driver.\n");
        }
 
-       drm_query_memctl(&used_mem, &low_mem, &high_mem);
+       drm_query_memctl(&used_mem, &used_emer, &low_mem, &high_mem, &emer_mem);
 
        if (used_mem > 16*PAGE_SIZE) {
                DRM_PROC_PRINT("Used object memory is %lu pages.\n",
@@ -488,10 +496,19 @@ static int drm__objects_info(char *buf, char **start, off_t offset, int request,
                DRM_PROC_PRINT("Used object memory is %lu bytes.\n",
                               (unsigned long) used_mem);
        }
+       if (used_emer > 16*PAGE_SIZE) {
+               DRM_PROC_PRINT("Used emergency memory is %lu pages.\n",
+                              (unsigned long) (used_emer >> PAGE_SHIFT));
+       } else {
+               DRM_PROC_PRINT("Used emergency memory is %lu bytes.\n\n",
+                              (unsigned long) used_emer);
+       }
        DRM_PROC_PRINT("Soft object memory usage threshold is %lu pages.\n",
                       (unsigned long) (low_mem >> PAGE_SHIFT));
        DRM_PROC_PRINT("Hard object memory usage threshold is %lu pages.\n",
                       (unsigned long) (high_mem >> PAGE_SHIFT));
+       DRM_PROC_PRINT("Emergency root only memory usage threshold is %lu pages.\n",
+                      (unsigned long) (emer_mem >> PAGE_SHIFT));
 
        DRM_PROC_PRINT("\n");
 
@@ -575,6 +592,79 @@ static int drm_clients_info(char *buf, char **start, off_t offset,
        return ret;
 }
 
+struct drm_gem_name_info_data {
+       int                     len;
+       char                    *buf;
+       int                     eof;
+};
+
+static int drm_gem_one_name_info (int id, void *ptr, void *data)
+{
+       struct drm_gem_object *obj = ptr;
+       struct drm_gem_name_info_data   *nid = data;
+
+       DRM_INFO ("name %d size %d\n", obj->name, obj->size);
+       if (nid->eof)
+               return 0;
+       
+       nid->len += sprintf (&nid->buf[nid->len],
+                            "%6d%9d%8d%9d\n",
+                            obj->name, obj->size,
+                            atomic_read(&obj->handlecount.refcount),
+                            atomic_read(&obj->refcount.refcount));
+       if (nid->len > DRM_PROC_LIMIT) {
+               nid->eof = 1;
+               return 0;
+       }
+       return 0;
+}
+
+static int drm_gem_name_info(char *buf, char **start, off_t offset,
+                            int request, int *eof, void *data)
+{
+       struct drm_minor *minor = (struct drm_minor *) data; 
+       struct drm_device *dev = minor->dev;
+       struct drm_gem_name_info_data nid;
+       
+       if (offset > DRM_PROC_LIMIT) {
+               *eof = 1;
+               return 0;
+       }
+
+       nid.len = sprintf (buf, "  name     size handles refcount\n");
+       nid.buf = buf;
+       nid.eof = 0;
+       idr_for_each (&dev->object_name_idr, drm_gem_one_name_info, &nid);
+       
+       *start = &buf[offset];
+       *eof = 0;
+       if (nid.len > request + offset)
+               return request;
+       *eof = 1;
+       return nid.len - offset;
+}
+
+static int drm_gem_object_info(char *buf, char **start, off_t offset,
+                              int request, int *eof, void *data)
+{
+       struct drm_minor *minor = (struct drm_minor *) data; 
+       struct drm_device *dev = minor->dev;
+       int len = 0;
+       
+       if (offset > DRM_PROC_LIMIT) {
+               *eof = 1;
+               return 0;
+       }
+
+       *start = &buf[offset];
+       *eof = 0;
+       DRM_PROC_PRINT ("%d objects\n", atomic_read (&dev->object_count));
+       if (len > request + offset)
+               return request;
+       *eof = 1;
+       return len - offset;
+}
+
 #if DRM_DEBUG_CODE
 
 static int drm__vma_info(char *buf, char **start, off_t offset, int request,